RunCMakeTest.cmake 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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. 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. # Test failure cases.
  99. message(STATUS "ndk='${ndk}'")
  100. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  101. set(RunCMake_GENERATOR_PLATFORM "ARM")
  102. endif()
  103. set(RunCMake_TEST_OPTIONS
  104. -DCMAKE_SYSTEM_NAME=Android
  105. ${ndk_arg}
  106. -DCMAKE_ANDROID_ARCH_ABI=badabi
  107. )
  108. run_cmake(ndk-badabi)
  109. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  110. set(RunCMake_GENERATOR_PLATFORM "x86")
  111. endif()
  112. set(RunCMake_TEST_OPTIONS
  113. -DCMAKE_SYSTEM_NAME=Android
  114. ${ndk_arg}
  115. -DCMAKE_ANDROID_ARCH_ABI=x86
  116. -DCMAKE_ANDROID_ARM_MODE=0
  117. )
  118. run_cmake(ndk-badarm)
  119. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  120. set(RunCMake_GENERATOR_PLATFORM "ARM")
  121. endif()
  122. if("armeabi" IN_LIST _abis_)
  123. set(RunCMake_TEST_OPTIONS
  124. -DCMAKE_SYSTEM_NAME=Android
  125. ${ndk_arg}
  126. -DCMAKE_ANDROID_ARM_NEON=0
  127. )
  128. run_cmake(ndk-badneon)
  129. endif()
  130. set(RunCMake_TEST_OPTIONS
  131. -DCMAKE_SYSTEM_NAME=Android
  132. ${ndk_arg}
  133. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=badver
  134. )
  135. run_cmake(ndk-badver)
  136. set(RunCMake_TEST_OPTIONS
  137. -DCMAKE_SYSTEM_NAME=Android
  138. ${ndk_arg}
  139. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=1.0
  140. )
  141. run_cmake(ndk-badvernum)
  142. set(RunCMake_TEST_OPTIONS
  143. -DCMAKE_SYSTEM_NAME=Android
  144. ${ndk_arg}
  145. -DCMAKE_ANDROID_STL_TYPE=badstl
  146. )
  147. run_cmake(ndk-badstl)
  148. unset(RunCMake_TEST_OPTIONS)
  149. # Find a sysroot to test.
  150. file(GLOB _sysroots "${ndk}/platforms/android-[0-9][0-9]/arch-arm")
  151. if(_sysroots)
  152. list(GET _sysroots 0 _sysroot)
  153. set(RunCMake_TEST_OPTIONS
  154. -DCMAKE_SYSTEM_NAME=Android
  155. -DCMAKE_SYSROOT=${_sysroot}
  156. )
  157. run_cmake(ndk-sysroot-armeabi)
  158. unset(RunCMake_TEST_OPTIONS)
  159. endif()
  160. set(RunCMake_GENERATOR_PLATFORM "${RunCMake_GENERATOR_PLATFORM_OLD}")
  161. # Find available STLs.
  162. set(stl_types
  163. none
  164. system
  165. )
  166. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gnu-libstdc++")
  167. list(APPEND stl_types gnustl_static gnustl_shared)
  168. endif()
  169. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/gabi++/libs")
  170. list(APPEND stl_types gabi++_static gabi++_shared)
  171. endif()
  172. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/stlport/libs")
  173. list(APPEND stl_types stlport_static stlport_shared)
  174. endif()
  175. if(IS_DIRECTORY "${ndk}/sources/cxx-stl/llvm-libc++/libs")
  176. list(APPEND stl_types c++_static c++_shared)
  177. endif()
  178. # List possible ABIs.
  179. set(abi_names
  180. armeabi
  181. armeabi-v6
  182. armeabi-v7a
  183. arm64-v8a
  184. x86
  185. x86_64
  186. )
  187. if(NOT RunCMake_GENERATOR MATCHES "Visual Studio")
  188. list(APPEND abi_names mips mips64)
  189. endif()
  190. set(abi_to_arch_armeabi ARM)
  191. set(abi_to_arch_armeabi-v6 ARM)
  192. set(abi_to_arch_armeabi-v7a ARM)
  193. set(abi_to_arch_arm64-v8a ARM64)
  194. set(abi_to_arch_x86 x86)
  195. set(abi_to_arch_x86_64 x64)
  196. # Test all combinations.
  197. foreach(vers IN LISTS _versions)
  198. foreach(stl IN LISTS stl_types)
  199. set(configs Release Debug)
  200. set(foreach_list "${configs}")
  201. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  202. set(foreach_list ".")
  203. endif()
  204. foreach(config IN LISTS foreach_list)
  205. # Test this combination for all available abis.
  206. set(config_status " config='${config}'")
  207. set(build_type_arg "-DCMAKE_BUILD_TYPE=${config}")
  208. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  209. set(config_status)
  210. string(REPLACE ";" "\\\\;" build_type_arg "-DCMAKE_CONFIGURATION_TYPES=${configs}")
  211. endif()
  212. message(STATUS "ndk='${ndk}' vers='${vers}' stl='${stl}'${config_status}")
  213. set(RunCMake_TEST_OPTIONS
  214. ${ndk_arg}
  215. -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=${vers}
  216. -DCMAKE_ANDROID_STL_TYPE=${stl}
  217. "${build_type_arg}"
  218. )
  219. foreach(abi IN LISTS abi_names)
  220. # Skip ABIs not supported by this compiler.
  221. if(NOT ";${_abis_${vers}};" MATCHES ";${abi};")
  222. continue()
  223. endif()
  224. # Run the tests for this combination.
  225. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  226. set(RunCMake_GENERATOR_PLATFORM "${abi_to_arch_${abi}}")
  227. endif()
  228. if("${abi}" STREQUAL "armeabi")
  229. run_Android(ndk-armeabi-thumb) # default: -DCMAKE_ANDROID_ARCH_ABI=armeabi -DCMAKE_ANDROID_ARM_MODE=0
  230. run_Android(ndk-armeabi-arm -DCMAKE_ANDROID_ARM_MODE=1) # default: -DCMAKE_ANDROID_ARCH_ABI=armeabi
  231. else()
  232. run_Android(ndk-${abi} -DCMAKE_ANDROID_ARCH_ABI=${abi})
  233. if("${abi}" STREQUAL "armeabi-v7a")
  234. run_Android(ndk-${abi}-neon -DCMAKE_ANDROID_ARCH_ABI=${abi} -DCMAKE_ANDROID_ARM_NEON=1)
  235. endif()
  236. endif()
  237. set(RunCMake_GENERATOR_PLATFORM "${RunCMake_GENERATOR_PLATFORM_OLD}")
  238. endforeach()
  239. unset(RunCMake_TEST_OPTIONS)
  240. endforeach()
  241. endforeach()
  242. endforeach()
  243. endforeach()
  244. foreach(toolchain IN LISTS TEST_ANDROID_STANDALONE_TOOLCHAIN)
  245. message(STATUS "toolchain='${toolchain}'")
  246. set(RunCMake_TEST_OPTIONS
  247. -DCMAKE_SYSTEM_NAME=Android
  248. -DCMAKE_SYSROOT=${toolchain}/sysroot
  249. )
  250. run_cmake(standalone-sysroot)
  251. unset(RunCMake_TEST_OPTIONS)
  252. foreach(config Release Debug)
  253. message(STATUS "toolchain='${toolchain}' config='${config}'")
  254. set(RunCMake_TEST_OPTIONS
  255. -DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=${toolchain}
  256. -DCMAKE_BUILD_TYPE=${config}
  257. )
  258. run_Android(standalone)
  259. unset(RunCMake_TEST_OPTIONS)
  260. endforeach()
  261. endforeach()