How do I write a yocto/bitbake recipe to copy a directory to the target root file system
Asked Answered
E

4

25

I have a directory of 'binary' (i.e. not to be compiled) files and just want them to be installed onto my target root file system.

I have looked at several articles, none of which seem to work for me.

The desired functionality of this recipe is:

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

My current attempt is:

SRC_URI += "file://myDir"

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

I can't complain about the Yocto documentation overall, it's really good! Just can't find an example of something like this!

Evvie answered 21/11, 2016 at 14:34 Comment(3)
For a good example of this see psplash_git.bb -> do_install_appendNissensohn
Modify this line "install -m ${WORKDIR}/myDir ${D}/path/to/dir/on/fs" to "install -m ${WORKDIR}/myDir/* ${D}/path/to/dir/on/fs"Perl
Possible duplicate of How to install recursively my directories and files in BitBake recipeForklift
R
21

You just have to copy these files into your target rootfs. Do not forget to pakage them if they are not installed in standard locations.

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"
Remember answered 21/11, 2016 at 15:51 Comment(4)
This seems to copy the directory, but none of the files or other directories within it. I'm assuming I have to state all of these explicitly then. Is there a sensible, quick way to do this?Evvie
Of course it does. It's why I used cp -r for recursive copy.Remember
I used cp -r, it copies the 'myDir' directory to the FS but none of its contents...Evvie
Ok. Try cp -r ${WORKDIR}/myDir/* ${D}/path/to/dir/on/fs. It is strange. I'll have a look. Are you sure myDir is not empty ?Remember
M
7

Take care that with a simple recursive copy, you will end up having host contamination warnings so you would need to copy with the following parameters:

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

As other recipes in poky do, or just follow the official recommendations to avoid problems with ownership and permissions.

Massimo answered 27/9, 2019 at 8:34 Comment(3)
What are the differences between using cp and install -m as other users suggested?Marie
I just added a direct link to documentation. My advice is to use always install, except when you need some recursive copying.Massimo
This is pretty much the only correct answer, the thread itself being a dupe of thisForklift
S
3

For a recipe folder like this:

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

You can use the following recipe to install it on a specific folder into your 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/* "
Shiv answered 23/11, 2016 at 15:49 Comment(0)
K
2

I think it did not work for you becuase you forgot to add mode value, after "install -m",

see man page of install command: https://linux.die.net/man/1/install

install -m [mode] src destination
Koeninger answered 5/8, 2017 at 14:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.