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

Eng*_*999 3 linux makefile rootfs bitbake 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
Run Code Online (Sandbox Code Playgroud)

这有效,但我很困惑。从我阅读 Yocto 和做 do_install 来看,我认为-m选项仅用于安装文件而不是目录。

使用 install 命令执行install -m 0755 -d-m-d选项的效果是什么?

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

Joh*_*ger 8

有问题的任务被定义为一个 shell 函数。其中install使用的命令是一个 shell 命令,而不是任何特定于 Yocto 或 BitBake 的命令,因此您应该查看其文档以获得启发,而不是依赖于 BitBake 文档或示例。但是,特别是在 Yocto 的上下文中,您应该查看install程序的 GNU coreutils 版本的文档(如上链接),这是您在 Linux 系统上总是会找到的文档。*

从我阅读 Yocto 和做 do_install 来看,我认为该-m选项仅用于安装文件而不是目录。

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

什么是这样做的效果install -m 0755 -d,无论是-m-d使用install命令选项?

-m选项设置已安装对象的模式(访问控制位)。目录与普通文件一样具有模式,并且该-m选项对于安装目录的意义与安装普通文件的意义相同。

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

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

另外,为什么我看到的大多数其他目录安装中没有 ${D} 变量?

Yocto 规范do_install说它应该安装相对于 的文件${D},而变量DEPLOY_DIR_IMAGE指的是准备安装图像的位置。安装 to 似乎${DEPLOY_DIR_IMAGE}是错误的做法,但这并不一定意味着它不会产生所需的最终效果。或者,这个配方可能只是为一些旧版本的 BitBake 编写的,在那里它更有意义。无论如何,整理细节将是比我准备为您执行的更深入、更复杂的分析。


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