RunCMakeTest.cmake 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. cmake_minimum_required(VERSION 3.6)
  2. include(RunCMake)
  3. foreach(v TEST_ANDROID_NDK TEST_ANDROID_STANDALONE_TOOLCHAIN)
  4. string(REPLACE "|" ";" ${v} "${${v}}")
  5. endforeach()
  6. function(run_Android case)
  7. set(RunCMake_TEST_OPTIONS
  8. -DCMAKE_SYSTEM_NAME=Android
  9. ${RunCMake_TEST_OPTIONS}
  10. ${ARGN}
  11. )
  12. # Use a single build tree for a few tests without cleaning.
  13. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build)
  14. set(RunCMake_TEST_NO_CLEAN 1)
  15. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  16. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  17. run_cmake(${case})
  18. run_cmake_command(${case}-build ${CMAKE_COMMAND} --build .)
  19. endfunction()
  20. set(RunCMake_TEST_OPTIONS
  21. -DCMAKE_SYSTEM_NAME=Android
  22. -DCMAKE_SYSROOT=${CMAKE_CURRENT_SOURCE_DIR}
  23. )
  24. run_cmake(BadSYSROOT)
  25. unset(RunCMake_TEST_OPTIONS)
  26. foreach(ndk IN LISTS TEST_ANDROID_NDK)
  27. # Load available toolchain versions and abis.
  28. file(GLOB _config_mks
  29. "${ndk}/build/core/toolchains/*/config.mk"
  30. "${ndk}/toolchains/*/config.mk"
  31. )
  32. set(_versions "")
  33. set(_latest_gcc 0)
  34. set(_latest_clang "")
  35. set(_latest_clang_vers 0)
  36. foreach(config_mk IN LISTS _config_mks)
  37. file(STRINGS "${config_mk}" _abis REGEX "^TOOLCHAIN_ABIS +:= +[^ ].*( |$)")
  38. if(_abis AND "${config_mk}" MATCHES [[-((clang)?([0-9]\.[0-9]|))/config\.mk$]])
  39. set(_version "${CMAKE_MATCH_1}")
  40. set(_is_clang "${CMAKE_MATCH_2}")
  41. set(_cur_vers "${CMAKE_MATCH_3}")
  42. if(_is_clang)
  43. if(_latest_clang_vers STREQUAL "")
  44. # already the latest possible
  45. elseif(_cur_vers STREQUAL "" OR _cur_vers VERSION_GREATER _latest_clang_vers)
  46. set(_latest_clang_vers "${_cur_vers}")
  47. set(_latest_clang "${_version}")
  48. endif()
  49. else()
  50. if(_version VERSION_GREATER _latest_gcc)
  51. set(_latest_gcc ${_version})
  52. endif()
  53. endif()
  54. list(APPEND _versions "${_version}")
  55. string(REGEX MATCHALL "[a-z][a-z0-9_-]+" _abis "${_abis}")
  56. list(APPEND _abis_${_version} ${_abis})
  57. endif()
  58. endforeach()
  59. set(_abis_ ${_abis_${_latest_gcc}})
  60. set(_abis_clang ${_abis_${_latest_clang}})
  61. if(_versions MATCHES "clang")
  62. set(_versions "clang" ${_versions})
  63. endif()
  64. list(REMOVE_DUPLICATES _versions)
  65. list(SORT _versions)
  66. set(_versions ";${_versions}")
  67. foreach(vers IN LISTS _versions)
  68. list(REMOVE_DUPLICATES _abis_${vers})
  69. endforeach()
  70. # Test failure cases.
  71. message(STATUS "ndk='${ndk}'")
  72. set(RunCMake_TEST_OPTIONS
  73. -DCMAKE_SYSTEM_NAME=Android
  74. -DCMAKE_ANDROID_NDK=${ndk}
  75. -DCMAKE_ANDROID_ARCH_ABI=badabi
  76. )
  77. run_cmake(ndk-badabi)
  78. set(RunCMake_TEST_OPTIONS
  79. -DCMAKE_SYSTEM_NAME=Android
  80. -DCMAKE_ANDROID_NDK=${ndk}
  81. -DCMAKE_ANDROID_ARCH_ABI=x86
  82. -DCMAKE_ANDROID_ARM_MODE=0
  83. )
  84. run_cmake(ndk-badarm)
  85. if("armeabi" IN_LIST _abis_)
  86. set(RunCMake_TEST_OPTIONS
  87. -DCMAKE_SYSTEM_NAME=Android
  88. -DCMAKE_ANDROID_NDK=${ndk}
  89. -DCMAKE_ANDROID_ARM_NEON=0
  90. )
  91. run_cmake(ndk-badneon)
  92. endif()
  93. set(RunCMake_TEST_OPTIONS
  94. -DCMAKE_SYSTEM_NAME=Android
  95. -DCMAKE_ANDROID_NDK=${ndk}
  96. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=badver
  97. )
  98. run_cmake(ndk-badver)
  99. set(RunCMake_TEST_OPTIONS
  100. -DCMAKE_SYSTEM_NAME=Android
  101. -DCMAKE_ANDROID_NDK=${ndk}
  102. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=1.0
  103. )
  104. run_cmake(ndk-badvernum)
  105. set(RunCMake_TEST_OPTIONS
  106. -DCMAKE_SYSTEM_NAME=Android
  107. -DCMAKE_ANDROID_NDK=${ndk}
  108. -DCMAKE_ANDROID_STL_TYPE=badstl
  109. )
  110. run_cmake(ndk-badstl)
  111. unset(RunCMake_TEST_OPTIONS)
  112. # Find a sysroot to test.
  113. file(GLOB _sysroots "${ndk}/platforms/android-[0-9][0-9]/arch-arm")
  114. if(_sysroots)
  115. list(GET _sysroots 0 _sysroot)
  116. set(RunCMake_TEST_OPTIONS
  117. -DCMAKE_SYSTEM_NAME=Android
  118. -DCMAKE_SYSROOT=${_sysroot}
  119. )
  120. run_cmake(ndk-sysroot-armeabi)
  121. unset(RunCMake_TEST_OPTIONS)
  122. endif()
  123. # Find available STLs.
  124. set(stl_types
  125. none
  126. system
  127. gnustl_static
  128. gnustl_shared
  129. )
  130. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gabi++/libs")
  131. list(APPEND stl_types gabi++_static gabi++_shared)
  132. endif()
  133. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/stlport/libs")
  134. list(APPEND stl_types stlport_static stlport_shared)
  135. endif()
  136. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/llvm-libc++/libs")
  137. list(APPEND stl_types c++_static c++_shared)
  138. endif()
  139. # List possible ABIs.
  140. set(abi_names
  141. armeabi
  142. armeabi-v6
  143. armeabi-v7a
  144. arm64-v8a
  145. mips
  146. mips64
  147. x86
  148. x86_64
  149. )
  150. # Test all combinations.
  151. foreach(vers IN LISTS _versions)
  152. foreach(stl IN LISTS stl_types)
  153. foreach(config Release Debug)
  154. # Test this combination for all available abis.
  155. message(STATUS "ndk='${ndk}' vers='${vers}' stl='${stl}' config='${config}'")
  156. set(RunCMake_TEST_OPTIONS
  157. -DCMAKE_ANDROID_NDK=${ndk}
  158. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=${vers}
  159. -DCMAKE_ANDROID_STL_TYPE=${stl}
  160. -DCMAKE_BUILD_TYPE=${config}
  161. )
  162. foreach(abi IN LISTS abi_names)
  163. # Skip ABIs not supported by this compiler.
  164. if(NOT ";${_abis_${vers}};" MATCHES ";${abi};")
  165. continue()
  166. endif()
  167. # Run the tests for this combination.
  168. if("${abi}" STREQUAL "armeabi")
  169. run_Android(ndk-armeabi-thumb) # default: -DCMAKE_ANDROID_ARCH_ABI=armeabi -DCMAKE_ANDROID_ARM_MODE=0
  170. run_Android(ndk-armeabi-arm -DCMAKE_ANDROID_ARM_MODE=1) # default: -DCMAKE_ANDROID_ARCH_ABI=armeabi
  171. else()
  172. run_Android(ndk-${abi} -DCMAKE_ANDROID_ARCH_ABI=${abi})
  173. if("${abi}" STREQUAL "armeabi-v7a")
  174. run_Android(ndk-${abi}-neon -DCMAKE_ANDROID_ARCH_ABI=${abi} -DCMAKE_ANDROID_ARM_NEON=1)
  175. endif()
  176. endif()
  177. endforeach()
  178. unset(RunCMake_TEST_OPTIONS)
  179. endforeach()
  180. endforeach()
  181. endforeach()
  182. endforeach()
  183. foreach(toolchain IN LISTS TEST_ANDROID_STANDALONE_TOOLCHAIN)
  184. message(STATUS "toolchain='${toolchain}'")
  185. set(RunCMake_TEST_OPTIONS
  186. -DCMAKE_SYSTEM_NAME=Android
  187. -DCMAKE_SYSROOT=${toolchain}/sysroot
  188. )
  189. run_cmake(standalone-sysroot)
  190. unset(RunCMake_TEST_OPTIONS)
  191. foreach(config Release Debug)
  192. message(STATUS "toolchain='${toolchain}' config='${config}'")
  193. set(RunCMake_TEST_OPTIONS
  194. -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=${toolchain}
  195. -DCMAKE_BUILD_TYPE=${config}
  196. )
  197. run_Android(standalone)
  198. unset(RunCMake_TEST_OPTIONS)
  199. endforeach()
  200. endforeach()