如何在Buildroot中只清理目标文件

17

我弄乱了目标文件系统中的一些文件,因此我想重新组装它。 但不是重建全部。

make clean 只会删除所有输出和构建目录。 应使用哪个命令递归地删除仅目标目录和所有相关的 .stamp_some_step 文件,强制 buildroot 根据当前配置重新组装文件系统,而不是一遍又一遍地重建所有库和二进制文件?


请查看我的示例:https://github.com/howhow/makefile - How Chen
您可以删除相关文件,只需构建更新的库并重新链接即可,无需重新构建所有内容。 - How Chen
陈先生,我如何确定什么是相关的,为什么构建根目录不能做到这一点?我的意思是,它是否可以根据其默认脚本在目标中清除二进制文件并从构建重新安装到目标,而不删除构建文件夹而只删除目标文件夹? - xakepp35
我认为make clean只是一个名为clean的伪目标,你需要检查在clean目标下,makefile是如何实现它的。如果你想要集成文件系统镜像,那么你首先需要有一个文件系统镜像。然后或许你需要检查一下你的makefile,看它是如何将文件系统镜像组装到整个镜像中的,然后你只需重复那一步。 - How Chen
陈先生,makefile 中只有 rm -rf 命令用于清除 /output/ 目录下的所有数据,包括目标文件和构建文件等。因此,如果您只想清除目标文件夹及其相关的标记,是否需要自己重新实现一个新的“cleantarget”目标呢?:( - xakepp35
我认为是这样的,就我所理解的而言,但你也可以编写一个脚本,无需修改makefile本身。 - How Chen
2个回答

30

Buildroot会在每个软件包的构建目录中使用.stamp_xxx跟踪构建进度。实际上,target install是每个软件包的最后一个阶段。因此,从每个软件包构建目录中删除.stamp_target_installed文件会导致重新安装到目标中。

在最新的Buildroot中,您可以简单地执行以下操作:

rm -rf output/target
find output/ -name ".stamp_target_installed" -delete
rm -f output/build/host-gcc-final-*/.stamp_host_installed

在一些较旧的buildroot版本中,输出目录中还有其他几个文件跟踪骨架的创建。引用邮件列表消息,我们可以总结如下:

“rm -rf output/target && make”命令有效吗?

正如Thomas所说,它是无效的。但是,一些非官方的hack存在:

  • 删除build/.root将强制重新安装骨架
  • 删除build/*/.stamp_target_installed强制重新安装每个目标软件包
  • 根据您的工具链,您可以通过删除以下内容重新安装libc和co:
  • stamps/ext-toolchain-installed(外部)
  • stamps/ct-ng-toolchain-installed(ctng)
  • target/lib/libc.so.0(buildroot)

然后再次运行make。

请注意,这些技巧可能会出现很多问题。目前唯一官方重新构建目标的方法是“make clean”。


2
为什么Buildroot本身没有这样的默认功能,比如使用您刚提供的内容实现make cleantarget命令? - xakepp35
1
@xakepp35 发送一个补丁吧! :-) 之前在邮件列表上讨论过:http://buildroot.uclibc.narkive.com/Kaw8KG7t/force-buildroot-to-regenerate-the-output-target-directory-tree - Ciro Santilli OurBigBook.com
1
output/build/.root 已经不存在了。 - pevik
2
这似乎不适用于Buildroot 2020.02。具体来说,即使删除了libc.so,我也无法重新安装工具链。 - tmm1
根据此链接,您可能还需要执行rm -f $(BUILD_DIR)/host-gcc-final-*/.stamp_host_installed - tmm1
2022.05-rc1 的基础上构建需要执行 rm -f $(BUILD_DIR)/host-gcc-final-*/.stamp_host_installed,否则 libstdc++.so.6 将不会被安装。 - Jaakko

6
Buildroot针对特定软件包具有清空构建目录的特殊制作目标,但这不会触及任何已安装的文件。引用用户手册
当从配置中删除软件包时,Buildroot不会执行任何特殊操作。它不会从目标根文件系统或工具链sysroot中删除此软件包安装的文件。需要进行完整的重建来摆脱该软件包。然而,通常情况下,您不必立即删除此软件包:您可以等待下次午饭时间重新启动重建过程。
话虽如此,您可以通过运行 make -dirclean 删除特定软件包的构建文件。例如,如果我想要删除 i2c-tools 的构建文件,我将运行 make i2c-tools-dirclean。 -dirclean 目标只是在 output/build/ 目录上运行 rm -rf 命令。这不会从 output/target/ 中删除已安装的文件。如果您想在没有完整重建的情况下从rootfs中删除文件,那很好——您只需进入 output/target/,删除不再需要的文件,然后运行 make 以重新生成最终映像。确保您的 Buildroot 配置也未设置为重建和安装要删除的软件包。

我需要:
  1. 擦除目标文件系统。
  2. 使用一些骨架重新初始化,就像构建过程开始时通常所做的那样。
  3. 然后从所需软件包列表中获取每个库并尝试构建它(但由于它们已经构建完成 - 只需复制即可)- 目标安装。
  4. 复制覆盖层然后压缩。
  5. 嵌入内核(使用initramfs重新构建,因为我将其嵌入内核bzImage单个文件中)。
- xakepp35
为什么没有这样的半清理命令?在Buildroot中不包括这种功能有任何注意事项吗?我想向开发团队建议这个想法,但我想讨论一下是否有我忽略的东西。 - xakepp35
这里的讨论可能会帮助您理解为什么不支持 <pkg>-uninstall 命令:http://lists.busybox.net/pipermail/buildroot/2013-February/067097.htmlBuildroot 的目标是简单而非功能强大。如果您需要更复杂的构建系统,我建议使用 Yocto。关于两者差异的精彩讨论可以在这里找到:https://youtu.be/13LZ0szWSVg - John Moon
john-moon,感谢你的报告和好链接!我真的很喜欢那种简洁性,似乎我不需要坚持使用更复杂的构建系统。换句话说,我不需要功能(在广义上理解这个词),但我基本上需要的只是能够清除(整个)目标文件系统并执行一些操作以强制重新构建它,只需通过复制而不实际重新构建所有必要的软件包和库的二进制文件即可。这可能涉及删除目标安装印章,并将大大加快重建过程! - xakepp35
1
不客气。您可能还可以考虑启用ccache,它基本上可以在您谈论的情况下做到更多,但会增加一些开销。它的优点是实际检查所有配置是否相同:https://buildroot.org/downloads/manual/manual.html#ccache - John Moon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接