对使用 Yocto 的 install -m 和 install -d 感到困惑

Confused about install -m and install -d using Yocto

我已经接管了一个 Yocto 项目,在一个 .bb 配方文件中,我看到以下行在图像中安装新目录:

do_install() {
install -m 0755 -d ${DEPLOY_DIR_IMAGE}/app
install -m 0755 -d ${DEPLOY_DIR_IMAGE}/app/apiary
install -m 0755 -d ${DEPLOY_DIR_IMAGE}/app/lib
install -m 0755 -d ${DEPLOY_DIR_IMAGE}/app/config
install -m 0755 -d ${DEPLOY_DIR_IMAGE}/app/scripts
install -m 0755 -d ${DEPLOY_DIR_IMAGE}/app/keys

这行得通,但我很困惑。根据我对 Yocto 的阅读和做 do_install,我认为 -m 选项仅用于安装文件而不是目录。

执行 install -m 0755 -d 的效果是什么,-m-d 安装命令的选项?

此外,为什么没有像我看到的大多数其他目录安装中那样的 ${D} 变量? 我通常不会求助于 Stack Overflow 来解决这样的问题,但有太多我不理解的不一致之处,而且很难找到答案。

相关任务定义为 shell 函数。 install 命令是一个 shell 命令,不是任何 Yocto- 或 BitBake-specific,因此您应该查看 its docs 以获得启发,而不是依赖 BitBake 文档或示例.然而,特别是在 Yocto 的上下文中,您应该查看 install 程序的 GNU coreutils 版本的文档(如上链接),这是您总是会在 Linux 上找到的文档系统.*

From my reading about Yocto and doing do_install, I thought that the -m option is only for installing files and not directories.

除了之前没有看到它应用于目录之外,我不确定是什么让您这么想。

What is the effect of doing install -m 0755 -d, both the -m and -d options with the install command?

-m 选项设置已安装对象的模式(access-control 位)。目录与普通文件一样具有模式,-m 选项对于安装目录的含义与安装普通文件的含义相同。

-d 选项指定为安装指定的名称将作为要创建的目录,以及指定路径中任何缺失的目录。正如@jww 在评论中观察到的,效果类似于 mkdir -p.

这些选项是正交的。当一起使用时,它们的效果以自然的方式组合在一起:创建指定的目录,如果需要,还会创建父目录,并且所有创建的目录都分配有指定的模式。但是,将模式显式设置为 0755 是多余的,因为这是默认设置。这可能就是您不习惯看到用于目录的 -m 选项的原因。

Also, why is there no ${D} variable like in the majority of other directory installations which I see?

do_install 的 Yocto 规范说它应该安装相对于 ${D} 的文件,而 the variable DEPLOY_DIR_IMAGE 指的是 ready-to-install 图像的位置。安装到 ${DEPLOY_DIR_IMAGE} 似乎是错误的做法,但这并不一定意味着它不会产生预期的最终效果。或者,该食谱可能只是为某些更有意义的旧版本 BitBake 编写的。无论如何,整理细节将是比我准备为您执行的更深入和更复杂的分析。


*install 未被 POSIX 标准化。 GNU 版本的灵感来自 BSD 的同名程序,其当前版本具有相似的选项和行为,特别是关于 -m-d 选项。