LINUX.ORG.RU

CMake кросс-компиляция для ARM фейлится на этапе теста

 , , ,


0

1

Всем привет.

По нужде, а не по собственной воле нужно портировать проект на CMake из qmake/qbs. Проект кросс-платформенный на Qt, целевая платформа Apalis iMX6 с BSP Linux, сгенерированном при помощи Yocto. Используется toolchain сгенеренный тем-же Yocto. Хост машина - Ubuntu 18 x86_64.

Путь к toolchain:

/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/

Путь к целевой RootFs:

/mnt/data/Yocto-miatech/sdks/sysroots/cortexa9hf-neon-poky-linux-gnueabi/

В качестве IDE, естественно используется QtCreator 4.8.0, в котором все нужные комплекты настроены правильно (юзаю SDK, сгенеренный Yocto). Проекты, базирующиеся на qmake или qbs компилятся великолепно. Но вот с CMake какая-то ж#@а.

Проект (любой, даже Hello World) открывается корректно (нифига не открывается, сразу после открытия вижу треш), но при попытке кросс-компиляции, CMake вываливает такой треш:

The ASM compiler identification is GNU Found assembler: /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc The C compiler identification is GNU 6.4.0 The CXX compiler identification is GNU 6.4.0 Check for working C compiler: /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc Check for working C compiler: /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc — broken CMake Error at /usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message): The C compiler

«/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc»

is not able to compile a simple test program.

It fails with the following output:

Change Dir: /tmp/QtCreator-iobfII/qtc-cmake-wCnOwxuI/CMakeFiles/CMakeTmp Run Build Command:«/mnt/data/Yocto-miatech/sdks/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/bin/make» «cmTC_afb4e/fast» /lib/ld-linux-armhf.so.3: No such file or directory

CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:22 (project)

Configuring incomplete, errors occurred! See also «/tmp/QtCreator-iobfII/qtc-cmake-wCnOwxuI/CMakeFiles/CMakeOutput.log». See also «/tmp/QtCreator-iobfII/qtc-cmake-wCnOwxuI/CMakeFiles/CMakeError.log». CMake Project parsing failed.

WTF?

Какого хрена CMake дергает make, расположенный на RootFs целевой ARM платформы? Естественно, оно не запустится на x86_64! Симлинк 'ld-linux-armhf.so.3' имеется на целевом RootFs и ссылается на валидную либу.

CMake-филы, как вы используете это говно? Как пофиксить?

PS: С qmake и QBS проблем нет, а CMake тупит... Бесит что ппц. :(

Ответ на: комментарий от annulen

А где его взять? Я просто настроил в QtCreator тулчейны/киты/комплекты (как обычно) и все. Никаких toolchain-файлов не создавал. Думал, что достаточно открыть проект в QtCreator с выбором нужного тулчейна из него и оно заработает сразу (ох, как я ошибался).

kuzulis ()
Последнее исправление: kuzulis (всего исправлений: 4)
Ответ на: комментарий от kuzulis

Все понятно, документацию не открывали

https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-comp...

В системах типа йокто тулчейн-файл генерируется при сборке, его нужно просто найти и передать путь к нему

annulen ★★★★★ ()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

Нашел тоолчайн-файл в:

/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake

Его контент:

set( CMAKE_SYSTEM_NAME Linux ) set( CMAKE_C_FLAGS $ENV{CFLAGS} CACHE STRING «» FORCE ) set( CMAKE_CXX_FLAGS $ENV{CXXFLAGS} CACHE STRING «» FORCE ) set( CMAKE ASM_FLAGS ${CMAKE_C_FLAGS} CACHE STRING «» FORCE ) set( CMAKE_LDFLAGS_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING «» FORCE )

set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT} $ENV{OECORE_NATIVE_SYSROOT} ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )

# Set CMAKE_SYSTEM_PROCESSOR from the sysroot name (assuming processor-distro-os). if ($ENV{SDKTARGETSYSROOT} MATCHES «/sysroots/([a-zA-Z0-9_-]+)-.+-.+») set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_MATCH_1}) endif()

# Include the toolchain configuration subscripts file( GLOB toolchain_config_files «${CMAKE_TOOLCHAIN_FILE}.d/*.cmake» ) foreach(config ${toolchain_config_files}) include(${config}) endforeach()

Установил в свойствах проекта в QtCreator переменную:

CMAKE_TOOLCHAIN_FILE = /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake

Перезапустил CMake:

Starting to parse CMake project, using: "-DCMAKE_BUILD_TYPE:STRING=Release", "-DCMAKE_CXX_COMPILER:STRING=/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++", "-DCMAKE_C_COMPILER:STRING=/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc", "-DCMAKE_PREFIX_PATH:STRING=/mnt/data/Yocto-miatech/sdks/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr", "-DCMAKE_TOOLCHAIN_FILE:STRING=/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake", "-DQT_QMAKE_EXECUTABLE:STRING=/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/qmake".

И в итоге та-же хрень:

/usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52: error: The C compiler «/mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc» is not able to compile a simple test program. It fails with the following output: Change Dir: /home/denis/Documents/Projects/irp-spi-git/build-irp-touch-cmake-yocto_apalis_imx6_x11-Release/CMakeFiles/CMakeTmp Run Build Command:«/mnt/data/Yocto-miatech/sdks/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/bin/make» «cmTC_e5be3/fast» /lib/ld-linux-armhf.so.3: No such file or directory

Никогда бы не подумал, что CMake такой ущербный.

kuzulis ()
Ответ на: комментарий от kuzulis

Мда... лучше уж тогда останусь на QBS, чем пытаться поднять CMake.

