【问题标题】:Buildroot - Github package re-extracted at every buildBuildroot - 在每次构建时重新提取 Github 包
【发布时间】:2019-06-05 11:10:33
【问题描述】:

我目前正在尝试从 github 集成一个包,该包在用户空间中实现 MTP 响应程序。

我正在使用 buildroot 2017.08。

我创建了Config.inumtprd.mk 两个文件,内容如下。

我还修补了源,以便将某些字段的值替换到包中提供的配置文件中。


Config.in

$ cat Config.in
config BR2_PACKAGE_UMTPRD
    bool "umtprd"
    help
      umtprd is a deamon, checking USB connection and start MTP communication.

      https://github.com/viveris/uMTP-Responder

if BR2_PACKAGE_UMTPRD
config BR2_PACKAGE_UMTPRD_TAG
    string "git version of umtprd package"
    default "master"
    help
      Must be the name of the branch/tag :
      https://github.com/viveris/uMTP-Responder

endif #BR2_PACKAGE_UMTPRD

umtprd.mk

$ cat umtprd.mk
UMTPRD_VERSION = $(BR2_PACKAGE_UMTPRD_TAG)
UMTPRD_SITE_METHOD = git
UMTPRD_SITE = https://github.com/viveris/uMTP-Responder

define UMTPRD_BUILD_CMDS
    $(MAKE) CFLAGS="-DUSE_SYSLOG" CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D)
endef

define UMTPRD_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 0755 $(@D)/umtprd $(TARGET_DIR)/usr/bin
    $(INSTALL) -D -m 0755 $(@D)/conf/umtprd*.sh $(TARGET_DIR)/usr/bin
    $(INSTALL) -D -m 0755 $(@D)/conf/S98uMTPrd $(TARGET_DIR)/etc/init.d
    mkdir -p $(TARGET_DIR)/etc/umtprd
    $(INSTALL) -D -m 0644 $(@D)/conf/umtprd.conf $(TARGET_DIR)/etc/umtprd/
endef

$(eval $(generic-package))

补丁

$ cat 0001-configuration.patch 
diff -Naur a/conf/umtprd.conf b/conf/umtprd.conf
--- a/conf/umtprd.conf  2018-12-22 14:58:25.000000000 +0100
+++ b/conf/umtprd.conf  2019-01-10 10:31:06.069769073 +0100
@@ -11,8 +11,7 @@
 #storage command : Create add a storage entry point. Up to 16 entry points supported
 #Syntax : storage "PATH" "NAME"

-storage "/"      "root folder"
-storage "/home"  "home folder"
+storage "<path>" "<name>"

 # Set the USB manufacturer string

@@ -20,11 +19,11 @@

 # Set the USB Product string

-product "The Viveris Product !"
+product "<product_string>"

 # Set the USB Serial number string

-serial "01234567"
+serial "<serial>"

 # Set the USB interface string. Should be always "MTP"

首次构建

当我第一次执行make时,成功下载、解压、打补丁、构建和安装包。

$ make
>>> umtprd umtprd-0.9.7 Downloading
[...]
warning: refname 'umtprd-0.9.7' is ambiguous.
WARNING: no hash file for umtprd-umtprd-0.9.7.tar.gz
>>> umtprd umtprd-0.9.7 Extracting
[...]
>>> umtprd umtprd-0.9.7 Patching

Applying 0001-configuration.patch using patch: 
patching file conf/umtprd.conf
>>> umtprd umtprd-0.9.7 Configuring
>>> umtprd umtprd-0.9.7 Building
[...]
>>> umtprd umtprd-0.9.7 Installing to target
[...]
>>>   Finalizing target directory
[...]
>>>   Sanitizing RPATH in target tree
[...]
>>>   Copying overlay <path_to_overlay>
>>>   Executing post-build script <post_build_script>
>>>   Generating root filesystem image rootfs.tar
[...]
>>>   Executing post-image script <post_image_script>

后期构建

但是,如果我再次运行 make 而不删除文件夹 output/build/umtprd-umtprd-0.9.7 buildroot 会尝试再次提取和修补源代码。

这种情况下补丁明显失效了,编译过程就停止了,图像也没有生成。

$ make
WARNING: no hash file for umtprd-umtprd-0.9.7.tar.gz
>>> umtprd umtprd-0.9.7 Extracting
[...]
>>> umtprd umtprd-0.9.7 Patching

Applying 0001-configuration.patch using patch: 
Error: duplicate filename '0001-configuration.patch'
Conflicting files are:
  already applied: <path_to_patch>/0001-configuration.patch
  to be applied  : <path_to_patch>/0001-configuration.patch
