我在多个 yocto 食谱中看到了以下安装命令
install -d ${D}${libdir}
我知道安装命令及其用途,但是我无法理解 ${D} 变量的用途,因为它通常在配方中没有定义。有人可以解释一下这个 shell 变量的用途吗?
答案1
该${D}
变量允许将正在构建的软件安装在其实际目标之外的目录中。例如,您可以将软件配置为libdir
,/usr/lib
但这是针对目标设备的;当您在构建系统上运行安装时,您不希望新构建的文件实际安装在 中/usr/lib
,您希望将其放置在隔离的位置,以便可以轻松识别它们并将其复制到目标系统。因此,您创建一个临时目录并在那里安装:
mkdir /tmp/yocto-target
make install D=/tmp/yocto-target
这样文件最终会出现/tmp/yocto-target/usr/lib
等等。然后,您可以/tmp/yocto-target
使用您喜欢的任何工具存档所有内容,删除/tmp/yocto-target
前缀,将存档复制到目标设备并将其内容安装在那里。
在其他构建系统中,DESTDIR
使用该变量的原因相同。
答案2
${D}
是 Yocto 配方使用的路径的通常顶部,其中配方安装属于该配方生成的包的文件。下面的这些目录${D}
由构建系统扫描,以查找要包含到包中(如 RPM 文件)的文件,以及包含在所谓的 sysroot 树中的文件(例如库和头文件)所在的位置,供其他包使用。此扫描有一些默认规则,并且可以扩展规则。建议${D}
尽可能使用这些 Yocto 默认路径,以便从 Yocto 的内置机制中受益。
${libdir}
默认情况下,在 bitbake.conf 中定义为:默认情况${exec_prefix}/lib
下/usr/lib
,在同一文件中定义。
install -d ${D}${libdir}
最后这个“install”shell命令只是创建一个保存文件的目录(例如通过do_install),该目录最终应该安装在/usr/lib
目标上。
${D}/a/b/c
for filec
只是用于 Yocto 打包的中间路径,当同一文件位于目标文件系统上${D}
时,它会被“切掉” 。c
例如,${D}/a/b/c
将在/a/b/c
目标上。
${D}
默认定义在狭隘/meta/conf/bitbake.conf作为:
TMPDIR = "${TOPDIR}/tmp"
BASE_WORKDIR ?= "${TMPDIR}/work"
WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}-${PR}"
D = "${WORKDIR}/image"