Подтвердить что ты не робот

Как я могу заставить Cmake использовать определенный компилятор и флаги на этапе финальной компиляции вместо обнаружения?

Я пытаюсь перекрестно скомпилировать из 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.

Итак, я создал файл toolchain.

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) при создании. Как я могу использовать параметры?

4b9b3361

Ответ 1

Я решил это и создал 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)

И построим script. Это важно!

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

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

Описание

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

Итак, я просто создал специальный компилятор, и Cmake пропустит этап проверки компилятора.

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

Однако какая-то конфигурация инструментальной цепочки влияет на сгенерированный Makefile. Мы должны указать правильные CMAKE_SYSTEM_NAME (Darwin) и CMAKE_SYSTEM_PROCESSOR (arm).


Update

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

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

Обновление 2

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

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