对于使用Yocto安装-m和install -d感到困惑

8

我接手了一个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,install命令中同时使用了 -m-d 选项,会有什么影响?

此外,为什么没有像我看到的其他大部分目录安装一样有 ${D} 变量?

通常我不会为这样的问题求助于Stack Overflow,但是由于存在这么多不一致性,我不理解,并且难以找到答案。


2
install(1) man page-d 就像 mkdir -p-m 设置模式(权限)。请注意,带有 -d 等选项的 install 是非标准的。它在某些操作系统上不可用,例如 AIX 或 Solaris 的 install - jww
另一个值得关注的标准可能是GNU编码标准和Makefile的INSTALL命令变量 - jww
@jww 谢谢。你知道这是如何在没有 ${D} 变量的情况下工作的吗?我猜这是 Yocto 特定的。 - Engineer999
1个回答

13
所讨论的任务定义为一个shell函数。其中使用的install命令是一个shell命令,不是任何专门针对Yocto或BitBake的内容,因此您应该查看其文档以获取启示,而不是依赖于BitBake文档或示例。特别是在Yocto的上下文中,您应该查看GNU coreutils版本的install程序的文档(如上所述),这是您在Linux系统上无论如何都会找到的版本。*

根据我对Yocto和do_install的理解,我认为-m选项仅用于安装文件而不是目录。

除了之前没有将其应用于目录,我不确定是什么让您这样想。

执行install -m 0755 -d,同时使用-m-d选项的效果是什么?

-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选项。

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