1
0

RunCMakeTest.cmake 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. include(RunCMake)
  2. if(RunCMake_BUILD_TYPE)
  3. set(Python_BUILD_TYPE "${RunCMake_BUILD_TYPE}")
  4. else()
  5. set(Python_BUILD_TYPE "Release")
  6. endif()
  7. function(run_python test)
  8. set(one_value_args TYPE ACTION VARIANT STRATEGY)
  9. set(multi_value_args OPTIONS)
  10. cmake_parse_arguments(PARSE_ARGV 1 RP "" "${one_value_args}" "${multi_value_args}")
  11. if(RP_UNPARSED_ARGUMENTS)
  12. message(FATAL_ERROR "run_python: unparsed arguments: ${RP_UNPARSED_ARGUMENTS}")
  13. endif()
  14. set(test_name "${test}")
  15. if(RP_VARIANT)
  16. string(APPEND test_name ".${RP_VARIANT}")
  17. set(RunCMake_TEST_VARIANT_DESCRIPTION ".${RP_VARIANT}")
  18. endif()
  19. set(options ${RP_OPTIONS})
  20. if(RP_STRATEGY)
  21. string(APPEND test_name ".${RP_STRATEGY}")
  22. string(APPEND RunCMake_TEST_VARIANT_DESCRIPTION ".${RP_STRATEGY}")
  23. if (NOT RP_TYPE)
  24. set(RP_TYPE ${test})
  25. endif()
  26. list(APPEND options -D${RP_TYPE}_FIND_STRATEGY=${RP_STRATEGY})
  27. endif()
  28. if(RP_TYPE)
  29. list(APPEND options -DPYTHON=${RP_TYPE})
  30. endif()
  31. if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
  32. list(APPEND options -DCMAKE_BUILD_TYPE=${Python_BUILD_TYPE})
  33. endif()
  34. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test_name}-build")
  35. if(options)
  36. run_cmake_with_options(${test} ${options})
  37. else()
  38. run_cmake(${test})
  39. endif()
  40. if(NOT RP_ACTION)
  41. return()
  42. endif()
  43. set(RunCMake_TEST_NO_CLEAN 1)
  44. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  45. run_cmake_command(${test_name}-build ${CMAKE_COMMAND} --build . --config ${Python_BUILD_TYPE})
  46. if(RP_ACTION STREQUAL "BUILD")
  47. return()
  48. endif()
  49. run_cmake_command(${test_name}-run ${CMAKE_CTEST_COMMAND} -C ${Python_BUILD_TYPE} -V)
  50. endfunction()
  51. function(run_python_with_virtualenv test)
  52. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test}-build")
  53. set(virtual_env "${RunCMake_TEST_BINARY_DIR}/py3venv")
  54. run_cmake_with_options(${test} "-DPYTHON3_VIRTUAL_ENV=${virtual_env}")
  55. set(RunCMake_TEST_NO_CLEAN 1)
  56. set(tests Default Standard)
  57. if(CMake_TEST_FindPython2)
  58. list(APPEND tests Only)
  59. endif()
  60. if(test MATCHES "Conda")
  61. set(RunCMake_TEST_VARIANT_DESCRIPTION ".Conda")
  62. set(init_venv --unset=VIRTUAL_ENV "CONDA_PREFIX=${virtual_env}")
  63. else()
  64. set(RunCMake_TEST_VARIANT_DESCRIPTION ".CPython")
  65. set(init_venv --unset=CONDA_PREFIX "VIRTUAL_ENV=${virtual_env}")
  66. endif()
  67. foreach(test IN LISTS tests)
  68. run_cmake_script(VirtualEnv${test} -E env --unset=PYTHONHOME ${init_venv}
  69. "${CMAKE_COMMAND}" "-DPYTHON3_VIRTUAL_ENV=${virtual_env}")
  70. endforeach()
  71. if(CMake_TEST_FindPython2)
  72. string(APPEND RunCMake_TEST_VARIANT_DESCRIPTION ".Unset")
  73. run_cmake_script(VirtualEnvOnly -E env --unset=PYTHONHOME --unset=VIRTUAL_ENV --unset=CONDA_PREFIX
  74. "${CMAKE_COMMAND}")
  75. endif()
  76. endfunction()
  77. macro(required_artifacts_check variant)
  78. run_python(RequiredArtifactsCheck VARIANT ${variant}
  79. OPTIONS "-DPYTHON_ARTIFACTS=${RunCMake_BINARY_DIR}/RequiredArtifacts-build/PythonArtifacts.cmake"
  80. ${ARGN})
  81. endmacro()
  82. function(required_artifacts)
  83. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/RequiredArtifacts-build")
  84. run_cmake_with_options(RequiredArtifacts "-DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}"
  85. "-DCMake_TEST_FindPython3_SABIModule=${CMake_TEST_FindPython3_SABIModule}")
  86. if(EXISTS "${RunCMake_TEST_BINARY_DIR}/PythonArtifacts.cmake")
  87. required_artifacts_check("Interpreter.VALID" -DPYTHON_IS_FOUND=TRUE
  88. -DCHECK_INTERPRETER=ON)
  89. required_artifacts_check("Interpreter.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=INTERPRETER
  90. -DCHECK_INTERPRETER=ON)
  91. required_artifacts_check("Library.VALID" -DPYTHON_IS_FOUND=TRUE
  92. -DCHECK_LIBRARY=ON)
  93. required_artifacts_check("Library.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=LIBRARY
  94. -DCHECK_LIBRARY=ON)
  95. required_artifacts_check("Include.VALID" -DPYTHON_IS_FOUND=TRUE
  96. -DCHECK_INCLUDE=ON)
  97. required_artifacts_check("Include.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=INCLUDE
  98. -DCHECK_INCLUDE=ON)
  99. required_artifacts_check("Interpreter.VALID,Library.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=LIBRARY
  100. -DCHECK_INTERPRETER=ON -DCHECK_LIBRARY=ON)
  101. required_artifacts_check("Library.VALID,Include.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=INCLUDE
  102. -DCHECK_LIBRARY=ON -DCHECK_INCLUDE=ON)
  103. if (CMake_TEST_FindPython3_SABIModule AND WIN32)
  104. required_artifacts_check("SABILibrary.VALID" -DPYTHON_IS_FOUND=TRUE
  105. -DCHECK_SABI_LIBRARY=ON)
  106. required_artifacts_check("SABILibrary.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=SABI_LIBRARY
  107. -DCHECK_SABI_LIBRARY=ON)
  108. endif()
  109. endif()
  110. endfunction()
  111. function(custom_failure_message_check name components)
  112. set(RunCMake_TEST_EXPECT_RESULT 1)
  113. file(READ "${RunCMake_SOURCE_DIR}/CustomFailureMessage.${name}-stderr.txt" RunCMake_TEST_EXPECT_stderr)
  114. run_python(CustomFailureMessage VARIANT "${name}" OPTIONS "-DCHECK_COMPONENTS=${components}" ${ARGN})
  115. endfunction()
  116. if(CMake_TEST_FindPython2_CPython)
  117. run_cmake(Python2-BadComponent)
  118. run_python(Python2Module ACTION RUN)
  119. run_python(Python2Embedded ACTION RUN)
  120. run_python(Python2 STRATEGY LOCATION ACTION RUN)
  121. run_python(Python2 STRATEGY VERSION ACTION RUN)
  122. run_python(Python STRATEGY LOCATION VARIANT V2 ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=2)
  123. run_python(Python STRATEGY VERSION VARIANT V2 OPTIONS ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=2)
  124. run_python(ExactVersion TYPE Python2 STRATEGY LOCATION VARIANT Python2
  125. OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
  126. run_python(ExactVersion TYPE Python2 STRATEGY VERSION VARIANT Python2
  127. OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
  128. run_python(ExactVersion TYPE Python STRATEGY LOCATION VARIANT Python.V2
  129. OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
  130. run_python(ExactVersion TYPE Python STRATEGY VERSION VARIANT Python.V2
  131. OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
  132. run_python(VersionRange TYPE Python2 STRATEGY LOCATION VARIANT Python2
  133. OPTIONS -DPython_REQUESTED_VERSION=2)
  134. run_python(VersionRange TYPE Python2 STRATEGY VERSION VARIANT Python2
  135. OPTIONS -DPython_REQUESTED_VERSION=2)
  136. run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT Python.V2
  137. OPTIONS -DPython_REQUESTED_VERSION=2)
  138. run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT Python.V2
  139. OPTIONS -DPython_REQUESTED_VERSION=2)
  140. endif()
  141. if(CMake_TEST_FindPython3_CPython)
  142. run_cmake(Python3-BadComponent)
  143. run_cmake(DifferentComponents)
  144. run_python(Python3Module ACTION RUN)
  145. if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8)
  146. run_python(Python3Embedded ACTION RUN)
  147. endif()
  148. if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
  149. run_cmake(UnversionedNames)
  150. endif()
  151. run_python(Python3 STRATEGY LOCATION ACTION RUN)
  152. run_python(Python3 STRATEGY VERSION ACTION RUN)
  153. run_python(Python STRATEGY LOCATION VARIANT V3 ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=3)
  154. run_python(Python STRATEGY VERSION VARIANT V3 ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=3)
  155. run_python(ExactVersion TYPE Python3 STRATEGY LOCATION VARIANT Python3
  156. OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
  157. run_python(ExactVersion TYPE Python3 STRATEGY VERSION VARIANT Python3
  158. OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
  159. run_python(ExactVersion TYPE Python STRATEGY LOCATION VARIANT Python.V3
  160. OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
  161. run_python(ExactVersion TYPE Python STRATEGY VERSION VARIANT Python.V3
  162. OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
  163. run_python(VersionRange TYPE Python3 STRATEGY LOCATION VARIANT Python3
  164. OPTIONS -DPython_REQUESTED_VERSION=3)
  165. run_python(VersionRange TYPE Python3 STRATEGY VERSION VARIANT Python3
  166. OPTIONS -DPython_REQUESTED_VERSION=3)
  167. run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT Python.V3
  168. OPTIONS -DPython_REQUESTED_VERSION=3)
  169. run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT Python.V3
  170. OPTIONS -DPython_REQUESTED_VERSION=3)
  171. custom_failure_message_check("Interpreter" "Interpreter" -DPython3_EXECUTABLE=/not/found/interpreter)
  172. custom_failure_message_check("Library" "Development" -DPython3_LIBRARY=/not/found/library)
  173. custom_failure_message_check("Include" "Development" -DPython3_INCLUDE_DIR=/not/found/include)
  174. custom_failure_message_check("Multiple" "Interpreter:Development" -DPython3_EXECUTABLE=/not/found/interpreter
  175. -DPython3_LIBRARY=/not/found/library)
  176. endif()
  177. if(CMake_TEST_FindPython2_CPython OR CMake_TEST_FindPython3_CPython)
  178. run_python(Python STRATEGY LOCATION VARIANT Python ACTION RUN)
  179. run_python(Python STRATEGY VERSION VARIANT Python ACTION RUN)
  180. endif()
  181. if(CMake_TEST_FindPython2_IronPython)
  182. run_python(IronPython TYPE Python2 STRATEGY LOCATION VARIANT IronPython2)
  183. run_python(IronPython TYPE Python2 STRATEGY VERSION VARIANT IronPython2)
  184. run_python(IronPython TYPE Python STRATEGY LOCATION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
  185. run_python(IronPython TYPE Python STRATEGY VERSION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
  186. run_python(VersionRange TYPE Python2 STRATEGY LOCATION VARIANT IronPython2
  187. OPTIONS -DPython_REQUESTED_VERSION=2
  188. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  189. run_python(VersionRange TYPE Python2 STRATEGY VERSION VARIANT IronPython2
  190. OPTIONS -DPython_REQUESTED_VERSION=2
  191. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  192. run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT IronPython.V2
  193. OPTIONS -DPython_REQUESTED_VERSION=2
  194. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  195. run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT IronPython.V2
  196. OPTIONS -DPython_REQUESTED_VERSION=2
  197. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  198. endif()
  199. if(CMake_TEST_FindPython3_IronPython)
  200. run_python(IronPython TYPE Python3 STRATEGY LOCATION VARIANT IronPython3)
  201. run_python(IronPython TYPE Python3 STRATEGY VERSION VARIANT IronPython3)
  202. run_python(IronPython TYPE Python STRATEGY LOCATION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
  203. run_python(IronPython TYPE Python STRATEGY VERSION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
  204. run_python(VersionRange TYPE Python3 STRATEGY LOCATION VARIANT IronPython3
  205. OPTIONS -DPython_REQUESTED_VERSION=3
  206. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  207. run_python(VersionRange TYPE Python3 STRATEGY VERSION VARIANT IronPython3
  208. OPTIONS -DPython_REQUESTED_VERSION=3
  209. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  210. run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT IronPython.V3
  211. OPTIONS -DPython_REQUESTED_VERSION=3
  212. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  213. run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT IronPython.V3
  214. OPTIONS -DPython_REQUESTED_VERSION=3
  215. -DPython2_FIND_IMPLEMENTATIONS=IronPython)
  216. endif()
  217. if(CMake_TEST_FindPython2_IronPython OR CMake_TEST_FindPython3_IronPython)
  218. run_python(IronPython TYPE Python STRATEGY LOCATION VARIANT IronPython)
  219. run_python(IronPython TYPE Python STRATEGY VERSION VARIANT IronPython)
  220. endif()
  221. if (CMake_TEST_FindPython2 AND CMake_TEST_FindPython2_IronPython)
  222. run_python(Implementation VARIANT CPython2 OPTIONS -DPython_REQUESTED_VERSION=2
  223. -DPython_REQUESTED_IMPLEMENTATIONS=CPython)
  224. run_python(Implementation VARIANT IronPython2 OPTIONS -DPython_REQUESTED_VERSION=2
  225. -DPython_REQUESTED_IMPLEMENTATIONS=IronPython)
  226. endif()
  227. if (CMake_TEST_FindPython3 AND CMake_TEST_FindPython3_IronPython)
  228. run_python(Implementation VARIANT CPython3 OPTIONS -DPython_REQUESTED_VERSION=3
  229. -DPython_REQUESTED_IMPLEMENTATIONS=CPython)
  230. run_python(Implementation VARIANT IronPython3 OPTIONS -DPython_REQUESTED_VERSION=3
  231. -DPython_REQUESTED_IMPLEMENTATIONS=IronPython)
  232. endif()
  233. if(CMake_TEST_FindPython2_PyPy)
  234. run_python(PyPy TYPE Python2 STRATEGY LOCATION VARIANT PyPy2)
  235. run_python(PyPy TYPE Python2 STRATEGY VERSION VARIANT PyPy2)
  236. run_python(PyPy TYPE Python STRATEGY LOCATION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
  237. run_python(PyPy TYPE Python STRATEGY VERSION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
  238. endif()
  239. if(CMake_TEST_FindPython3_PyPy)
  240. run_python(PyPy TYPE Python3 STRATEGY LOCATION VARIANT PyPy3)
  241. run_python(PyPy TYPE Python3 STRATEGY VERSION VARIANT PyPy3)
  242. run_python(PyPy TYPE Python STRATEGY LOCATION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
  243. run_python(PyPy TYPE Python STRATEGY VERSION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
  244. endif()
  245. if(CMake_TEST_FindPython2_PyPy OR CMake_TEST_FindPython3_PyPy)
  246. run_python(PyPy TYPE Python STRATEGY LOCATION VARIANT PyPy)
  247. run_python(PyPy TYPE Python STRATEGY VERSION VARIANT PyPy)
  248. endif()
  249. if(CMake_TEST_FindPython_Various)
  250. if(CMake_TEST_FindPython3)
  251. run_python_with_virtualenv(VirtualEnv)
  252. required_artifacts()
  253. run_python(ArtifactsInteractive VARIANT "ON"
  254. OPTIONS -DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy}
  255. -DPython3_ARTIFACTS_INTERACTIVE=ON)
  256. run_python(ArtifactsInteractive VARIANT "OFF"
  257. OPTIONS -DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy}
  258. -DPython3_ARTIFACTS_INTERACTIVE=OFF)
  259. endif()
  260. if(CMake_TEST_FindPython2 OR CMake_TEST_FindPython3)
  261. if (CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
  262. run_python(SOABI VARIANT "Interpreter" ACTION BUILD
  263. OPTIONS -DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}
  264. -DCMake_TEST_FindPython3=${CMake_TEST_FindPython3}
  265. -DCMake_TEST_FindPython_COMPONENT=Interpreter)
  266. run_python(SOABI VARIANT "Development" ACTION BUILD
  267. OPTIONS -DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}
  268. -DCMake_TEST_FindPython3=${CMake_TEST_FindPython3}
  269. -DCMake_TEST_FindPython_COMPONENT=Development)
  270. endif()
  271. run_python(MultiplePackages ACTION RUN
  272. OPTIONS -DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}
  273. -DCMake_TEST_FindPython3=${CMake_TEST_FindPython3})
  274. endif()
  275. if(CMake_TEST_FindPython2 AND CMake_TEST_FindPython3)
  276. run_cmake(ArtifactsPrefix)
  277. endif()
  278. if(CMake_TEST_FindPython2_SABIModule)
  279. run_cmake(Python2SABIModule)
  280. endif()
  281. if(CMake_TEST_FindPython3_SABIModule)
  282. run_python(Python3SABIModule)
  283. endif()
  284. if(CMake_TEST_FindPython2_NumPy OR CMake_TEST_FindPython3_NumPy)
  285. run_python(NumPy ACTION RUN
  286. OPTIONS -DCMake_TEST_FindPython2_NumPy=${CMake_TEST_FindPython2_NumPy}
  287. -DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy})
  288. run_python(NumPyOnly ACTION RUN
  289. OPTIONS -DCMake_TEST_FindPython2_NumPy=${CMake_TEST_FindPython2_NumPy}
  290. -DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy})
  291. if(CMake_TEST_FindPython3_NumPy)
  292. custom_failure_message_check("NumPy" "Interpreter:Development:NumPy" -DPython3_NumPy_INCLUDE_DIR=/not/found/numpy/include)
  293. endif()
  294. endif()
  295. if(CMake_TEST_FindPython3_Conda)
  296. run_python_with_virtualenv(VirtualEnvConda)
  297. endif()
  298. endif()