PS: Я бы не стал вообще переходить на CMake, если бы не было у меня второй части bare-metal под-проекта на базе IAR (для STM32). Просто увидел новость (для меня это новость), что CMake с какой-то там версии имеет поддержку IAR. И захотел чтобы все проекты с под-проектами юзали CMake. Но теперь, думаю, что проще написать модуль для QBS чтоб IAR поддерживать.

kuzulis ()
Ответ на: комментарий от annulen

Да, если бы оно работало... А вот, дергать что-то в консоли, какие-то тулчейн-файлы где-то искать, а если их нет - то их писать самому. Даже если в QtCreator все киты настроены... Неетт.. спасибо, не надо.

Ну заачееем Qt-шники приняли это идиотское решение перехода на CMake? Крик души просто...

ЗЫ: Но спасибо за помощь в любом случае.

kuzulis ()
Ответ на: комментарий от kuzulis

Ну заачееем Qt-шники приняли это идиотское решение перехода на CMake

Раньше у них было как виндовая студия: просто работало. А теперь у них юникс-вей.

Deleted ()
Ответ на: комментарий от kuzulis

Да, ты прав: CMake — говно. И его интеграция в любую IDE тот ещё геморрой. Как и поддержка кроссплатформенности.

P.S. Скинь CMakeOutput.log и CMakeError.log

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от kuzulis

Установил в свойствах проекта в QtCreator переменную:

CMAKE_TOOLCHAIN_FILE = /mnt/data/Yocto-miatech/sdks/sysroots/x86_64-pokysdk-linux/usr/share/cmake/OEToolchainConfig.cmake

Для кросс-компиляции из QtCreator'a посредством yocto SDK нужно делать немного по-другому. Когда мне нужно было из creator'a собирать, я добавил в qtcreator.sh:

source /opt/my/yocto/sdk/environment-setup-<machine>
перед запуском самого creator'a и всё работало как надо.

UVV ★★★★★ ()
Ответ на: комментарий от UVV

Ловите наркомана.

Наркоши - это CMake пользователи. Что-то куда-то х.з куда дописывают, прописывают, чтобы запустить банальную кросс-компиляцию. С QBS этих проблем никогда не было.

Без понятия, что это. Пишут, что для култьтяпок. Спасибо, я фекалиями не питаюсь!

:))) да, миллионы мух не могут ошибаться.

PS: Меня умиляют личности, которые никогда ничего другого не пробовали, а разбрызгивают...

kuzulis ()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от UVV

Для кросс-компиляции из QtCreator'a посредством yocto SDK нужно делать немного по-другому. Когда мне нужно было из creator'a собирать, я добавил в qtcreator.sh:

И ты считаешь, что это не порнография? Зачем что-то прописывать, если уже в QtCreator мы и так настраиваем/выбираем нужный туллчейн и прочее.. Нахрена мне какие-то еще скрипты? Все должно по-хорошему заводиться и так с пол-пинка.

kuzulis ()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от kuzulis

C Yocto не дружу. Но по логам видно что у кросс-компилятора не задан корректный sysroot. В CMake Toolchan-файле должны быть костыли для этого дела, посмотри ещё это:

https://www.embeddeduse.com/2017/06/03/cmake-cross-compilation-based-on-yocto...

EXL ★★★★★ ()
Ответ на: комментарий от anonymous

Пока ничего лучше нет! Или ты предлагаешь парашу вроде автотулзов?

Предлагаю не заменять одно говно (autotools) на другое (cmake).

А вообще не зря те же иксы выбрали не CMake когда переходили с autotools.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Предлагаю не заменять одно говно (autotools) на другое (cmake).

Ну какие есть ещё варианты?

А вообще не зря те же иксы выбрали не CMake когда переходили с autotools.

А что?

UVV ★★★★★ ()
Ответ на: комментарий от kuzulis

И ты считаешь, что это не порнография?

Я люблю порно

Зачем что-то прописывать, если уже в QtCreator мы и так настраиваем/выбираем нужный туллчейн и прочее.. Нахрена мне какие-то еще скрипты? Все должно по-хорошему заводиться и так с пол-пинка.

Я не вникал в проблему, если честно, ибо пробовал с creator'ом пару лет назад. Мы решили, что проще всего дебажить/разрабатывать нативно, а потом просто настроить сборку в yocto. 99.9% всё будет работать на платформе. Я знаю, что ребята напротив используют мой SDK с eclipse. Также с небольшими танцами с cmake правда.

UVV ★★★★★ ()
Ответ на: комментарий от EXL

> А что?

meson

Залез в X.org. (относительно cmake) У мезона синтаксис менее перегружен, явно у него нет косяков дизайна старых версий, и, видимо, транзитивные зависимости у него с рождения, так, что не приходится пробрасывать переменные с флагами снизу вверх.

Есть по мезону демо-материал? Что бы охватить бегло то, как в нем решаются типовые задачи возникающие в системе сборки? Блин, очень не охота в него погружаться, не люблю я это дело, мне cmake хватает для этого :\ Хотелось бы на кросскомпиляцию в том числе посмотреть!

Но, кстати, принципиальных не заметил отличий от cmake. Просто, повторюсь, его практика использования более чистая, видимо.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

http://mesonbuild.com/Tutorial.html
http://mesonbuild.com/Cross-compilation.html

Блин, очень не охота в него погружаться, не люблю я это дело, мне cmake хватает для этого

Да я тоже использую CMake в большинстве проектов (новых) и случаев. Но это не отменяет того факта, что он говно. Так уж принято в IT, что популярным становится дерьмо вроде Autotools'ов или CMake'ов просто потому, что: 1) Они были первыми. 2) Крупные компании начали их использовать.

EXL ★★★★★ ()