Кросс-компиляция и CMake

Вопрос или проблема

Я пытаюсь скомпилировать CGAL на машине с amd64 Linux для архитектуры ARM. CGAL использует CMake для сборки.

CGAL имеет несколько зависимостей, включая библиотеки GMP и MPFR. Когда выполняется CMake, ему необходимо определить версии этих зависимостей. Для поиска версий CMake компилирует и запускает несколько небольших тестовых программ, которые просто связываются с этими библиотеками и выводят их версии. Это хорошо работает во время обычной, некросс-компилируемой сборки.

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

/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
/opt/Company/ArmTools_GCC435_GLIBC_Q3_2011/bin/arm-rc-linux-gnueabi-g++        -fPIC CMakeFiles/cmTryCompileExec.dir/print_GMP_version.cpp.o  -o cmTryCompileExec -rdynamic /home/pmw/Software-Engineering/build/Lib/mpir-2.6.0/arm/lib/libgmp.a
gmake[1]: Leaving directory `/home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp'
/home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp/cmTryCompileExec: /home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp/cmTryCompileExec: невозможно выполнить бинарный файл

-- ИСПОЛЬЗУЯ GMP_VERSION = 'unknown'

Я нашел предложение (если я правильно понял), указать версию GMP явно; это должно предотвратить попытки CMake определить ее. Поэтому я создал файл, содержащий эту строку:

SET(GMP_VERSION 2.6.0)

и вызвал CMake с аргументом -C path/to/my/file. Но это ничего не изменило. Затем я попробовал вызвать CMake с аргументом -DCMAKE_TOOLCHAIN_FILE=/path/to/my/file вместо этого. Опять же, без эффекта. Однако я вижу, что CMake может найти и распарсить этот файл.

Так как же убедить CMake не пытаться собирать и выполнять кросс-компилированные программы на хост-машине?

Заранее извиняюсь, если этот сайт Unix & Linux StackExchange не лучшее место для такого вопроса. На прошлой неделе я задал свой вопрос на почтовом списке CGAL (который сейчас в топ-3 результатов Google по запросу “кросс-компиляция cgal”; я стал знаменитым!) но не получил ответов.

Обратите внимание на вики CMake, я полагаю, вам нужно немного поэкспериментировать с переменной CMAKE_CROSSCOMPILING и кэшем CMake (все это описано в вики).

Ответ или решение

Для успешного кросс-компилирования библиотеки CGAL (или любой другой библиотеки, использующей CMake) с платформы amd64 на ARM, требуется внести некоторые изменения в подход к определению версий зависимостей. Когда CMake выполняет проверки путем компиляции и запуска небольших тестовых программ для определения версий библиотек, такие проверки могут потерпеть неудачу, так как бинарники, скомпилированные для целевой архитектуры (ARM), не могут быть выполнены на хост-архитектуре.

Вот шаги, которые помогут вам избежать выполнения этих тестов на хосте и указать версии зависимостей явно:

  1. Создание файла инструментов (Toolchain File): Создайте файл (например, toolchain.cmake), в котором определите необходимые переменные и флаги компилятора. Пример:

    set(CMAKE_SYSTEM_NAME Linux)
    set(CMAKE_SYSTEM_PROCESSOR arm)
    set(CMAKE_C_COMPILER /path/to/your/arm-toolchain/bin/arm-linux-gnueabi-gcc)
    set(CMAKE_CXX_COMPILER /path/to/your/arm-toolchain/bin/arm-linux-gnueabi-g++)
    set(CMAKE_FIND_ROOT_PATH /path/to/your/arm/sysroot)
    set(CMAKE_CROSSCOMPILING TRUE)
  2. Указание версий зависимостей в CMake: Если версия библиотек (например, GMP и MPFR) известна, можно указать их явно, используя переменные. Например, в вашем toolchain.cmake добавьте следующие строки:

    set(GMP_VERSION 2.6.0)
    set(MPFR_VERSION 3.1.0)  # Укажите нужную версию
  3. Установите необходимые переменные CMake для обхода сборки тестов: Можно добавить дополнительные параметры и отключить выполнение тестов и проверок, установив следующие переменные:

    set(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE)
    set(CMAKE_FIND_PACKAGE_PREFER_CMAKE_CONFIG TRUE)
    set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabi)
    set(CMAKE_VERBOSE_MAKEFILE ON)
  4. Запуск CMake: Запустите CMake с использованием ранее созданного файла инструментов, указывая путь к нему. Например:

    cmake -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake -DWITH_GMP=ON -DWITH_MPFR=ON /path/to/CGAL/source
  5. Отключение тестирования при сборке: В случае, если CMake продолжает пытаться запустить тесты, можно полностью отключить сборку тестов:

    cmake -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake -DBUILD_TESTING=OFF /path/to/CGAL/source

Эти шаги должны помочь вам настроить окружение для кросс-компиляции CGAL без попыток выполнения кода, предназначенного для целевой архитектуры на хосте. Убедитесь также, что все необходимые зависимости уже скомпилированы для ARM и доступны в указанном CMAKE_FIND_ROOT_PATH.

Оцените материал
Добавить комментарий

Капча загружается...