Вопрос или проблема
Я пытаюсь скомпилировать 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), не могут быть выполнены на хост-архитектуре.
Вот шаги, которые помогут вам избежать выполнения этих тестов на хосте и указать версии зависимостей явно:
-
Создание файла инструментов (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)
-
Указание версий зависимостей в CMake: Если версия библиотек (например, GMP и MPFR) известна, можно указать их явно, используя переменные. Например, в вашем
toolchain.cmake
добавьте следующие строки:set(GMP_VERSION 2.6.0) set(MPFR_VERSION 3.1.0) # Укажите нужную версию
-
Установите необходимые переменные 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)
-
Запуск CMake: Запустите CMake с использованием ранее созданного файла инструментов, указывая путь к нему. Например:
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake -DWITH_GMP=ON -DWITH_MPFR=ON /path/to/CGAL/source
-
Отключение тестирования при сборке: В случае, если CMake продолжает пытаться запустить тесты, можно полностью отключить сборку тестов:
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake -DBUILD_TESTING=OFF /path/to/CGAL/source
Эти шаги должны помочь вам настроить окружение для кросс-компиляции CGAL без попыток выполнения кода, предназначенного для целевой архитектуры на хосте. Убедитесь также, что все необходимые зависимости уже скомпилированы для ARM и доступны в указанном CMAKE_FIND_ROOT_PATH
.