создать символическую ссылку в рецепте bitbake

У меня есть рецепт .bbappend, который мне нужен для создания символической ссылки в моей системе.

Вот как это выглядит сейчас:

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 
}

Однако в sysroot создается только каталог /lib64. Симлинк /lib64/ld-linux-x86-64.so.2 не создается.

Какие изменения я должен внести в свой рецепт, чтобы правильно создать эту символическую ссылку?


person Bernardo Rodrigues    schedule 09.01.2018    source источник


Ответы (6)


Старайтесь избегать использования абсолютных путей:

do_install_append() {
    install -d ${D}/lib64
    cd ${D}/lib64
    ln -s ../lib/ld-2.26.so ld-linux-x86-64.so.2 
}
person ɛIc_ↄIз    schedule 09.01.2018
comment
работает как шарм! спасибо!!!!!! не могли бы вы объяснить немного подробнее, почему мне нужно было cd перед созданием символической ссылки? еще раз спасибо! - person Bernardo Rodrigues; 09.01.2018
comment
Прежде всего, переменная D содержит абсолютный путь к вашему каталогу развертывания, поэтому в вашей целевой системе он будет указывать на что-то вроде /path/to/yocto/dir/build/tmp/work/.../lib64/..., что явно недопустимо. Кроме того, обычно указывается относительный путь для символических ссылок, это помогает, например, при совместном использовании библиотек в двоичном формате. - person ɛIc_ↄIз; 09.01.2018
comment
Что касается вашего случая, я не совсем уверен, почему вы не видели ссылку в результирующем пакете (вы ее не видели или это была ошибка во время сборки?), но, как я уже упоминал выше, это не распространено указать абсолютный путь в ln. Я даже не уверен, что можно использовать абсолютный путь в качестве link_name для ln. - person ɛIc_ↄIз; 09.01.2018
comment
У меня такая же проблема, как у OP, файл ссылки не устанавливается. Я попытался создать ссылку, как это предлагается в этом ответе. Но по-прежнему не устанавливается файл ссылки. Как создание ссылки определенным образом приводит к установке файла? Я не понимаю, как этот ответ решает проблему ОП. А что не так с абсолютными путями? Не то чтобы эти файлы собирались перемещать. - person steve; 26.03.2021

Самое чистое решение — использовать флаг «-r»:

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

Со страницы руководства gnu ln:

       -r, --relative            create symbolic links relative to link location
person Fede    schedule 28.06.2018

Начиная с Yocto 2.3, рекомендуется lnr.

e.g.

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

В качестве альтернативы вы также можете использовать inherit relative_symlinks, который превратит любые абсолютные символические ссылки в относительные, но он используется реже, чем lnr.

См. https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#migration-2.3-absolute-symlinks

person Christopher Boyd    schedule 06.09.2019

Я посмотрел, как другие рецепты создают ссылки в rootfs, и большинство, похоже, делают это следующим образом:

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

Эта команда в рецепте создаст на устройстве следующую ссылку:

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

Вы используете полный путь, сгенерированный Yocto, при создании ссылки, но указываете на «конечное» местоположение в rootfs.

Таким образом, вы можете использовать «абсолютные» пути и вам не придется менять рабочий каталог в рецепте.

person KyotoFox    schedule 11.09.2018

Ты можешь сделать:

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

или если вам не требуется символическая ссылка до тех пор, пока ваша целевая система не загрузится (т. е. это не зависит от других пакетов, которые вы собираете), вы также можете сделать:

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

ln не волнует, действительна ли ваша цель или существует ли она при создании символической ссылки. Это станет действительным после того, как вы загрузите свою целевую систему (или каким-либо образом смонтируете эту файловую систему в /). Но действительно, относительные ссылки рекомендуются.

person Johann Fridriksson    schedule 28.09.2018

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} += /каталог

person amine.lannister    schedule 11.01.2021