How can I make Cmake use specific compiler and flags when final compilation stage instead of detection?

后端 未结 1 1911
太阳男子
太阳男子 2020-12-08 03:42

I\'m trying to cross-compiling from Mac OS X to iOS. It was easy using clang to cross-compile a source to iOS target. We need only 3 parameters get it to work.<

相关标签:
1条回答
  • 2020-12-08 03:46

    I solved this and built Bullet Physics for iOS.

    Solution

    Here's toolchain configuration that I used.

    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)
    

    And the build script. This is important!

    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
    

    This is very minimal configuration. However you got the idea.

    Description

    First, the toolchain configuration is just a stage figuring out features available on target machine. But cross compilation to iOS require some special compiler flags, and this is exception situation described on Cmake wiki.

    So I just forced specific compiler, and Cmake will skip compiler verification stage.

    Second, all compiler flags needed for cross compilation offered via shell variable export in build script. This is very rough options, however important is we have to pass via shell variables. Not with toolchain configuration.

    However some kind of toolchain configuration affects on generated Makefile. We have to specify correct CMAKE_SYSTEM_NAME (Darwin) and CMAKE_SYSTEM_PROCESSOR (arm).


    Update

    There is another trials. Anyway these don't work for me anymore.

    • http://code.google.com/p/ios-cmake/
    • http://www.ltengsoft.com/node/20

    Here's one more. This looks promising.

    • http://immersedcode.org/2011/4/25/sdl-on-ios/

    Update 2

    Now Bullet includes a build script for iOS platforms. Anyway it's inconvenient because it does not handle special needs for simulator stuffs, and I wrote another build script which makes far library for debug/release mode.

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

    0 讨论(0)
提交回复
热议问题