RunCMakeTest.cmake 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. cmake_minimum_required(VERSION 3.10)
  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. set(configs ".")
  19. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  20. set(configs Release Debug)
  21. endif()
  22. foreach(config IN LISTS configs)
  23. set(build_suffix)
  24. set(config_arg)
  25. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  26. set(build_suffix "-${config}")
  27. set(config_arg --config "${config}")
  28. endif()
  29. run_cmake_command(${case}-build${build_suffix} ${CMAKE_COMMAND} --build . ${config_arg})
  30. endforeach()
  31. endfunction()
  32. set(RunCMake_GENERATOR_PLATFORM_OLD "${RunCMake_GENERATOR_PLATFORM}")
  33. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  34. set(RunCMake_GENERATOR_PLATFORM "ARM")
  35. endif()
  36. set(RunCMake_TEST_OPTIONS
  37. -DCMAKE_SYSTEM_NAME=Android
  38. -DCMAKE_SYSROOT=${CMAKE_CURRENT_SOURCE_DIR}
  39. )
  40. run_cmake(BadSYSROOT)
  41. unset(RunCMake_TEST_OPTIONS)
  42. set(RunCMake_GENERATOR_PLATFORM "${RunCMake_GENERATOR_PLATFORM_OLD}")
  43. foreach(ndk IN LISTS TEST_ANDROID_NDK)
  44. # Load available toolchain versions and abis.
  45. file(GLOB _config_mks
  46. "${ndk}/build/core/toolchains/*/config.mk"
  47. "${ndk}/toolchains/*/config.mk"
  48. )
  49. set(_versions "")
  50. set(_latest_gcc 0)
  51. set(_latest_clang "")
  52. set(_latest_clang_vers 0)
  53. foreach(config_mk IN LISTS _config_mks)
  54. file(STRINGS "${config_mk}" _abis REGEX "^TOOLCHAIN_ABIS +:= +[^ ].*( |$)")
  55. if(_abis AND "${config_mk}" MATCHES [[-((clang)?([0-9]\.[0-9]|))/config\.mk$]])
  56. set(_version "${CMAKE_MATCH_1}")
  57. set(_is_clang "${CMAKE_MATCH_2}")
  58. set(_cur_vers "${CMAKE_MATCH_3}")
  59. if(_is_clang)
  60. if(_latest_clang_vers STREQUAL "")
  61. # already the latest possible
  62. elseif(_cur_vers STREQUAL "" OR _cur_vers VERSION_GREATER _latest_clang_vers)
  63. set(_latest_clang_vers "${_cur_vers}")
  64. set(_latest_clang "${_version}")
  65. endif()
  66. else()
  67. if(_version VERSION_GREATER _latest_gcc)
  68. set(_latest_gcc ${_version})
  69. endif()
  70. endif()
  71. list(APPEND _versions "${_version}")
  72. string(REGEX MATCHALL "[a-z][a-z0-9_-]+" _abis "${_abis}")
  73. list(APPEND _abis_${_version} ${_abis})
  74. endif()
  75. endforeach()
  76. set(_abis_clang ${_abis_${_latest_clang}})
  77. if(_latest_gcc)
  78. set(_abis_ ${_abis_${_latest_gcc}})
  79. else()
  80. set(_abis_ ${_abis_clang})
  81. endif()
  82. if(_versions MATCHES "clang")
  83. set(_versions "clang" ${_versions})
  84. endif()
  85. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  86. set(_versions "clang")
  87. endif()
  88. list(REMOVE_DUPLICATES _versions)
  89. list(SORT _versions)
  90. set(_versions ";${_versions}")
  91. foreach(vers IN LISTS _versions)
  92. list(REMOVE_DUPLICATES _abis_${vers})
  93. endforeach()
  94. set(ndk_arg -DCMAKE_ANDROID_NDK=${ndk})
  95. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  96. set(ndk_arg)
  97. endif()
  98. set(RunCMake_TEST_OPTIONS
  99. -DCMAKE_SYSTEM_NAME=Android
  100. -DCMAKE_FIND_ROOT_PATH=/tmp
  101. ${ndk_arg}
  102. )
  103. run_cmake(ndk-search-order)
  104. # Test failure cases.
  105. message(STATUS "ndk='${ndk}'")
  106. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  107. set(RunCMake_GENERATOR_PLATFORM "ARM")
  108. endif()
  109. set(RunCMake_TEST_OPTIONS
  110. -DCMAKE_SYSTEM_NAME=Android
  111. ${ndk_arg}
  112. -DCMAKE_ANDROID_ARCH_ABI=badabi
  113. )
  114. run_cmake(ndk-badabi)
  115. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  116. set(RunCMake_GENERATOR_PLATFORM "x86")
  117. endif()
  118. set(RunCMake_TEST_OPTIONS
  119. -DCMAKE_SYSTEM_NAME=Android
  120. ${ndk_arg}
  121. -DCMAKE_ANDROID_ARCH_ABI=x86
  122. -DCMAKE_ANDROID_ARM_MODE=0
  123. )
  124. run_cmake(ndk-badarm)
  125. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  126. set(RunCMake_GENERATOR_PLATFORM "ARM")
  127. endif()
  128. if("armeabi" IN_LIST _abis_)
  129. set(RunCMake_TEST_OPTIONS
  130. -DCMAKE_SYSTEM_NAME=Android
  131. ${ndk_arg}
  132. -DCMAKE_ANDROID_ARM_NEON=0
  133. )
  134. run_cmake(ndk-badneon)
  135. endif()
  136. set(RunCMake_TEST_OPTIONS
  137. -DCMAKE_SYSTEM_NAME=Android
  138. ${ndk_arg}
  139. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=badver
  140. )
  141. run_cmake(ndk-badver)
  142. set(RunCMake_TEST_OPTIONS
  143. -DCMAKE_SYSTEM_NAME=Android
  144. ${ndk_arg}
  145. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=1.0
  146. )
  147. run_cmake(ndk-badvernum)
  148. set(RunCMake_TEST_OPTIONS
  149. -DCMAKE_SYSTEM_NAME=Android
  150. ${ndk_arg}
  151. -DCMAKE_ANDROID_STL_TYPE=badstl
  152. )
  153. run_cmake(ndk-badstl)
  154. unset(RunCMake_TEST_OPTIONS)
  155. # Find a sysroot to test.
  156. file(GLOB _sysroots "${ndk}/platforms/android-[0-9][0-9]/arch-arm")
  157. if(_sysroots AND "armeabi" IN_LIST _abis_)
  158. list(GET _sysroots 0 _sysroot)
  159. set(RunCMake_TEST_OPTIONS
  160. -DCMAKE_SYSTEM_NAME=Android
  161. -DCMAKE_SYSROOT=${_sysroot}
  162. )
  163. run_cmake(ndk-sysroot-armeabi)
  164. unset(RunCMake_TEST_OPTIONS)
  165. endif()
  166. set(RunCMake_GENERATOR_PLATFORM "${RunCMake_GENERATOR_PLATFORM_OLD}")
  167. # Find available STLs.
  168. set(stl_types
  169. none
  170. system
  171. )
  172. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gnu-libstdc++")
  173. list(APPEND stl_types gnustl_static gnustl_shared)
  174. endif()
  175. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gabi++/libs")
  176. list(APPEND stl_types gabi++_static gabi++_shared)
  177. endif()
  178. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/stlport/libs")
  179. list(APPEND stl_types stlport_static stlport_shared)
  180. endif()
  181. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/llvm-libc++/libs")
  182. list(APPEND stl_types c++_static c++_shared)
  183. endif()
  184. # List possible ABIs.
  185. set(abi_names
  186. armeabi
  187. armeabi-v6
  188. armeabi-v7a
  189. arm64-v8a
  190. x86
  191. x86_64
  192. )
  193. if(NOT RunCMake_GENERATOR MATCHES "Visual Studio")
  194. list(APPEND abi_names mips mips64)
  195. endif()
  196. set(abi_to_arch_armeabi ARM)
  197. set(abi_to_arch_armeabi-v6 ARM)
  198. set(abi_to_arch_armeabi-v7a ARM)
  199. set(abi_to_arch_arm64-v8a ARM64)
  200. set(abi_to_arch_x86 x86)
  201. set(abi_to_arch_x86_64 x64)
  202. # Test all combinations.
  203. foreach(vers IN LISTS _versions)
  204. foreach(stl IN LISTS stl_types)
  205. set(configs Release Debug)
  206. set(foreach_list "${configs}")
  207. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  208. set(foreach_list ".")
  209. endif()
  210. foreach(config IN LISTS foreach_list)
  211. # Test this combination for all available abis.
  212. set(config_status " config='${config}'")
  213. set(build_type_arg "-DCMAKE_BUILD_TYPE=${config}")
  214. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  215. set(config_status)
  216. string(REPLACE ";" "\\\\;" build_type_arg "-DCMAKE_CONFIGURATION_TYPES=${configs}")
  217. endif()
  218. message(STATUS "ndk='${ndk}' vers='${vers}' stl='${stl}'${config_status}")
  219. set(RunCMake_TEST_OPTIONS
  220. ${ndk_arg}
  221. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=${vers}
  222. -DCMAKE_ANDROID_STL_TYPE=${stl}
  223. "${build_type_arg}"
  224. )
  225. foreach(abi IN LISTS abi_names)
  226. # Skip ABIs not supported by this compiler.
  227. if(NOT ";${_abis_${vers}};" MATCHES ";${abi};")
  228. continue()
  229. endif()
  230. # Run the tests for this combination.
  231. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  232. set(RunCMake_GENERATOR_PLATFORM "${abi_to_arch_${abi}}")
  233. endif()
  234. if("${abi}" STREQUAL "armeabi")
  235. run_Android(ndk-armeabi-thumb) # default: -DCMAKE_ANDROID_ARCH_ABI=armeabi -DCMAKE_ANDROID_ARM_MODE=0
  236. run_Android(ndk-armeabi-arm -DCMAKE_ANDROID_ARM_MODE=1) # default: -DCMAKE_ANDROID_ARCH_ABI=armeabi
  237. else()
  238. run_Android(ndk-${abi} -DCMAKE_ANDROID_ARCH_ABI=${abi})
  239. if("${abi}" STREQUAL "armeabi-v7a")
  240. run_Android(ndk-${abi}-neon -DCMAKE_ANDROID_ARCH_ABI=${abi} -DCMAKE_ANDROID_ARM_NEON=1)
  241. endif()
  242. endif()
  243. set(RunCMake_GENERATOR_PLATFORM "${RunCMake_GENERATOR_PLATFORM_OLD}")
  244. endforeach()
  245. unset(RunCMake_TEST_OPTIONS)
  246. endforeach()
  247. endforeach()
  248. endforeach()
  249. endforeach()
  250. foreach(toolchain IN LISTS TEST_ANDROID_STANDALONE_TOOLCHAIN)
  251. message(STATUS "toolchain='${toolchain}'")
  252. set(RunCMake_TEST_OPTIONS
  253. -DCMAKE_SYSTEM_NAME=Android
  254. -DCMAKE_SYSROOT=${toolchain}/sysroot
  255. )
  256. run_cmake(standalone-sysroot)
  257. unset(RunCMake_TEST_OPTIONS)
  258. foreach(config Release Debug)
  259. message(STATUS "toolchain='${toolchain}' config='${config}'")
  260. set(RunCMake_TEST_OPTIONS
  261. -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=${toolchain}
  262. -DCMAKE_BUILD_TYPE=${config}
  263. )
  264. run_Android(standalone)
  265. unset(RunCMake_TEST_OPTIONS)
  266. endforeach()
  267. endforeach()