Как установить файл во включаемый каталог yocto

#yocto

#yocto

Вопрос:

Я пытаюсь установить файлы, извлеченные из tar-файла, но ни один из моих файлов не устанавливается в каталог usr / include на целевой плате, но я вижу свои файлы в каталоге temp/work/aarch64/recipedir/image/usr/include/mydir/ и include/myfile.h. Во время сборки я неесть какие-либо ошибки.

 do_install() {
     
     install -d ${D}${includedir}
     mkdir   -p ${D}${includedir}/mydir
     install -m 0644 ${S}/include/myfile.h ${D}${includedir}
     install -m 0644 ${S}/include/mydir/*.h ${D}${includedir}/mydir/
}
FILES_${PN}  = "${includedir}/mydir
 

Ответ №1:

Все, что входит ${includedir} , помещается ${PN}-dev по умолчанию.

c.f.: https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n316

Вы должны помнить, что файл может быть только в одном пакете. Определить, в каком пакете будет находиться файл, довольно просто. Начиная с крайнего левого пакета PACKAGES , первый пакет, в котором файл соответствует любому пути, FILES_<pkg> будет иметь файл.

По умолчанию ${PN}-dev отображается перед ${PN} in PACKAGES .

c.f.: http://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/conf/bitbake.conf#n294

Вы можете проверить, в каком пакете находится ваш файл, без «обратного проектирования» всего этого, запустив oe-pkgdata-util find-path '/usr/include/mydir' .

Если вы действительно хотите, чтобы этот заголовочный файл был в вашей системе (почему?), Вы можете либо добавить ${PN}-dev его к своему изображению, либо взломать (удалить пакет -dev из PACKAGES или переместить ${PN} раньше ${PN}-dev , Если у вас есть только один файл ${includedir} и т. Д.).

Комментарии:

1. Спасибо за подробное объяснение. Я запустился oe-pkgdata-util find-path '/usr/include/mydir' , заменив фактическое имя каталога, но я получил сообщение об ошибке как ERROR: Unable to find any package producing path /usr/include/mydir . На самом деле я загрузил пакет tar, который содержит файлы .so и .h, которые необходимо скомпилировать с моим приложением, поэтому я успешно установил файл .so в libdir, но не файлы .h . В любом случае мне не нужны файлы .h во время выполнения, но я не уверен, как bitbake предоставляет путь во время компиляции. Итак, я решил установить заголовочные файлы во включаемый каталог.

2. Я всегда использовал oe-pkgdata-util find-path с глобусом для файлов или полным путем, поэтому, возможно, так будет лучше (в основном, добавьте /* в конце вашего пути). Однако вам не нужно очищать свой ${TMPDIR} между сборкой и выполнением oe-pkgdata-util .

3. Для совместного использования файлов между рецептами в целях компиляции, любой файл, установленный в любой части каталога SYSROOT_DIRS (там уже есть нормальные значения по умолчанию, например ${includedir} , есть в нем), будет доступен для других рецептов, учитывая, что они добавили ваш оригинальный рецепт DEPENDS . Части исходных текстов вашего рецепта будут доступны в каталоге recipe-sysroot в ${WORKDIR} каталоге других рецептов. Системный корень передается в систему сборки рецептов через переменные Yocto, поэтому используйте их как можно чаще. c.f.: docs.yoctoproject.org/ref-manual /…

4. Поправьте меня, если я ошибаюсь, я должен установить файлы .h в ${includedir} to be part of SYSROOT_DIRS , чтобы при добавлении этого имени рецепта DEPENDS в другой рецепт он мог совместно использовать все файлы.

5. temp/work/aarch64/recipedir/image это ${D} ваш рецепт. Именно оттуда файлы разбиваются на пакеты, а также становятся доступными для других рецептов через SYSROOT_DIRS . c.f. docs.yoctoproject.org/ref-manual/variables.html#term-D Вы можете перепроверить, добавив свой рецепт в DEPENDS другой рецепт, и проверить temp/work/aarch64/anotherrecipedir/recipe-sysroot , есть ли там ваши заголовочные файлы. Если они здесь, но «другой рецепт» не удалось собрать, убедитесь, что исходный код использует переменные Yocto, которые определяют системный корень (например CC , для программного обеспечения на C).