Зависимости кросс-компиляции Meson

Привет, я пытаюсь кросс-компилировать systemd для руки, но я застрял на кросс-зависимости «mount».

Мне удалось перекрестно скомпилировать libmount из util-linux, но я не могу понять, куда его поместить или как указать, где meson должен его искать.

Существует опция «mount-path», но даже при ее предоставлении все равно говорится:

Meson encountered an error in file meson.build, line 797, column 0:                                                    
Cross dependency 'mount' not found

Мой файл кросс-компиляции выглядит так:

[binaries]                   
c = '/usr/bin/arm-linux-gnueabi-gcc'                       
cpp = '/usr/bin/arm-linux-gnueabi-g++'                     
ar = '/usr/arm-linux-gnueabi/bin/ar'                       
strip = '/usr/arm-linux-gnueabi/bin/strip'                 
pkgconfig = '/usr/bin/arm-linux-gnueabi-pkg-config'        

[host_machine]               
system = 'linux'             
cpu_family = 'arm'           
cpu = 'cortex-m4'            
endian = 'little'            

[build_machine]              
system = 'linux'             
cpu_family = 'x86_64'        
cpu = 'i686'                 
endian = 'little' 

Кстати, если бы вы знали о другом способе получить systemd без этой нелепой (ИМХО) настройки, было бы неплохо.

Спасибо.


person Dalbenn    schedule 08.02.2018    source источник


Ответы (1)


Meson использует инструмент pkg-config для поиска зависимостей. Этот инструмент ищет, так называемые, файлы конфигурации пакетов, используя переменную среды PKG_CONFIG_PATH. Вы можете проверить отсутствие монтирования в:

$ pkg-config --list-all

Это естественно, потому что вы только что скомпилировали, но не предоставили файл конфигурации пакета mount.pc для поиска. Проверьте исходники libmount, они должны содержать mount.pc.in, который используется в процессе установки. В случае кросс-компиляции его следует преобразовать в mount.pc вручную в соответствии с руководство.

После создания файла конфигурации пакета вы сможете успешно запустить:

$ pkg-config --validate mount

Вы также можете проверить правильность переменных:

$ pkg-config --cflags mount
-I/home/<>/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/libmount -I/home/<>/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/blkid -I/home/<>/tmp/work/cortexa9hf-neon-poky-linux-gnueabi/uuid

$ pkg-config --libs mount  
-lmount

Кстати, это содержимое mount.pc, которое у меня есть:

prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include

Name: mount
Description: mount library
Version: 2.29.1
Requires.private: blkid
Cflags: -I${includedir}/libmount
Libs: -L${libdir} -lmount

Кстати, если бы вы знали о другом способе получить systemd без этой нелепой (ИМХО) настройки, было бы неплохо.

systemd переключился на мезон, так что теперь это единственный способ, если вы не хотите собирать более старую версию с автоинструментами.

Но, думая шире, вы также можете взглянуть на yocto, который фокусируется на упрощении получения кросс-компилируемых дистрибутивов Linux.


Обновить

Как правильно указал @Yasushi Shoji, в случае кросс-компиляции вместо этого следует использовать PKG_CONFIG_LIBDIR, поскольку это предотвращает нежелательное/неправильное использование пакетов локальной системы, проверьте это.

