如何检测 bitbake 中本地文件的变化?

How to detect changes in local files in bitbake?

假设我有一个只添加一个脚本文件的简单食谱:

LICENSE = "CLOSED"
SRC_URI += "file://test.sh"
S = "${WORKDIR}"

do_install () {
    mkdir -p ${D}/usr/bin
    cp -r test.sh ${D}/usr/bin
}

如果我修改 test.sh 并重新 运行 bitbake,它什么都不做,因为它没有意识到任何改变。有什么方法可以让食谱检查 SRC_URI 文件是否有变化?如果发现更改,则重新编译。 SRC_URI本地文件不支持[md5sum]。


编辑:由于我的测试设置有些不切实际,我最初的问题有点缺陷。但它确实在 bitbake 中展示了一个有趣的特性。

我在 test.sh 的两个版本之间切换,我只添加或删除了一个字符。事情是这样的:

  1. 运行 bitbake -> 测试配方已编译
  2. 通过添加一个字符编辑 test.sh
  3. 运行 bitbake -> 测试配方已编译
  4. 通过删除字符
  5. 编辑test.sh
  6. 运行 bitbake -> 测试配方未编译
  7. 通过添加与之前相同的字符编辑 test.sh
  8. 运行 bitbake -> 测试配方未编译

因此,如果 test.sh 更改为以前的版本,bitbake 不会注意到更改。一定有某种奇怪的缓存在某处进行。这意味着我最初使用的配方有效,但前提是对 test.sh 的更改是新的、实际的更改,而不是我用来测试配方的人为更改。

如前所述,更适合将配方置于版本控制之下,这样新的提交将导致状态更改,因此 SRCREV 将被更改并触发新的 fetch/compile/install

我刚刚尝试了您的食谱并将其添加到我的 core-image-minimal 图像中,我没有发现检测 test.sh 脚本中的更改有任何问题。这是我正在使用的稍微修改过的食谱。

LICENSE = "CLOSED"
SRC_URI += "file://test.sh"
S = "${WORKDIR}"

PR = "0"

do_install () {
    install -d ${D}/usr/bin
    install -m 0644 test.sh ${D}/usr/bin
}

在现有图层中将其另存为 test.bb。将此食谱添加到您的图像食谱中:

IMAGE_INSTALL += "test"

然后对图像进行 bitbake。我使用了最小的基础图像。

bitbake core-image-minimal.

编辑test.sh 并重新运行 之前的bitbake。您应该会看到 bitbake 将您的新脚本安装到位于 tmp/deploy/images/<your_target>/core-iamge-minimal.tar.xz

的映像中

如果失败,那么您可以随时手动修改食谱中的 PR 值。


看到您的编辑后:

So if test.sh changes to a previous version, bitbake does not notice the change. There must be some sort of weird caching going on somewhere.

bitbake 缓存所有输入,以便可以从共享状态缓存中快速提取脚本的不同迭代。您应该会在 tmp 文件夹中看到一个标记为 sstate-cache 的文件夹。这是您之前编译的脚本所在的位置。简而言之 - 这是预期的行为,一切都很好。