build-ios.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #!/usr/bin/env bash
  2. set -ex
  3. dir=build-ios
  4. mkdir -p $dir
  5. cd $dir
  6. if [ ! -f openmp-11.0.0.src.tar.xz ]; then
  7. wget https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/openmp-11.0.0.src.tar.xz
  8. fi
  9. if [ ! -d openmp-11.0.0.src ]; then
  10. tar -xf openmp-11.0.0.src.tar.xz
  11. pushd openmp-11.0.0.src
  12. sed -i'' -e '/.size __kmp_unnamed_critical_addr/d' runtime/src/z_Linux_asm.S
  13. sed -i'' -e 's/__kmp_unnamed_critical_addr/___kmp_unnamed_critical_addr/g' runtime/src/z_Linux_asm.S
  14. popd
  15. fi
  16. if [ ! -f openmp-11.0.0.src/build/os64/install/include/omp.h ]; then
  17. pushd openmp-11.0.0.src
  18. mkdir -p build
  19. # iOS & simulator running on arm64 & x86_64
  20. cmake -S . \
  21. -DCMAKE_TOOLCHAIN_FILE=../../toolchains/ios.toolchain.cmake \
  22. -DCMAKE_BUILD_TYPE=Release \
  23. -DCMAKE_INSTALL_PREFIX=install \
  24. -DPLATFORM=OS64 \
  25. -DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=0 \
  26. -DPERL_EXECUTABLE=$(which perl) \
  27. -DLIBOMP_ENABLE_SHARED=OFF \
  28. -DLIBOMP_OMPT_SUPPORT=OFF \
  29. -DLIBOMP_USE_HWLOC=OFF \
  30. -B build/os64
  31. cmake -S . \
  32. -DCMAKE_TOOLCHAIN_FILE=../../toolchains/ios.toolchain.cmake \
  33. -DCMAKE_BUILD_TYPE=Release \
  34. -DPLATFORM=SIMULATORARM64 \
  35. -DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=0 \
  36. -DPERL_EXECUTABLE=$(which perl) \
  37. -DLIBOMP_ENABLE_SHARED=OFF \
  38. -DLIBOMP_OMPT_SUPPORT=OFF \
  39. -DLIBOMP_USE_HWLOC=OFF \
  40. -B build/simulator_arm64
  41. cmake -S . \
  42. -DCMAKE_TOOLCHAIN_FILE=../../toolchains/ios.toolchain.cmake \
  43. -DCMAKE_BUILD_TYPE=Release \
  44. -DPLATFORM=SIMULATOR64 \
  45. -DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=0 \
  46. -DPERL_EXECUTABLE=$(which perl) \
  47. -DLIBOMP_ENABLE_SHARED=OFF \
  48. -DLIBOMP_OMPT_SUPPORT=OFF \
  49. -DLIBOMP_USE_HWLOC=OFF \
  50. -B build/simulator_x86_64
  51. # It generates the following files in the directory install
  52. # .
  53. # ├── include
  54. # │   └── omp.h
  55. # └── lib
  56. # ├── libgomp.a -> libomp.a
  57. # ├── libiomp5.a -> libomp.a
  58. # └── libomp.a
  59. #
  60. # 2 directories, 4 files
  61. cmake --build ./build/os64 -j 4
  62. # Generate header for sharper-ncnn.xcframework
  63. cmake --build ./build/os64 --target install
  64. cmake --build ./build/simulator_arm64 -j 4
  65. cmake --build ./build/simulator_x86_64 -j 4
  66. mkdir -p "./build/simulator/openmp"
  67. lipo -create build/simulator_x86_64/runtime/src/libomp.a \
  68. build/simulator_arm64/runtime/src/libomp.a \
  69. -output build/simulator/openmp/libomp.a
  70. # Return to parent directory to create xcframework
  71. popd
  72. rm -rf openmp.xcframework
  73. xcodebuild -create-xcframework \
  74. -library "openmp-11.0.0.src/build/os64/runtime/src/libomp.a" \
  75. -library "openmp-11.0.0.src/build/simulator/openmp/libomp.a" \
  76. -output openmp.xcframework
  77. # Copy Headers
  78. mkdir -p openmp.xcframework/Headers
  79. cp -v openmp-11.0.0.src/install/include/omp.h openmp.xcframework/Headers
  80. fi
  81. export CPLUS_INCLUDE_PATH=$PWD/openmp.xcframework/Headers/:$CPLUS_INCLUDE_PATH
  82. mkdir -p build
  83. cmake -S .. \
  84. -DCMAKE_TOOLCHAIN_FILE=./toolchains/ios.toolchain.cmake \
  85. -DPLATFORM=OS64 \
  86. -DENABLE_BITCODE=0 \
  87. -DENABLE_ARC=0 \
  88. -DENABLE_VISIBILITY=0 \
  89. -DOpenMP_C_FLAGS="-Xclang -fopenmp" \
  90. -DOpenMP_CXX_FLAGS="-Xclang -fopenmp" \
  91. -DOpenMP_C_LIB_NAMES="libomp" \
  92. -DOpenMP_CXX_LIB_NAMES="libomp" \
  93. -DOpenMP_libomp_LIBRARY="$PWD/openmp.xcframework/ios-arm64/libomp.a" \
  94. -DCMAKE_INSTALL_PREFIX=./install \
  95. -DCMAKE_BUILD_TYPE=Release \
  96. -DBUILD_SHARED_LIBS=OFF \
  97. -DSHERPA_NCNN_ENABLE_PYTHON=OFF \
  98. -DSHERPA_NCNN_ENABLE_PORTAUDIO=OFF \
  99. -DSHERPA_NCNN_ENABLE_JNI=OFF \
  100. -DSHERPA_NCNN_ENABLE_BINARY=OFF \
  101. -DSHERPA_NCNN_ENABLE_TEST=OFF \
  102. -DSHERPA_NCNN_ENABLE_C_API=ON \
  103. -B build/os64
  104. cmake -S .. \
  105. -DCMAKE_TOOLCHAIN_FILE=./toolchains/ios.toolchain.cmake \
  106. -DPLATFORM=SIMULATORARM64 \
  107. -DENABLE_BITCODE=0 \
  108. -DENABLE_ARC=0 \
  109. -DENABLE_VISIBILITY=0 \
  110. -DOpenMP_C_FLAGS="-Xclang -fopenmp" \
  111. -DOpenMP_CXX_FLAGS="-Xclang -fopenmp" \
  112. -DOpenMP_C_LIB_NAMES="libomp" \
  113. -DOpenMP_CXX_LIB_NAMES="libomp" \
  114. -DOpenMP_libomp_LIBRARY="$PWD/openmp.xcframework/ios-arm64_x86_64-simulator/libomp.a" \
  115. -DCMAKE_BUILD_TYPE=Release \
  116. -DBUILD_SHARED_LIBS=OFF \
  117. -DSHERPA_NCNN_ENABLE_PYTHON=OFF \
  118. -DSHERPA_NCNN_ENABLE_PORTAUDIO=OFF \
  119. -DSHERPA_NCNN_ENABLE_JNI=OFF \
  120. -DSHERPA_NCNN_ENABLE_BINARY=OFF \
  121. -DSHERPA_NCNN_ENABLE_TEST=OFF \
  122. -DSHERPA_NCNN_ENABLE_C_API=ON \
  123. -B build/simulator_arm64
  124. cmake -S .. \
  125. -DCMAKE_TOOLCHAIN_FILE=./toolchains/ios.toolchain.cmake \
  126. -DPLATFORM=SIMULATOR64 \
  127. -DENABLE_BITCODE=0 \
  128. -DENABLE_ARC=0 \
  129. -DENABLE_VISIBILITY=0 \
  130. -DOpenMP_C_FLAGS="-Xclang -fopenmp" \
  131. -DOpenMP_CXX_FLAGS="-Xclang -fopenmp" \
  132. -DOpenMP_C_LIB_NAMES="libomp" \
  133. -DOpenMP_CXX_LIB_NAMES="libomp" \
  134. -DOpenMP_libomp_LIBRARY="$PWD/openmp.xcframework/ios-arm64_x86_64-simulator/libomp.a" \
  135. -DCMAKE_BUILD_TYPE=Release \
  136. -DBUILD_SHARED_LIBS=OFF \
  137. -DSHERPA_NCNN_ENABLE_PYTHON=OFF \
  138. -DSHERPA_NCNN_ENABLE_PORTAUDIO=OFF \
  139. -DSHERPA_NCNN_ENABLE_JNI=OFF \
  140. -DSHERPA_NCNN_ENABLE_BINARY=OFF \
  141. -DSHERPA_NCNN_ENABLE_TEST=OFF \
  142. -DSHERPA_NCNN_ENABLE_C_API=ON \
  143. -B build/simulator_x86_64
  144. cmake --build build/os64 -j 4
  145. # Generate headers for sherpa-ncnn.xcframework
  146. cmake --build build/os64 --target install
  147. # Clean files
  148. rm -rf install/lib/cmake
  149. rm -rf install/lib/pkgconfig
  150. rm -rf install/include/ncnn
  151. rm -rf install/include/kaldi-native-fbank
  152. cmake --build build/simulator_arm64 -j 8
  153. cmake --build build/simulator_x86_64 -j 8
  154. # For sherpa-ncnn.xcframework
  155. rm -rf sherpa-ncnn.xcframework
  156. libtool -static -o build/os64/sherpa-ncnn.a \
  157. build/os64/lib/libncnn.a \
  158. build/os64/lib/libsherpa-ncnn-c-api.a \
  159. build/os64/lib/libsherpa-ncnn-core.a \
  160. build/os64/lib/libkaldi-native-fbank-core.a
  161. mkdir -p "build/simulator/lib"
  162. for f in libncnn.a libsherpa-ncnn-c-api.a libsherpa-ncnn-core.a libkaldi-native-fbank-core.a; do
  163. lipo -create build/simulator_arm64/lib/${f} \
  164. build/simulator_x86_64/lib/${f} \
  165. -output build/simulator/lib/${f}
  166. done
  167. # Merge archive first, because the following xcodebuild create xcframework
  168. # cann't accept multi archive with the same architecture.
  169. libtool -static -o build/simulator/sherpa-ncnn.a \
  170. build/simulator/lib/libncnn.a \
  171. build/simulator/lib/libsherpa-ncnn-c-api.a \
  172. build/simulator/lib/libsherpa-ncnn-core.a \
  173. build/simulator/lib/libkaldi-native-fbank-core.a
  174. xcodebuild -create-xcframework \
  175. -library "build/os64/sherpa-ncnn.a" \
  176. -library "build/simulator/sherpa-ncnn.a" \
  177. -output sherpa-ncnn.xcframework
  178. # Copy Headers
  179. mkdir -p sherpa-ncnn.xcframework/Headers
  180. cp -av install/include/* sherpa-ncnn.xcframework/Headers