person pmod    schedule 09.02.2018
comment
Обратите внимание, что pkg-config будет дополнительно искать [...] каталоги, указанные PKG_CONFIG_PATH. Это означает, что каталог по умолчанию всегда будет искать, и он может найти собственную версию файлов .pc. Было бы лучше, ИМО, вместо этого использовать PKG_CONFIG_LIBDIR. Подробнее см. pkg-config(1). - person Yasushi Shoji; 10.02.2018
comment
Эй, это очень удобно. Спасибо. Теперь я получаю Не удалось сгенерировать грузы для монтирования: ошибка в той же строке. Но это история для другого раза, я думаю. - person Dalbenn; 12.02.2018
comment
@Dalbenn спасибо, хорошо, но это может быть связано .... похоже, что-то не так с --cflags, можете ли вы где-нибудь опубликовать файл mount.pc? - person pmod; 12.02.2018
comment
Извините, я больше не могу в это вникать. Мы пошли другим путем. Но все равно спасибо! - person Dalbenn; 07.03.2018
comment
Я просто хотел добавить, что libmount является частью utils-linux - person ChrisG; 18.04.2019
comment
Привет pmod, яшуши сёдзи. Я попробовал PKG_CONFIG_LIBDIR, но все еще не могу обойти зависимость "mount". будет так легко компилироваться для x86, но когда дело доходит до кросс-компиляции для руки, я просто не могу пройти мимо этого. - person badri; 04.05.2020
comment
мой mount.pc выглядит так: Имя: mount Описание: библиотека монтирования Версия: 2.35.0 Requires.private: blkid Cflags: -I/home/badri/sandboxes/secup/secup_refresh/util-linux/include/libmount Libs: - L/home/badri/sandboxes/secup/secup_refresh/util-linux/usr/lib -lmount и аналогично для blkid.pc - person badri; 04.05.2020
comment
я использую этот cmd - meson --cross-file cross_file.txt builddir --prefix=/home/badri/arm_libs/meson_trial --libdir=/home/badri/arm_libs/meson_trial/lib где /home/badri/arm_libs/ meson_trial/lib/mountpc/ содержит mount.pc и blkid.pc - person badri; 04.05.2020
comment
мое содержимое crossfile.txt выглядит следующим образом: [host_machine] system = 'linux' cpu_family = 'arm' cpu = 'aarch64' endian = 'little' [properties] c_args = [] c_link_args = [] [binaries] c = 'aarch64 -linux-gnu-gcc' cpp = 'aarch64-linux-gnu-g++' ar = 'aarch64-linux-gnu-ar' ld = 'aarch64-linux-gnu-ld' objcopy = 'aarch64-linux-gnu-objcopy ' strip = 'aarch64-linux-gnu-strip' pkgconfig = 'aarch64-linux-gnu-pkg-config' - person badri; 04.05.2020
comment
я даже пытался добавить pkg_config_libdir = /home/badri/arm_libs/meson_trial/lib, где находится мой mountpc. это не работает, хотя у меня мезон версии 0.54.1, и я получаю сообщение об ошибке ОШИБКА: искаженное значение в переменной кросс-файла pkg_config_libdir. - person badri; 04.05.2020
comment
pkg-config --cflags mount дает мне правильный вывод. но meson всегда жалуется, что meson.build:1815:2: ОШИБКА: монтирование зависимостей не найдено, попробовал pkgconfig - person badri; 04.05.2020
comment
@badri pkg_config_libdir или на самом деле PKG_CONFIG_LIBDIR, так же как и PKG_CONFIG_PATH, являются переменными среды, поэтому вы должны установить его в своей оболочке с помощью $ export PKG_CONFIG_LIBDIR=/home/badri/arm_libs/meson_trial/lib - person pmod; 04.05.2020
comment
@badri, тогда странно, что у вас ОШИБКА: неправильное значение в кросс-файле ... но я заметил еще одну вещь. Обычно файл .pc должен находиться в каталоге .../pkgconfig, но это не обязательно, важно то, что файлы .pc должны находиться в каталоге(ах), указанном в PKG_CONFIG_LIBDIR, т.е. в вашем случае PKG_CONFIG_LIBDIR должен содержать /home/badri/ Файлы arm_libs/meson_trial/lib/mountpc или .pc необходимо переместить на один каталог вверх - person pmod; 04.05.2020
comment
Привет @pmod, я попробовал их все. поместите файлы .pc в папку с именем /home/badri/arm_libs/meson_trial/pkgconfig и установите для них значение PKG_CONFIG_LIBDIR. Даже пробовал использовать с переменной pkg_config_libdir и без нее. просто по совпадению, он жалуется на неправильность формы, только если он у меня был в cross_file.txt. Кажется, все в порядке (даже раньше), если я предоставлю его в командной строке следующим образом: meson --cross-file cross_file.txt builddir --prefix=/home/badri/arm_libs/meson_trial --libdir=/home/badri /arm_libs/meson_trial/pkgconfig - person badri; 04.05.2020
comment
@badri, тогда у вас должен быть $ export PKG_CONFIG_LIBDIR=/home/badri/arm_libs/meson_trial/pkgconfig (ранее вы упомянули другой каталог), вам больше ничего не нужно, не помещайте pkg_config_libdir в кросс-файл (это недопустимое ключевое слово для него) и не используйте --libdir в строке cmd. Просто установите env. переменная, и вам нужно перенастроить каталог сборки, проще удалить его, а затем снова настроить с помощью $ meson --cross-file cross_file.txt builddir --prefix=/home/badri/arm_libs/meson_trial - person pmod; 04.05.2020
comment
Большое спасибо пмод. ты помог мне выстоять! Я установил PKG_CONFIG_LIBDIR (а также PKG_CONFIG_PATH), и это сработало. Я заметил, что в моей цепочке инструментов для руки есть два бинарных файла pkg-config, а именно aarch64-linux-gnu-pkg-config-real и aarch64-linux-gnu-pkg-config. Я сделал так, чтобы переменные в моем файле cross-file.txt указывали на настоящие, и это сработало. Не зря его назвали настоящим. Я подозреваю, что это могло быть реальной проблемой. - person badri; 04.05.2020