android.yml 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. name: Android
  2. on: [push, pull_request]
  3. jobs:
  4. build-android:
  5. name: NDK-${{matrix.abi}}-${{matrix.build_type}}-${{matrix.lib}}
  6. runs-on: ${{matrix.os}}
  7. defaults:
  8. run:
  9. shell: bash -e -o pipefail {0}
  10. env:
  11. CCACHE_DIR: ${{github.workspace}}/ccache
  12. CMAKE_GENERATOR: Ninja
  13. DEBIAN_FRONTEND: noninteractive
  14. strategy:
  15. fail-fast: true
  16. matrix:
  17. os:
  18. - ubuntu-20.04
  19. abi:
  20. - arm64-v8a
  21. - armeabi-v7a
  22. - x86
  23. - x86_64
  24. build_type:
  25. - Release
  26. lib:
  27. - shared
  28. - static
  29. android_api_level:
  30. - '28'
  31. steps:
  32. - uses: actions/checkout@v3
  33. - name: Setup Dependencies
  34. run: |
  35. sudo apt-get update
  36. sudo apt-get install -y \
  37. ccache \
  38. ninja-build
  39. # Ensure the declared NDK version is always installed even if it's removed
  40. # from the virtual environment.
  41. - name: Setup NDK
  42. env:
  43. ANDROID_NDK_VERSION: 23.2.8568313
  44. ANDROID_SDK_ROOT: /usr/local/lib/android/sdk
  45. run: |
  46. echo 'y' | ${{env.ANDROID_SDK_ROOT}}/cmdline-tools/latest/bin/sdkmanager --install 'ndk;${{env.ANDROID_NDK_VERSION}}'
  47. echo "ANDROID_NDK_ROOT=${{env.ANDROID_SDK_ROOT}}/ndk/${{env.ANDROID_NDK_VERSION}}" >> $GITHUB_ENV
  48. - name: Cache Eigen
  49. id: cache-eigen
  50. uses: actions/cache@v3
  51. with:
  52. path: eigen/
  53. key: NDK-${{matrix.os}}-eigen-3.4.0-${{matrix.abi}}
  54. - name: Download Eigen
  55. if: steps.cache-eigen.outputs.cache-hit != 'true'
  56. run: |
  57. wget https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.zip
  58. unzip eigen-3.4.0.zip
  59. - name: Setup Eigen
  60. if: steps.cache-eigen.outputs.cache-hit != 'true'
  61. run: |
  62. cmake -S eigen-3.4.0 -B build-eigen \
  63. -DBUILD_TESTING=OFF \
  64. -DCMAKE_ANDROID_API=${{matrix.android_api_level}} \
  65. -DCMAKE_ANDROID_ARCH_ABI=${{matrix.abi}} \
  66. -DCMAKE_ANDROID_STL_TYPE=c++_shared \
  67. -DCMAKE_Fortran_COMPILER= \
  68. -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/eigen \
  69. -DCMAKE_SYSTEM_NAME=Android \
  70. -DEIGEN_BUILD_DOC=OFF
  71. cmake --build build-eigen \
  72. --config ${{matrix.build_type}} \
  73. --target install
  74. - name: Cache gflags
  75. id: cache-gflags
  76. uses: actions/cache@v3
  77. with:
  78. path: gflags/
  79. key: NDK-${{matrix.os}}-gflags-2.2.2-${{matrix.abi}}-${{matrix.build_type}}-${{matrix.lib}}
  80. - name: Download gflags
  81. if: steps.cache-gflags.outputs.cache-hit != 'true'
  82. run: |
  83. wget https://github.com/gflags/gflags/archive/refs/tags/v2.2.2.zip
  84. unzip v2.2.2.zip
  85. - name: Setup gflags
  86. if: steps.cache-gflags.outputs.cache-hit != 'true'
  87. run: |
  88. cmake -S gflags-2.2.2 -B build-gflags \
  89. -DBUILD_SHARED_LIBS=${{matrix.lib == 'shared'}} \
  90. -DBUILD_TESTING=OFF \
  91. -DCMAKE_ANDROID_API=${{matrix.android_api_level}} \
  92. -DCMAKE_ANDROID_ARCH_ABI=${{matrix.abi}} \
  93. -DCMAKE_ANDROID_STL_TYPE=c++_shared \
  94. -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
  95. -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/gflags \
  96. -DCMAKE_SYSTEM_NAME=Android
  97. cmake --build build-gflags \
  98. --config ${{matrix.build_type}} \
  99. --target install
  100. - name: Cache glog
  101. id: cache-glog
  102. uses: actions/cache@v3
  103. with:
  104. path: glog/
  105. key: NDK-${{matrix.os}}-glog-0.5-${{matrix.abi}}-${{matrix.build_type}}-${{matrix.lib}}
  106. - name: Download glog
  107. if: steps.cache-glog.outputs.cache-hit != 'true'
  108. run: |
  109. wget https://github.com/google/glog/archive/refs/tags/v0.5.0.zip
  110. unzip v0.5.0.zip
  111. - name: Setup glog
  112. if: steps.cache-glog.outputs.cache-hit != 'true'
  113. run: |
  114. cmake -S glog-0.5.0 -B build-glog \
  115. -DBUILD_SHARED_LIBS=${{matrix.lib == 'shared'}} \
  116. -DBUILD_TESTING=OFF \
  117. -DCMAKE_ANDROID_API=${{matrix.android_api_level}} \
  118. -DCMAKE_ANDROID_ARCH_ABI=${{matrix.abi}} \
  119. -DCMAKE_ANDROID_STL_TYPE=c++_shared \
  120. -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
  121. -DCMAKE_FIND_ROOT_PATH=${{github.workspace}}/gflags \
  122. -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/glog \
  123. -DCMAKE_SYSTEM_NAME=Android
  124. cmake --build build-glog \
  125. --config ${{matrix.build_type}} \
  126. --target install
  127. - name: Cache Build
  128. id: cache-build
  129. uses: actions/cache@v3
  130. with:
  131. path: ${{env.CCACHE_DIR}}
  132. key: NDK-${{matrix.os}}-ccache-${{matrix.abi}}-${{matrix.build_type}}-${{matrix.lib}}-${{github.run_id}}
  133. restore-keys: NDK-${{matrix.os}}-ccache-${{matrix.abi}}-${{matrix.build_type}}-${{matrix.lib}}-
  134. - name: Setup Environment
  135. if: matrix.build_type == 'Release'
  136. run: |
  137. echo 'CXXFLAGS=-flto' >> $GITHUB_ENV
  138. - name: Configure
  139. run: |
  140. cmake -S . -B build_${{matrix.abi}} \
  141. -DBUILD_SHARED_LIBS=${{matrix.lib == 'shared'}} \
  142. -DCMAKE_ANDROID_API=${{matrix.android_api_level}} \
  143. -DCMAKE_ANDROID_ARCH_ABI=${{matrix.abi}} \
  144. -DCMAKE_ANDROID_STL_TYPE=c++_shared \
  145. -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
  146. -DCMAKE_C_COMPILER_LAUNCHER=$(which ccache) \
  147. -DCMAKE_CXX_COMPILER_LAUNCHER=$(which ccache) \
  148. -DCMAKE_FIND_ROOT_PATH="${{github.workspace}}/eigen;${{github.workspace}}/gflags;${{github.workspace}}/glog" \
  149. -DCMAKE_SYSTEM_NAME=Android
  150. - name: Build
  151. run: |
  152. cmake --build build_${{matrix.abi}} \
  153. --config ${{matrix.build_type}}