build.sh 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #!/bin/bash
  2. #
  3. # Written and maintained by [email protected] (2014)
  4. #
  5. BUILD_DIR="./lib/iOS"
  6. ###################################
  7. # SDK Version
  8. ###################################
  9. IOS_SDK_VERSION=$(xcodebuild -version -sdk iphoneos | grep SDKVersion | cut -f2 -d ':' | tr -d '[[:space:]]')
  10. ###################################
  11. ###################################
  12. # BUILD Configuration
  13. ###################################
  14. BUILD_SHARED_LIBS=OFF
  15. BUILD_TYPE=Release
  16. ################################################
  17. # Minimum iOS deployment target version
  18. ################################################
  19. MIN_IOS_VERSION="10.0"
  20. IOS_SDK_TARGET=$MIN_IOS_VERSION
  21. XCODE_ROOT_DIR=$(xcode-select --print-path)
  22. TOOLCHAIN=$XCODE_ROOT_DIR/Toolchains/XcodeDefault.xctoolchain
  23. CMAKE_C_COMPILER=$(xcrun -find cc)
  24. CMAKE_CXX_COMPILER=$(xcrun -find c++)
  25. BUILD_ARCHS_DEVICE="arm64e arm64 armv7s armv7"
  26. BUILD_ARCHS_SIMULATOR="x86_64 i386"
  27. BUILD_ARCHS_ALL=($BUILD_ARCHS_DEVICE $BUILD_ARCHS_SIMULATOR)
  28. CPP_DEV_TARGET_LIST=(miphoneos-version-min mios-simulator-version-min)
  29. CPP_DEV_TARGET=
  30. CPP_STD_LIB_LIST=(libc++ libstdc++)
  31. CPP_STD_LIB=
  32. CPP_STD_LIST=(c++11 c++14)
  33. CPP_STD=c++11
  34. function join { local IFS="$1"; shift; echo "$*"; }
  35. build_arch()
  36. {
  37. IOS_SDK_DEVICE=iPhoneOS
  38. CPP_DEV_TARGET=${CPP_DEV_TARGET_LIST[0]}
  39. if [[ "$BUILD_ARCHS_SIMULATOR" =~ "$1" ]]
  40. then
  41. echo '[!] Target SDK set to SIMULATOR.'
  42. IOS_SDK_DEVICE=iPhoneSimulator
  43. CPP_DEV_TARGET=${CPP_DEV_TARGET_LIST[1]}
  44. else
  45. echo '[!] Target SDK set to DEVICE.'
  46. fi
  47. unset DEVROOT SDKROOT CFLAGS LDFLAGS CPPFLAGS CXXFLAGS CMAKE_CLI_INPUT
  48. export CC="$(xcrun -sdk iphoneos -find clang)"
  49. export CPP="$CC -E"
  50. export DEVROOT=$XCODE_ROOT_DIR/Platforms/$IOS_SDK_DEVICE.platform/Developer
  51. export SDKROOT=$DEVROOT/SDKs/$IOS_SDK_DEVICE$IOS_SDK_VERSION.sdk
  52. export CFLAGS="-arch $1 -pipe -no-cpp-precomp -isysroot $SDKROOT -I$SDKROOT/usr/include/ -miphoneos-version-min=$IOS_SDK_TARGET"
  53. if [[ "$BUILD_TYPE" =~ "Debug" ]]; then
  54. export CFLAGS="$CFLAGS -Og"
  55. else
  56. export CFLAGS="$CFLAGS -O3"
  57. fi
  58. export LDFLAGS="-arch $1 -isysroot $SDKROOT -L$SDKROOT/usr/lib/"
  59. export CPPFLAGS="$CFLAGS"
  60. export CXXFLAGS="$CFLAGS -std=$CPP_STD"
  61. rm CMakeCache.txt
  62. CMAKE_CLI_INPUT="-DCMAKE_C_COMPILER=$CMAKE_C_COMPILER -DCMAKE_CXX_COMPILER=$CMAKE_CXX_COMPILER -DCMAKE_TOOLCHAIN_FILE=./port/iOS/IPHONEOS_$(echo $1 | tr '[:lower:]' '[:upper:]')_TOOLCHAIN.cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS"
  63. echo "[!] Running CMake with -G 'Unix Makefiles' $CMAKE_CLI_INPUT"
  64. cmake -G 'Unix Makefiles' ${CMAKE_CLI_INPUT}
  65. echo "[!] Building $1 library"
  66. xcrun -run make clean
  67. xcrun -run make assimp -j 8 -l
  68. if [[ "$BUILD_SHARED_LIBS" =~ "ON" ]]; then
  69. echo "[!] Moving built dynamic libraries into: $BUILD_DIR/$1/"
  70. mv ./lib/*.dylib $BUILD_DIR/$1/
  71. fi
  72. echo "[!] Moving built static libraries into: $BUILD_DIR/$1/"
  73. mv ./lib/*.a $BUILD_DIR/$1/
  74. }
  75. echo "[!] $0 - assimp iOS build script"
  76. CPP_STD_LIB=${CPP_STD_LIB_LIST[0]}
  77. CPP_STD=${CPP_STD_LIST[0]}
  78. DEPLOY_ARCHS=${BUILD_ARCHS_ALL[*]}
  79. DEPLOY_FAT=1
  80. for i in "$@"; do
  81. case $i in
  82. -s=*|--std=*)
  83. CPP_STD=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
  84. echo "[!] Selecting c++ standard: $CPP_STD"
  85. ;;
  86. -l=*|--stdlib=*)
  87. CPP_STD_LIB=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
  88. echo "[!] Selecting c++ std lib: $CPP_STD_LIB"
  89. ;;
  90. -a=*|--archs=*)
  91. DEPLOY_ARCHS=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
  92. echo "[!] Selecting architectures: $DEPLOY_ARCHS"
  93. ;;
  94. --debug)
  95. BUILD_TYPE=Debug
  96. echo "[!] Selecting build type: Debug"
  97. ;;
  98. --shared-lib)
  99. BUILD_SHARED_LIBS=ON
  100. echo "[!] Will generate dynamic libraries"
  101. ;;
  102. -n|--no-fat)
  103. DEPLOY_FAT=0
  104. echo "[!] Fat binary will not be created."
  105. ;;
  106. -h|--help)
  107. echo " - don't build fat library (--no-fat)."
  108. echo " - Include debug information and symbols, no compiler optimizations (--debug)."
  109. echo " - generate dynamic libraries rather than static ones (--shared-lib)."
  110. echo " - supported architectures (--archs): $(echo $(join , ${BUILD_ARCHS_ALL[*]}) | sed 's/,/, /g')"
  111. echo " - supported C++ STD libs (--stdlib): $(echo $(join , ${CPP_STD_LIB_LIST[*]}) | sed 's/,/, /g')"
  112. echo " - supported C++ standards (--std): $(echo $(join , ${CPP_STD_LIST[*]}) | sed 's/,/, /g')"
  113. exit
  114. ;;
  115. *)
  116. ;;
  117. esac
  118. done
  119. cd ../../
  120. rm -rf $BUILD_DIR
  121. for ARCH_TARGET in $DEPLOY_ARCHS; do
  122. echo "Creating folder: $BUILD_DIR/$ARCH_TARGET"
  123. mkdir -p $BUILD_DIR/$ARCH_TARGET
  124. echo "Building for arc: $ARCH_TARGET"
  125. build_arch $ARCH_TARGET
  126. #rm ./lib/libassimp.a
  127. done
  128. make_fat_static_or_shared_binary()
  129. {
  130. LIB_NAME=$1
  131. LIPO_ARGS=''
  132. for ARCH_TARGET in $DEPLOY_ARCHS; do
  133. if [[ "$BUILD_SHARED_LIBS" =~ "ON" ]]; then
  134. LIPO_ARGS="$LIPO_ARGS-arch $ARCH_TARGET $BUILD_DIR/$ARCH_TARGET/$LIB_NAME.dylib "
  135. else
  136. LIPO_ARGS="$LIPO_ARGS-arch $ARCH_TARGET $BUILD_DIR/$ARCH_TARGET/$LIB_NAME.a "
  137. fi
  138. done
  139. if [[ "$BUILD_SHARED_LIBS" =~ "ON" ]]; then
  140. LIPO_ARGS="$LIPO_ARGS -create -output $BUILD_DIR/$LIB_NAME-fat.dylib"
  141. else
  142. LIPO_ARGS="$LIPO_ARGS -create -output $BUILD_DIR/$LIB_NAME-fat.a"
  143. fi
  144. lipo $LIPO_ARGS
  145. }
  146. make_fat_static_binary()
  147. {
  148. LIB_NAME=$1
  149. LIPO_ARGS=''
  150. for ARCH_TARGET in $DEPLOY_ARCHS; do
  151. LIPO_ARGS="$LIPO_ARGS-arch $ARCH_TARGET $BUILD_DIR/$ARCH_TARGET/$LIB_NAME.a "
  152. done
  153. LIPO_ARGS="$LIPO_ARGS -create -output $BUILD_DIR/$LIB_NAME-fat.a"
  154. lipo $LIPO_ARGS
  155. }
  156. if [[ "$DEPLOY_FAT" -eq 1 ]]; then
  157. echo '[+] Creating fat binaries ...'
  158. if [[ "$BUILD_TYPE" =~ "Debug" ]]; then
  159. make_fat_static_or_shared_binary 'libassimpd'
  160. else
  161. make_fat_static_or_shared_binary 'libassimp'
  162. fi
  163. echo "[!] Done! The fat binaries can be found at $BUILD_DIR"
  164. fi