Как я могу заставить Cmake использовать определенный компилятор и флаги на финальной стадии компиляции вместо обнаружения? - PullRequest
14 голосов
/ 25 июня 2011

Я пытаюсь выполнить кросс-компиляцию с Mac OS X на iOS. Использовать clang было легко для кросс-компиляции исходного кода на целевой iOS. Нам нужно только 3 параметра, чтобы заставить его работать.

clang
-arch armv6
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk
-miphoneos-version-min=4.3

Но проблема в том, что мне нужно собрать библиотеку (Bullet Physics), упакованную с Cmake. И, насколько я знаю, Cmake пока не поддерживает iOS.

Итак, я создал файл набора инструментов.

SET (CMAKE_SYSTEM_NAME      "Generic")
SET (CMAKE_SYSTEM_VERSION   "4.3")
SET (CMAKE_SYSTEM_PROCESSOR "arm")
SET (CMAKE_CROSSCOMPILING   TRUE)

SET (SDKVER "4.3")
SET (DEVROOT "/Developer/Platforms/iPhoneOS.platform/Developer")
SET (SDKROOT "/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk")
SET (CMAKE_OSX_SYSROOT "${SDKROOT}")
SET (CMAKE_OSX_ARCHITECTURES "armv6" "armv7")

SET (CMAKE_C_COMPILER   "${DEVROOT}/usr/bin/clang")
SET (CMAKE_CXX_COMPILER "${DEVROOT}/usr/bin/clang++")
SET (CMAKE_C_FLAGS      "-arch armv6 -arch armv7 -isysroot ${SDKROOT} -std=c99 -x objective-c -DNDEBUG=1")
SET (CMAKE_CXX_FLAGS    "-arch armv6 -arch armv7 -isysroot ${SDKROOT} -x objective-c++ -DNDEBUG=1")

SET (CMAKE_EXE_LINKER_FLAGS    "-miphoneos-version-min=${SDKVER}")
SET (CMAKE_SHARED_LINKER_FLAGS "-miphoneos-version-min=${SDKVER}")
SET (CMAKE_MODULE_LINKER_FLAGS "-miphoneos-version-min=${SDKVER}")

SET (CMAKE_FIND_ROOT_PATH              "${SDKROOT}" "${DEVROOT}")
SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

И казнен.

cmake   -DCMAKE_TOOLCHAIN_FILE=../CMAKE_IPHONEOS_TOOLCHAIN.cmake ../bullet-2.78

cmake Само сделано хорошо. make сделано хорошо. Все сборки завершены без каких-либо ошибок. Однако построенный двоичный файл был x64 нежирным двоичным файлом вместо armv6/armv7 толстого двоичного файла. Сгенерированный Makefile не работает для кросс-компиляции. Кажется, он не использует компилятор и флаги (включая -isysroot) при сборке. Как я могу заставить его использовать параметры?

1 Ответ

17 голосов
/ 25 июня 2011

Я решил это и построил Bullet Physics для iOS.

Решение

Вот набор инструментов , который я использовал.

INCLUDE(CMakeForceCompiler)

SET (CMAKE_CROSSCOMPILING   TRUE)
SET (CMAKE_SYSTEM_NAME      "Darwin")
SET (CMAKE_SYSTEM_PROCESSOR "arm")

SET (SDKVER     "4.3")
SET (DEVROOT    "/Developer/Platforms/iPhoneOS.platform/Developer")
SET (SDKROOT    "/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDKVER}.sdk")
SET (CC         "${DEVROOT}/usr/bin/clang")
SET (CXX        "${DEVROOT}/usr/bin/clang++")

CMAKE_FORCE_C_COMPILER          (${CC} CLang)
CMAKE_FORCE_CXX_COMPILER        (${CXX} CLang)

SET (CMAKE_FIND_ROOT_PATH               "${SDKROOT}" "${DEVROOT}")
SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM  NEVER)
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY  ONLY)
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE  ONLY)

ИСценарий сборки. Это важно!

PKG_NAME=bullet-2.78
BUILD_DIR=build

rm      -rf ${PKG_NAME} ${BUILD_DIR}
tar     -x -f ${PKG_NAME}-r2387.tar

mkdir   build
cd      build

DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
SYSROOT=$DEVROOT/SDKs/iPhoneOS4.3.sdk
CC=$DEVROOT/usr/bin/clang
CXX=$DEVROOT/usr/bin/clang++
CFLAGS="-arch armv6 -arch armv7 -isysroot $SYSROOT -miphoneos-version-min=4.0"
CXXFLAGS=$CFLAGS
LDFLAGS=$CFLAGS

export  CC=$CC
export  CXX=$CXX
export  CFLAGS=$CFLAGS
export  CXXFLAGS=$CXXFLAGS
export  LDFLAGS=$LDFLAGS

cmake   ../$PKG_NAME -DCMAKE_TOOLCHAIN_FILE=../CMAKE_IPHONEOS_TOOLCHAIN.cmake
make
lipo    -info src/LinearMath/libLinearMath.a

Это очень минимальная конфигурация.Однако у вас есть идея.

Описание

Во-первых, конфигурация toolchain - это всего лишь этап, позволяющий определить функции, доступные на целевой машине.Но для кросс-компиляции в iOS требуются некоторые специальные флаги компилятора, и это исключительная ситуация, описанная в Cmake wiki .

Так что я просто включил определенный компилятор, и Cmake пропустит этап проверки компилятора.

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

Однако некоторая конфигурация toolchain влияет на сгенерированную Makefile.Нужно указать правильные CMAKE_SYSTEM_NAME (Darwin) и CMAKE_SYSTEM_PROCESSOR (arm).


Обновление

Есть еще испытания.В любом случае, они больше не работают для меня.

Вот еще один.Это выглядит многообещающе.

Обновление 2

Теперь Bullet включает скрипт сборки для платформ iOS.В любом случае это неудобно, потому что он не обрабатывает особые потребности для материалов симулятора, и я написал еще один скрипт сборки, который делает далекую библиотеку для режима отладки / выпуска.

https://github.com/Eonil/Bullet-PhysicsEngine-BuildScript

...