如何编写一个 Yocto/BitBake 配方以将目录复制到目标根文件系统

23

我有一个目录,里面有一些“二进制”(即不需要编译)文件,我只想把它们安装到我的目标根文件系统中。

我看过几篇文章,但似乎都对我没用。

这个配方所需的功能是:

myRecipe/myFiles/ --> myRootFs/dir/to/install

我目前的尝试是:

SRC_URI += "file://myDir"

do_install() {
         install -d ${D}/path/to/dir/on/fs
         install -m ${WORKDIR}/myDir ${D}/path/to/dir/on/fs
}

总体而言,我对Yocto文档没什么可抱怨的,真的很好!只是找不到像这样的示例!


一个很好的示例可以参考psplash_git.bb -> do_install_append。 - Stephano
将此行“install -m ${WORKDIR}/myDir ${D}/path/to/dir/on/fs”修改为“install -m ${WORKDIR}/myDir/* ${D}/path/to/dir/on/fs”。 - ashwanth selvam
可能是如何在BitBake配方中递归安装我的目录和文件的重复问题。 - LetoThe2nd
4个回答

19

你只需要将这些文件复制到目标rootfs中。如果它们没有安装在标准位置,请不要忘记打包它们。

SRC_URI += "file://myDir"

do_install() {
    install -d ${D}/path/to/dir/on/fs
    cp -r ${WORKDIR}/myDir ${D}/path/to/dir/on/fs
}
FILES_${PN} += "/path/to/dir/on/fs"

这似乎是复制目录,但其中的文件或其他目录都没有被复制。我猜我必须明确地列出所有这些内容。有没有一种明智、快速的方法来做到这一点? - Ben Turner
当然会啊。这就是我使用cp -r进行递归复制的原因。 - john madieu
我使用了cp -r命令,它将'myDir'目录复制到文件系统中,但没有复制其中的任何内容... - Ben Turner
好的。尝试使用cp -r ${WORKDIR}/myDir/* ${D}/path/to/dir/on/fs命令。这很奇怪,我来看看。你确定myDir不是空的吗? - john madieu

5

注意,使用简单的递归复制时,你会遇到主机污染警告,因此你需要使用以下参数进行复制:

do_install() {
     [...]
     cp --preserve=mode,timestamps -R ${S}${anydir}/Data/* ${D}${anyotherdir}/Data
     [...]
}

像poky中的其他配方一样,或者只需遵循官方建议以避免所有权和权限问题。


其他用户建议使用cpinstall -m之间有什么区别? - Mark
1
我刚刚添加了一个到文档的直接链接。我的建议是始终使用安装,除非你需要进行一些递归复制。 - urnenfeld
这基本上是唯一正确的答案,该线程本身是的副本。 - LetoThe2nd

3

对于像这样的食谱文件夹:

.
├── files
│   ├── a.txt
│   ├── b.c
│   └── Makefile
└── myrecipe.bb

您可以使用以下步骤将其安装到rootfs的特定文件夹中:
SRC_URI = " file://*"
do_install() {
    install -d ${WORKDIR}/my/dir/on/rootfs
    install -m 0755 ${S}/* ${WORKDIR}/my/dir/on/rootfs/*
}
FILES_${PN} = "/my/dir/on/rootfs/* "

2

我认为这个命令对你没有起作用是因为你忘记添加"install -m"后面的mode值了。

请查看install命令的man页: https://linux.die.net/man/1/install

install -m [mode] src destination

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