3

我已经接管了一个 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 命令执行install -m 0755 -d以及-m-d选项的效果是什么?

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

4

1 回答 1

8

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

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

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

install -m 0755 -d使用 install 命令执行, the-m-doptions的效果是什么?

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

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

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

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

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


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

于 2019-05-30T16:43:42.667 回答