Yocto: създайте символна връзка в рецепта за изображение

Имам персонализирана рецепта за „изображение“ на Yocto, която използва IMAGE_INSTALL += "... " за конструиране на изображението, което също съдържа Python 3.5. За съжаление, често използваната символна връзка /usr/bin/pdb не е създадена и моите потребители очакват да могат да стартират pdb от командния ред. Така че искам да направя една символна връзка за това в рамките на изображението. Ако се изпълни на целта, ще бъде резултатът от тази команда:

ln -s /usr/lib/python3.5/pdb.py /usr/bin/pdb

Разбирам, че мога да създам персонализирана задача в рецептата за изображение с този вид конструкция:

addtask create_pdb_symlink before do_image
do_create_pdb_symlink () {
    ln -s /usr/lib/python3.5/pdb.py ${D}/usr/bin/pdb
}

Това обаче не работи, защото предполагам, че използвам ${D} и не мисля, че файловата система е поставена в този момент. Той генерира тази грешка:

DEBUG: Executing shell function do_create_pdb_symlink
ln: failed to create symbolic link 
'/home/user/project/build/tmp/work/custom-linux/my-image/1.0-r0/image/usr/bin/pdb': No such file or directory
WARNING: exit code 1 from a shell command.

Проверката на файловата система потвърждава, че /home/user/project/build/tmp/work/custom-linux/ съществува, но /home/user/project/build/tmp/work/custom-linux/my-image не.

Има някои директории в тази custom-linux директория, една от които се нарича rootfs и изглежда подозрително полезна, но не съм сигурен дали моята задача трябва да е да ровя под директорията my-image.

Та въпросите ми са:

  • това правилният подход ли е?
  • или трябва да създам чисто нова рецепта само за да създам тази единствена символна връзка?
  • или трябва да създам python3-core.bbappend за изпълнение на тази задача?
  • или има причина това да не се създава от самата рецепта на python?

person davidA    schedule 28.03.2018    source източник


Отговори (2)


Тъй като тази символна връзка е ясно свързана с python3, бих препоръчал да я създадете с помощта на bbappend за тази рецепта. Името на рецептата е python3_(version).bb, така че за улавяне на всички версии именувайте bbappend python3_%.bbappend.

Това трябва да работи:

# Create symlink at the end of do_install
do_install_append() {
    ln -sf /usr/lib/python3.5/pdb.py ${D}/usr/bin/pdb
}

# Include the symlink in the python3-debugger package
FILES_${PN}-debugger += "/usr/bin/pdb"

Можете също така да създадете символна връзка като етап, където се създава целият rootfs, но в този случай не бих го препоръчал. Но ако имате нещо, което трябва да направите, когато целият rootfs е попълнен, разгледайте използването на ROOTFS_POSTPROCESS_COMMAND. напр. поставете това в рецептата за изображение:

my_image_postprocess_function() {
    ln -sf /usr/lib/python3.5/pdb.py ${IMAGE_ROOTFS}/usr/bin/pdb
}

ROOTFS_POSTPROCESS_COMMAND += "my_image_postprocess_function; "
person Erik Botö    schedule 28.03.2018
comment
Имайте предвид, че ще получите предупреждение, когато създавате връзка за абсолютен път. - person Nayfe; 28.03.2018
comment
Името на файла с рецепти използва %, така че ще улови всички версии на рецепти на python3, но има 3.5 в командата за създаване на символна връзка - има ли начин да извлечете първите две части от съвпадението % и да използвате това в командата? Ще направя малко проучване, но подозирам, че някъде ще има променлива, съдържаща съвпадението %... - person davidA; 03.04.2018
comment
Изглежда, че оригиналната рецепта на Python дефинира PYTHON_MAJMIN, така че ще използвам това засега. Не съм сигурен за общия случай, въпреки че PV изглежда обещаващо. - person davidA; 03.04.2018

Отговорът на Erik Botö вероятно е най-добрият начин да направите това, но бих искал да запиша какво открих сам, в случай помага на други хора, които се опитват да направят нещо подобно (създаване на символна връзка в рецепта за изображение, макар че може би не с тази конкретна символна връзка).

В моята рецепта за изображения (която наричам recipes-core/images/myimage.bb в персонализирания си слой) добавих следните редове:

addtask create_pdb_symlink after do_rootfs before do_image
do_create_pdb_symlink () {
    ln -s /usr/lib/python3.5/pdb.py ${IMAGE_ROOTFS}/usr/bin/pdb
}

Двете ключови неща, които трябваше да разбера тук, бяха използването на IMAGE_ROOTFS (което намерих чрез търсене в изхода на bitbake -e) и подреждането на задачите: създаването на символна връзка трябва да се случи след do_rootfs, в противен случай няма нищо в ${IMAGE_ROOTFS}, но очевидно трябва да се случи преди да бъдат създадени изображения, които да бъдат включени.

В този случай обаче съм съгласен, че bbappend на рецептата на python3 е по-подходящ.

person davidA    schedule 02.04.2018