Bernardo Rodrigues
Bernardo Rodrigues

Reputation: 426

create symbolic link in bitbake recipe

I have a .bbappend recipe that I need to create a symbolic link in my system.

This is how it looks like now:

bernardo@bernardo-ThinkCentre-Edge72:~/yocto/genericx86-64-rocko-18.0.0/meta-datavision/recipes-devtools/oracle-java$ cat oracle-jse-jdk_1.7.0.bbappend 
FILES_${PN} += "/lib64/ld-linux-x86-64.so.2"

do_install_append() {
    install -d ${D}/lib64
    ln -s ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

However, only the directory /lib64 is created in the sysroot. The symlink /lib64/ld-linux-x86-64.so.2 is not being generated.

What changes should I make in my recipe in order to have this symlink correctly created?

Upvotes: 10

Views: 25381

Answers (7)

Janne Paalijarvi
Janne Paalijarvi

Reputation: 133

As of 2022-01-19 this seems to be the only way to get it to work (adapt to the filenames needed):

do_install() {
    install -d ${D}${libdir}
    install -m 0644 ${S}/libmine.so.0 ${D}${libdir}/
    lnr ${D}${libdir}/libmine.so.0 ${D}${libdir}/libmine.so
}

FILES_${PN} += " \
    ${libdir}/libmine.so.0 \
    ${libdir}/libmine.so \
"

FILES_SOLIBSDEV = ""
INSANE_SKIP_${PN} += "dev-so"

PLEASE NOTE that the example I wrote is completely fictional and absolutely heretical way to install libraries in any sense. If you are building Makefile-based libraries, use -Wl,-soname,libmine.so.1 and then use in recipe

do_install() {
  install -d ${D}${libdir}
  oe_libinstall -so libmine ${D}${libdir}
  ...

This creates automatically:

libmine.so.1 -> libmine.so.1.0.0
libmine.so.1.0.0

Upvotes: 1

Christopher Boyd
Christopher Boyd

Reputation: 345

For Yocto 2.3 to 3.4:

do_install_append() {
    install -d ${D}/lib64
    lnr ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

For Yocto 4.0+ (or if your host system has coreutils 8.16+):

do_install:append() {
    install -d ${D}/lib64
    ln --relative --symbolic ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

Alternatively, you can also inherit relative_symlinks which will turn any absolute symlinks into relative ones, but this is less commonly used than lnr.

Cf:

Upvotes: 9

amine.lannister
amine.lannister

Reputation: 31

do_install_append () {
    install -d 0755 ${D}/dir
    install -d 0755 ${D}/dir/subdir
    cd ${D}/dir/subdir
    ln -sf /source_so_the_symbilic_link <name_of_the_symbolic_link>
} 
FILES_${PN} += "/dir" 

Upvotes: 0

Johann Fridriksson
Johann Fridriksson

Reputation: 193

You can do:

ln -s ../lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2

or if you don't require the symbolic-link until after your target system has booted up (i.e. it's not a dependency of other packages you are building) you can also do:

ln -s /lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2

ln doesn't care if your target is valid or exists when a symbolic-link is created. It will become valid after you boot your target-system (or somehow mount this filesystem to /). But indeed, relative links are recommended.

Upvotes: 0

KyotoFox
KyotoFox

Reputation: 40

I had a look at how other recipes create links in the rootfs, and most seem to do it this way:

ln -sf /data/etc/bluetooth/main.conf ${D}/${sysconfdir}/bluetooth/main.conf

This command in the recipe will create the following link on the device:

/# ls -al /etc/bluetooth/main.conf
lrwxrwxrwx 1 root root 29 Sep 11 15:34 /etc/bluetooth/main.conf -> /data/etc/bluetooth/main.conf

You use the full, Yocto-generated path when creating the link, but you make it point to the "final" location in the rootfs.

This way you can use "absolute" paths and won't have to change the working directory in the recipe.

Upvotes: 1

Fede
Fede

Reputation: 1388

The cleanest solution is to use the "-r" flag:

do_install_append() {
    install -d ${D}/lib64
    ln -s -r ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

From the gnu ln man page:

       -r, --relative            create symbolic links relative to link location

Upvotes: 21

ɛIc_ↄIз
ɛIc_ↄIз

Reputation: 380

Try to avoid usage of absolute paths:

do_install_append() {
    install -d ${D}/lib64
    cd ${D}/lib64
    ln -s ../lib/ld-2.26.so ld-linux-x86-64.so.2 
}

Upvotes: 8

Related Questions