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_(версия).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

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

В моем рецепте изображения (который я называю 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