RunCMakeTest.cmake 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. cmake_minimum_required(VERSION 3.19) # CMP0053
  2. include(RunCMake)
  3. # Fix Visual Studio generator name
  4. if(RunCMake_GENERATOR MATCHES "^(Visual Studio [0-9]+ [0-9]+) ")
  5. set(RunCMake_GENERATOR "${CMAKE_MATCH_1}")
  6. endif()
  7. set(RunCMake-check-file check.cmake)
  8. include("${RunCMake_SOURCE_DIR}/validate_schema.cmake")
  9. function(run_cmake_presets name)
  10. set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${name}")
  11. set(_source_arg "${RunCMake_TEST_SOURCE_DIR}")
  12. if(CMakePresets_SOURCE_ARG)
  13. set(_source_arg "${CMakePresets_SOURCE_ARG}")
  14. endif()
  15. file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}")
  16. file(MAKE_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}")
  17. configure_file("${RunCMake_SOURCE_DIR}/CMakeLists.txt.in" "${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt" @ONLY)
  18. if(NOT CMakePresets_FILE)
  19. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/${name}.json.in")
  20. endif()
  21. if(EXISTS "${CMakePresets_FILE}")
  22. configure_file("${CMakePresets_FILE}" "${RunCMake_TEST_SOURCE_DIR}/CMakePresets.json" @ONLY)
  23. endif()
  24. if(NOT CMakeUserPresets_FILE)
  25. set(CMakeUserPresets_FILE "${RunCMake_SOURCE_DIR}/${name}User.json.in")
  26. endif()
  27. if(EXISTS "${CMakeUserPresets_FILE}")
  28. configure_file("${CMakeUserPresets_FILE}" "${RunCMake_TEST_SOURCE_DIR}/CMakeUserPresets.json" @ONLY)
  29. endif()
  30. set(_s_arg -S)
  31. if(CMakePresets_NO_S_ARG)
  32. set(_s_arg)
  33. endif()
  34. set(_source_args ${_s_arg} ${_source_arg})
  35. if(CMakePresets_NO_SOURCE_ARGS)
  36. set(_source_args)
  37. endif()
  38. set(_unused_cli --no-warn-unused-cli)
  39. if(CMakePresets_WARN_UNUSED_CLI)
  40. set(_unused_cli)
  41. endif()
  42. set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND}
  43. ${_source_args}
  44. -DRunCMake_TEST=${name}
  45. -DRunCMake_GENERATOR=${RunCMake_GENERATOR}
  46. -DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM}
  47. ${_unused_cli}
  48. --preset=${name}
  49. ${ARGN}
  50. )
  51. run_cmake(${name})
  52. endfunction()
  53. # Test CMakePresets.json errors
  54. set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
  55. run_cmake_presets(NoCMakePresets)
  56. run_cmake_presets(Comment)
  57. run_cmake_presets(JSONParseError)
  58. run_cmake_presets(InvalidRoot)
  59. run_cmake_presets(NoVersion)
  60. run_cmake_presets(InvalidVersion)
  61. run_cmake_presets(LowVersion)
  62. run_cmake_presets(HighVersion)
  63. run_cmake_presets(InvalidVendor)
  64. set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
  65. run_cmake_presets(NoPresets)
  66. set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
  67. run_cmake_presets(InvalidPresets)
  68. run_cmake_presets(PresetNotObject)
  69. run_cmake_presets(NoPresetName)
  70. run_cmake_presets(InvalidPresetName)
  71. run_cmake_presets(EmptyPresetName)
  72. set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
  73. run_cmake_presets(NoPresetGenerator)
  74. set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
  75. run_cmake_presets(InvalidPresetGenerator)
  76. set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
  77. run_cmake_presets(NoPresetBinaryDir)
  78. set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
  79. run_cmake_presets(InvalidPresetBinaryDir)
  80. run_cmake_presets(InvalidVariables)
  81. run_cmake_presets(VariableNotObject)
  82. run_cmake_presets(NoVariableValue)
  83. run_cmake_presets(InvalidVariableValue)
  84. run_cmake_presets(ExtraRootField)
  85. run_cmake_presets(ExtraPresetField)
  86. run_cmake_presets(ExtraVariableField)
  87. run_cmake_presets(FuturePresetInstallDirField)
  88. run_cmake_presets(InvalidPresetVendor)
  89. set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
  90. run_cmake_presets(DuplicatePresets)
  91. run_cmake_presets(CyclicInheritance0)
  92. run_cmake_presets(CyclicInheritance1)
  93. run_cmake_presets(CyclicInheritance2)
  94. run_cmake_presets(InvalidInheritance)
  95. run_cmake_presets(ErrorNoWarningDev)
  96. run_cmake_presets(ErrorNoWarningDeprecated)
  97. set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
  98. run_cmake_presets(InvalidArchitectureStrategy)
  99. run_cmake_presets(UnknownArchitectureStrategy)
  100. run_cmake_presets(InvalidToolsetStrategy)
  101. run_cmake_presets(UnknownToolsetStrategy)
  102. run_cmake_presets(EmptyCacheKey)
  103. run_cmake_presets(EmptyEnvKey)
  104. set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
  105. run_cmake_presets(UnclosedMacro)
  106. run_cmake_presets(NoSuchMacro)
  107. run_cmake_presets(EnvCycle)
  108. run_cmake_presets(EmptyEnv)
  109. run_cmake_presets(EmptyPenv)
  110. run_cmake_presets(InvalidRegex)
  111. set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
  112. run_cmake_presets(ConditionFuture)
  113. run_cmake_presets(SubConditionNull)
  114. # Test cmakeMinimumRequired field
  115. run_cmake_presets(MinimumRequiredInvalid)
  116. set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
  117. run_cmake_presets(MinimumRequiredEmpty)
  118. run_cmake_presets(MinimumRequiredMajor)
  119. run_cmake_presets(MinimumRequiredMinor)
  120. run_cmake_presets(MinimumRequiredPatch)
  121. # Test properly working CMakePresets.json
  122. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/CMakePresets.json.in")
  123. unset(ENV{TEST_ENV})
  124. unset(ENV{TEST_ENV_REF})
  125. unset(ENV{TEST_D_ENV_REF})
  126. set(ENV{TEST_ENV_OVERRIDE} "This environment variable will be overridden")
  127. set(ENV{TEST_PENV} "Process environment variable")
  128. set(ENV{TEST_ENV_REF_PENV} "suffix")
  129. run_cmake_presets(Good "-DTEST_OVERRIDE_1=Overridden value" "-DTEST_OVERRIDE_2:STRING=Overridden value" -C "${RunCMake_SOURCE_DIR}/CacheOverride.cmake" "-UTEST_UNDEF")
  130. unset(ENV{TEST_ENV_OVERRIDE})
  131. unset(ENV{TEST_PENV})
  132. unset(ENV{TEST_ENV_REF_PENV})
  133. run_cmake_presets(GoodNoArgs)
  134. file(REMOVE_RECURSE ${RunCMake_BINARY_DIR}/GoodBinaryUp-build)
  135. run_cmake_presets(GoodBinaryUp)
  136. set(CMakePresets_SOURCE_ARG "../GoodBinaryRelative")
  137. run_cmake_presets(GoodBinaryRelative)
  138. unset(CMakePresets_SOURCE_ARG)
  139. run_cmake_presets(GoodSpaces "--preset" "Good Spaces")
  140. run_cmake_presets(GoodSpacesEq "--preset=Good Spaces")
  141. if(WIN32)
  142. run_cmake_presets(GoodWindowsBackslash)
  143. endif()
  144. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/GoodBOM.json.in")
  145. run_cmake_presets(GoodBOM)
  146. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/CMakePresets.json.in")
  147. file(REMOVE_RECURSE ${RunCMake_BINARY_DIR}/GoodBinaryCmdLine-build)
  148. run_cmake_presets(GoodBinaryCmdLine -B ${RunCMake_BINARY_DIR}/GoodBinaryCmdLine-build)
  149. run_cmake_presets(GoodGeneratorCmdLine -G ${RunCMake_GENERATOR})
  150. run_cmake_presets(InvalidGeneratorCmdLine -G "Invalid Generator")
  151. set(CMakePresets_NO_S_ARG TRUE)
  152. run_cmake_presets(GoodNoS)
  153. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/GoodNoSCachePrep-build")
  154. run_cmake_presets(GoodNoSCachePrep)
  155. set(CMakePresets_SOURCE_ARG ".")
  156. set(RunCMake_TEST_NO_CLEAN 1)
  157. run_cmake_presets(GoodNoSCache)
  158. unset(RunCMake_TEST_NO_CLEAN)
  159. unset(CMakePresets_SOURCE_ARG)
  160. unset(RunCMake_TEST_BINARY_DIR)
  161. unset(CMakePresets_NO_S_ARG)
  162. set(CMakePresets_NO_SOURCE_ARGS 1)
  163. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/GoodNoSourceArg")
  164. set(RunCMake_TEST_NO_CLEAN 1)
  165. run_cmake_presets(GoodNoSourceArg)
  166. unset(RunCMake_TEST_NO_CLEAN)
  167. unset(RunCMake_TEST_BINARY_DIR)
  168. unset(CMakePresets_NO_SOURCE_ARGS)
  169. run_cmake_presets(GoodInheritanceParent)
  170. run_cmake_presets(GoodInheritanceChild)
  171. run_cmake_presets(GoodInheritanceOverride)
  172. run_cmake_presets(GoodInheritanceMulti)
  173. run_cmake_presets(GoodInheritanceMultiSecond)
  174. run_cmake_presets(GoodInheritanceMacro)
  175. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/GoodInstall.json.in")
  176. run_cmake_presets(GoodInstallDefault)
  177. run_cmake_presets(GoodInstallInherit)
  178. run_cmake_presets(GoodInstallOverride)
  179. run_cmake_presets(GoodInstallCommandLine "--install-prefix=${RunCMake_SOURCE_DIR}/path/passed/on/command_line")
  180. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/CMakePresets.json.in")
  181. # Test bad preset arguments
  182. run_cmake_presets(VendorMacro)
  183. run_cmake_presets(InvalidGenerator)
  184. # Test Visual Studio-specific stuff
  185. if(RunCMake_GENERATOR MATCHES "^Visual Studio ")
  186. run_cmake_presets(VisualStudioGeneratorArch)
  187. run_cmake_presets(VisualStudioWin32)
  188. run_cmake_presets(VisualStudioWin64)
  189. run_cmake_presets(VisualStudioWin32Override -A x64)
  190. if(NOT RunCMake_GENERATOR STREQUAL "Visual Studio 9 2008")
  191. run_cmake_presets(VisualStudioToolset)
  192. run_cmake_presets(VisualStudioToolsetOverride -T "Test Toolset")
  193. run_cmake_presets(VisualStudioInheritanceParent)
  194. run_cmake_presets(VisualStudioInheritanceChild)
  195. run_cmake_presets(VisualStudioInheritanceOverride)
  196. run_cmake_presets(VisualStudioInheritanceMulti)
  197. run_cmake_presets(VisualStudioInheritanceMultiSecond)
  198. endif()
  199. else()
  200. run_cmake_presets(ArchToolsetStrategyNone)
  201. run_cmake_presets(ArchToolsetStrategyDefault)
  202. run_cmake_presets(ArchToolsetStrategyIgnore)
  203. endif()
  204. # Test bad command line arguments
  205. run_cmake_presets(NoSuchPreset)
  206. run_cmake_presets(NoPresetArgument --preset)
  207. run_cmake_presets(NoPresetArgumentEq --preset= -DA=B)
  208. run_cmake_presets(UseHiddenPreset)
  209. # Test CMakeUserPresets.json
  210. unset(CMakePresets_FILE)
  211. run_cmake_presets(GoodUserOnly)
  212. run_cmake_presets(GoodUserFromMain)
  213. run_cmake_presets(GoodUserFromUser)
  214. # Test CMakeUserPresets.json errors
  215. run_cmake_presets(UserDuplicateInUser)
  216. run_cmake_presets(UserDuplicateCross)
  217. run_cmake_presets(UserInheritance)
  218. # Test listing presets
  219. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/ListPresets.json.in")
  220. run_cmake_presets(ListPresets --list-presets)
  221. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/ListPresetsWorkingDir")
  222. set(RunCMake_TEST_NO_CLEAN 1)
  223. set(CMakePresets_NO_SOURCE_ARGS 1)
  224. run_cmake_presets(ListPresetsWorkingDir --list-presets)
  225. unset(CMakePresets_NO_SOURCE_ARGS)
  226. unset(RunCMake_TEST_NO_CLEAN)
  227. unset(RunCMake_TEST_BINARY_DIR)
  228. run_cmake_presets(ListPresetsNoSuchPreset)
  229. run_cmake_presets(ListPresetsHidden)
  230. # Test warning and error flags
  231. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/Warnings.json.in")
  232. set(CMakePresets_WARN_UNUSED_CLI 1)
  233. run_cmake_presets(NoWarningFlags)
  234. run_cmake_presets(WarningFlags)
  235. run_cmake_presets(DisableWarningFlags)
  236. run_cmake_presets(ErrorDev)
  237. run_cmake_presets(ErrorDeprecated)
  238. unset(CMakePresets_WARN_UNUSED_CLI)
  239. # Test debug
  240. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/Debug.json.in")
  241. run_cmake_presets(NoDebug)
  242. run_cmake_presets(Debug)
  243. # Test ${hostSystemName} macro
  244. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/HostSystemName.json.in")
  245. run_cmake_presets(HostSystemName)
  246. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/HostSystemNameFuture.json.in")
  247. run_cmake_presets(HostSystemNameFuture)
  248. # Test conditions
  249. set(CMakePresets_FILE "${RunCMake_SOURCE_DIR}/Conditions.json.in")
  250. run_cmake_presets(ListConditions --list-presets)
  251. run_cmake_presets(SimpleTrue)
  252. run_cmake_presets(SimpleFalse)
  253. # Test the example from the documentation
  254. file(READ "${RunCMake_SOURCE_DIR}/../../../Help/manual/presets/example.json" _example)
  255. string(REPLACE "\"generator\": \"Ninja\"" "\"generator\": \"@RunCMake_GENERATOR@\"" _example "${_example}")
  256. file(WRITE "${RunCMake_BINARY_DIR}/example.json.in" "${_example}")
  257. set(CMakePresets_FILE "${RunCMake_BINARY_DIR}/example.json.in")
  258. run_cmake_presets(DocumentationExample --preset=default)