package/pkg-generic.mk:191 : la recette pour la cible « <path_to_buildroot>/output/build/umtprd-"umtprd-0.9.7"/.stamp_patched » a échouée
make: *** [<path_to_buildroot>/output/build/umtprd-"umtprd-0.9.7"/.stamp_patched] Erreur 1

我检查了构建目录,所有 .stamp 文件似乎都在那里,所以我不明白为什么 buildroot 重新提取、重新修补和重新构建包,因为配置和源没有改变。

$ ls -la output/build/umtprd-umtprd-0.9.7/.stamp_*
-rw-r--r-- 1 <user> <user> 0 janv. 10 14:58 output/build/umtprd-umtprd-0.9.7/.stamp_built
-rw-r--r-- 1 <user> <user> 0 janv. 10 14:58 output/build/umtprd-umtprd-0.9.7/.stamp_configured
-rw-r--r-- 1 <user> <user> 0 janv. 10 15:05 output/build/umtprd-umtprd-0.9.7/.stamp_downloaded
-rw-r--r-- 1 <user> <user> 0 janv. 10 15:05 output/build/umtprd-umtprd-0.9.7/.stamp_extracted
-rw-r--r-- 1 <user> <user> 0 janv. 10 14:58 output/build/umtprd-umtprd-0.9.7/.stamp_patched
-rw-r--r-- 1 <user> <user> 0 janv. 10 14:58 output/build/umtprd-umtprd-0.9.7/.stamp_target_installed

这个问题可以通过删除构建文件夹output/build/umtprd-umtprd-0.9.7来解决,但我不应该这样做,因此我想了解为什么buildroot会重新提取和重新修补源代码。

我做错了什么?

【问题讨论】:

    标签: linux github package patch buildroot


    【解决方案1】:

    您应该更改以下内容:

    UMTPRD_VERSION = $(call qstrip,$(BR2_PACKAGE_UMTPRD_TAG))
    

    Kconfig 变量BR2_PACKAGE_UMTPRD_TAG 包含引号,其值为例如"master" 包括引号。对于make,引号没什么特别的。所以在依赖链中,它会寻找一个戳文件output/build/umtprd-"master"/.stamp_extracted。但是,当创建标记文件时,它会通过删除引号的外壳程序,因此创建的实际文件是output/build/umtprd-master。因此,make 认为邮票文件还不存在。

    请注意,重复的不仅是提取,还有下载。但是,在下载步骤中有一个额外的检查,如果要下载的文件已经存在,则跳过下载。

    【讨论】:

      【解决方案2】:

      我发现使用 tarball 存档可以避免再次提取和修补软件包。

      希望标签可以作为 tarball 发布到这个 github 存储库中。

      这是我用来实现它的.mk

      $ cat umtprd.mk
      ################################################################################
      #
      # umtprd deamon for Davey Bickford board Base.
      #
      ################################################################################
      UMTPRD_SOURCE = $(BR2_PACKAGE_UMTPRD_TAG).tar.gz
      UMTPRD_SITE = https://github.com/viveris/uMTP-Responder/archive
      
      define UMTPRD_BUILD_CMDS
          $(MAKE) CFLAGS="-DUSE_SYSLOG" CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D)
      endef
      
      define UMTPRD_INSTALL_TARGET_CMDS
          $(INSTALL) -D -m 0755 $(@D)/umtprd $(TARGET_DIR)/usr/bin
          $(INSTALL) -D -m 0755 $(@D)/conf/umtprd*.sh $(TARGET_DIR)/usr/bin
          $(INSTALL) -D -m 0755 $(@D)/conf/S98uMTPrd $(TARGET_DIR)/etc/init.d
          mkdir -p $(TARGET_DIR)/etc/umtprd
          $(INSTALL) -D -m 0644 $(@D)/conf/umtprd.conf $(TARGET_DIR)/etc/umtprd/
      endef
      
      $(eval $(generic-package))
      

      我认为问题来自命名约定,因为以下结果似乎显示了

      • 从存档下载 ==> WORKS

      拥有dl/umtprd-0.9.7.tar.gzoutput/build/umtprd

      • 从标签下载 ==> 不起作用

      拥有dl/umtprd-umtprd-0.9.7.tar.gzoutput/build/umtprd-umtprd-0.9.7

      【讨论】:

        【解决方案3】:

        您似乎没有做错任何事情,但实际上,Buildroot 不应该重新提取和重新修补此软件包。所以在你的两个“make”调用之间一定有什么事情导致了这种情况的发生。

        您能否提供以下命令序列的完整日志(未修改):

        make
        ls -la output/build/umtprd-umtprd-0.9.7/.stamp_*
        make
        

        谢谢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多