CMakeLists.txt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. cmake_minimum_required (VERSION 2.8.8)
  2. project(GeneratorExpression)
  3. include(CTest)
  4. # Real projects normally want the MSYS shell path conversion, but for this test
  5. # we need to verify that the command line is constructed with the proper string.
  6. set(msys1_prefix "")
  7. set(msys2_no_conv "")
  8. if(CMAKE_GENERATOR STREQUAL "MSYS Makefiles")
  9. execute_process(COMMAND "uname" OUTPUT_VARIABLE uname)
  10. if("${uname}" MATCHES "^MINGW32")
  11. # MinGW.org MSYS 1.0 does not support generic path conversion suppression
  12. set(msys1_prefix MSYS1_PREFIX)
  13. else()
  14. # msys2 supports generic path conversion suppression
  15. set(msys2_no_conv env MSYS2_ARG_CONV_EXCL=-D)
  16. endif()
  17. endif()
  18. # This test is split into multiple parts as needed to avoid NMake command
  19. # length limits.
  20. add_custom_target(check-part1 ALL
  21. COMMAND ${msys2_no_conv} ${CMAKE_COMMAND}
  22. -Dtest_0=$<0:nothing>
  23. -Dtest_0_with_comma=$<0:-Wl,--no-undefined>
  24. -Dtest_1=$<1:content>
  25. -Dtest_1_with_comma=$<1:-Wl,--no-undefined>
  26. -Dconfig=$<CONFIGURATION>
  27. -Dshort_config=$<CONFIG>
  28. -Dtest_and_0=$<AND:0>
  29. -Dtest_and_0_0=$<AND:0,0>
  30. -Dtest_and_0_1=$<AND:0,1>
  31. -Dtest_and_1=$<AND:1>
  32. -Dtest_and_1_0=$<AND:1,0>
  33. -Dtest_and_1_1=$<AND:1,1>
  34. # Ordinarily, the 'invalidcontent' would cause an error, but
  35. # the '0' makes the AND abort early.
  36. -Dtest_and_0_invalidcontent=$<AND:0,invalidcontent>
  37. -Dtest_config_0=$<CONFIG:$<CONFIGURATION>x>
  38. -Dtest_config_1=$<CONFIG:$<CONFIGURATION>>
  39. -Dtest_config_debug=$<CONFIG:Debug,DEBUG,DeBuG>
  40. -Dtest_config_release=$<CONFIG:Release>$<CONFIG:RELEASE,ReLeAsE>
  41. -Dtest_config_relwithdebinfo=$<CONFIG:RelWithDebInfo,RELWITHDEBINFO>$<CONFIG:relwithdebinfo>
  42. -Dtest_config_minsizerel=$<CONFIG:MinSizeRel>$<CONFIG:MINSIZEREL>$<CONFIG:minsizerel>
  43. -Dtest_not_0=$<NOT:0>
  44. -Dtest_not_1=$<NOT:1>
  45. -Dtest_or_0=$<OR:0>
  46. -Dtest_or_0_0=$<OR:0,0>
  47. -Dtest_or_0_1=$<OR:0,1>
  48. -Dtest_or_1=$<OR:1>
  49. -Dtest_or_1_0=$<OR:1,0>
  50. -Dtest_or_1_1=$<OR:1,1>
  51. -Dtest_or_1_invalidcontent=$<OR:1,invalidcontent>
  52. -Dtest_bool_notfound=$<BOOL:NOTFOUND>
  53. -Dtest_bool_foo_notfound=$<BOOL:Foo-NOTFOUND>
  54. -Dtest_bool_true=$<BOOL:True>
  55. -Dtest_bool_false=$<BOOL:False>
  56. -Dtest_bool_on=$<BOOL:On>
  57. -Dtest_bool_off=$<BOOL:Off>
  58. -Dtest_bool_no=$<BOOL:No>
  59. -Dtest_bool_n=$<BOOL:N>
  60. -Dtest_bool_empty=$<BOOL:>
  61. -Dtest_strequal_yes_yes=$<STREQUAL:Yes,Yes>
  62. -Dtest_strequal_yes_yes_cs=$<STREQUAL:Yes,yes>
  63. -Dtest_strequal_yes_no=$<STREQUAL:Yes,No>
  64. -Dtest_strequal_no_yes=$<STREQUAL:No,Yes>
  65. -Dtest_strequal_angle_r=$<STREQUAL:$<ANGLE-R>,$<ANGLE-R>>
  66. -Dtest_strequal_comma=$<STREQUAL:$<COMMA>,$<COMMA>>
  67. -Dtest_strequal_semicolon=$<STREQUAL:$<SEMICOLON>,$<SEMICOLON>>
  68. -Dtest_strequal_angle_r_comma=$<STREQUAL:$<ANGLE-R>,$<COMMA>>
  69. -Dtest_strequal_quote=$<STREQUAL:$<QUOTE>,$<QUOTE>>
  70. -Dtest_strequal_both_empty=$<STREQUAL:,>
  71. -Dtest_strequal_one_empty=$<STREQUAL:something,>
  72. -Dtest_inlist_true=$<IN_LIST:a,a$<SEMICOLON>b>
  73. -Dtest_inlist_false=$<IN_LIST:c,a$<SEMICOLON>b>
  74. -Dtest_inlist_empty_1=$<IN_LIST:a,>
  75. -Dtest_inlist_empty_2=$<IN_LIST:,a>
  76. -Dtest_inlist_empty_3=$<IN_LIST:,>
  77. -Dtest_angle_r=$<ANGLE-R>
  78. -Dtest_comma=$<COMMA>
  79. -Dtest_semicolon=$<SEMICOLON>
  80. -Dtest_colons_1=$<1::>
  81. -Dtest_colons_2=$<1:::>
  82. -Dtest_colons_3=$<1:Qt5::Core>
  83. -Dtest_colons_4=$<1:C:\\CMake>
  84. -Dtest_colons_5=$<1:C:/CMake>
  85. -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part1.cmake
  86. COMMAND ${CMAKE_COMMAND} -E echo "check done (part 1 of 5)"
  87. VERBATIM
  88. )
  89. add_library(empty1 empty.cpp)
  90. target_include_directories(empty1 PUBLIC /empty1/public)
  91. target_include_directories(empty1 PRIVATE /empty1/private)
  92. add_library(empty2 empty.cpp)
  93. target_include_directories(empty2 PUBLIC /empty2/public)
  94. add_library(empty3 empty.cpp)
  95. target_include_directories(empty3 PUBLIC /empty3/public)
  96. target_include_directories(empty3 PRIVATE /empty3/private)
  97. add_library(empty4 empty.cpp)
  98. target_include_directories(empty4 PUBLIC /empty4/public)
  99. target_link_libraries(empty1 LINK_PUBLIC empty2)
  100. target_link_libraries(empty2 LINK_PUBLIC empty3 empty4)
  101. target_link_libraries(empty3 LINK_PUBLIC empty2 empty4)
  102. add_library(empty5 empty.cpp)
  103. target_include_directories(empty5 PRIVATE /empty5/private1 /empty5/private2)
  104. add_library(interface1 INTERFACE)
  105. target_sources(interface1 INTERFACE foo.c bar.cpp)
  106. set(interface1Sources $<TARGET_PROPERTY:interface1,INTERFACE_SOURCES>)
  107. set(interface1MergeSources $<LIST:APPEND,$<LIST:FILTER,${interface1Sources},INCLUDE,.*\\.c$>,$<LIST:FILTER,${interface1Sources},EXCLUDE,.*\\.c$>>)
  108. add_library(interface2 INTERFACE)
  109. target_sources(interface2 INTERFACE ${interface1MergeSources})
  110. add_custom_target(check-part2 ALL
  111. COMMAND ${msys2_no_conv} ${CMAKE_COMMAND}
  112. -Dtest_incomplete_1=$<
  113. -Dtest_incomplete_2=$<something
  114. -Dtest_incomplete_3=$<something:
  115. -Dtest_incomplete_4=$<something:,
  116. -Dtest_incomplete_5=$something:,>
  117. -Dtest_incomplete_6=<something:,>
  118. -Dtest_incomplete_7=$<something::
  119. -Dtest_incomplete_8=$<something:,
  120. -Dtest_incomplete_9=$<something:,,
  121. -Dtest_incomplete_10=$<something:,:
  122. -Dtest_incomplete_11=$<something,,
  123. -Dtest_incomplete_12=$<,,
  124. -Dtest_incomplete_13=$<some$<1:special>thing
  125. -Dtest_incomplete_14=$<$<ANGLE-R>
  126. -Dtest_incomplete_15=$<some$<thing
  127. -Dtest_incomplete_16=$<BOOL:something
  128. -Dtest_incomplete_17=$<1:some$thing>
  129. -Dtest_incomplete_18=$<1:some,thing
  130. -Dtest_incomplete_19=$<1:some,thing$<ANGLE-R>
  131. -Dtest_incomplete_20=$<CONFIGURATION$<ANGLE-R>
  132. -Dtest_incomplete_21=$<BOOL:something$<ANGLE-R>
  133. -Dtest_build_interface=$<BUILD_INTERFACE:build>
  134. -Dtest_install_interface=$<INSTALL_INTERFACE:install>
  135. -Dtest_target_name_1=$<TARGET_NAME:tgt,ok>
  136. -Dtest_target_name_2=$<TARGET_NAME:tgt:ok>
  137. -Dtest_target_includes1=$<TARGET_PROPERTY:empty1,INTERFACE_INCLUDE_DIRECTORIES>
  138. -Dtest_target_includes2=$<TARGET_PROPERTY:empty2,INTERFACE_INCLUDE_DIRECTORIES>
  139. -Dtest_target_includes3=$<TARGET_PROPERTY:empty3,INTERFACE_INCLUDE_DIRECTORIES>
  140. -Dtest_target_includes4=$<TARGET_PROPERTY:empty1,INCLUDE_DIRECTORIES>
  141. -Dtest_target_includes5=$<TARGET_PROPERTY:empty2,INCLUDE_DIRECTORIES>
  142. -Dtest_target_includes6=$<TARGET_PROPERTY:empty3,INCLUDE_DIRECTORIES>
  143. -Dtest_target_includes7=$<TARGET_PROPERTY:empty1,INTERFACE_INCLUDE_DIRECTORIES>
  144. -Dtest_target_includes8=$<TARGET_PROPERTY:empty5,INCLUDE_DIRECTORIES>
  145. -Dtest_target_closure1=$<JOIN:$<LIST:SORT,${interface1MergeSources}>,$<COMMA>>
  146. -Dtest_target_closure2=$<JOIN:$<LIST:SORT,$<TARGET_PROPERTY:interface2,INTERFACE_SOURCES>>,$<COMMA>>
  147. -Dtest_arbitrary_content_comma_1=$<1:a,>
  148. -Dtest_arbitrary_content_comma_2=$<1:,a>
  149. -Dtest_arbitrary_content_comma_3=$<1:a,,>
  150. -Dtest_arbitrary_content_comma_4=$<1:,>
  151. -Dtest_arbitrary_content_comma_5=$<1:,,>
  152. -Dtest_arbitrary_content_comma_6=$<1:,,,>
  153. -Dtest_arbitrary_content_comma_7=$<1:,,a>
  154. -Dtest_arbitrary_content_comma_8=$<1:a,,b>
  155. -Dtest_arbitrary_content_comma_9=$<1:a,,b,,>
  156. -Dtest_arbitrary_content_comma_10=$<1:,,a,,b,,>
  157. -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part2.cmake
  158. COMMAND ${CMAKE_COMMAND} -E echo "check done (part 2 of 5)"
  159. VERBATIM
  160. )
  161. add_library(imported1 SHARED IMPORTED)
  162. set_property(TARGET imported1 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  163. set_property(TARGET imported1 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
  164. set_property(TARGET imported1 PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
  165. set_property(TARGET imported1 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "/imported1/include/with space")
  166. add_library(imported2 SHARED IMPORTED)
  167. set_property(TARGET imported2 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  168. set_property(TARGET imported2 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
  169. set_property(TARGET imported2 PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
  170. set_property(TARGET imported2 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "/imported2/include/with space")
  171. add_library(imported3 SHARED IMPORTED)
  172. set_property(TARGET imported3 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  173. set_property(TARGET imported3 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
  174. # Both Debug and Release should not be true when this is evaluated.
  175. set_property(TARGET imported3 APPEND PROPERTY
  176. INTERFACE_INCLUDE_DIRECTORIES $<$<CONFIG:DEBUG>:$<TARGET_PROPERTY:imported1,INTERFACE_INCLUDE_DIRECTORIES>>)
  177. set_property(TARGET imported3 APPEND PROPERTY
  178. INTERFACE_INCLUDE_DIRECTORIES $<$<CONFIG:RELEASE,RELWITHDEBINFO>:$<TARGET_PROPERTY:imported2,INTERFACE_INCLUDE_DIRECTORIES>>)
  179. set_property(TARGET imported3 APPEND PROPERTY
  180. INTERFACE_INCLUDE_DIRECTORIES $<$<CONFIG:MINSIZEREL>:$<TARGET_PROPERTY:imported2,INTERFACE_INCLUDE_DIRECTORIES>>)
  181. add_library(imported4 SHARED IMPORTED)
  182. set_property(TARGET imported4 APPEND PROPERTY
  183. INCLUDE_DIRECTORIES $<TARGET_PROPERTY:imported3,INTERFACE_INCLUDE_DIRECTORIES>)
  184. add_executable(someexe $<1:empty.cpp> $<0:does_not_exist>)
  185. add_executable(Alias::SomeExe ALIAS someexe)
  186. add_library(Alias::SomeLib ALIAS empty1)
  187. add_library(importedFallback STATIC IMPORTED)
  188. set_property(TARGET importedFallback PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
  189. set_property(TARGET importedFallback PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  190. set_property(TARGET importedFallback PROPERTY IMPORTED_LOCATION fallback_loc)
  191. set_property(TARGET importedFallback PROPERTY MAP_IMPORTED_CONFIG_DEBUG "" DEBUG)
  192. set_property(TARGET importedFallback PROPERTY MAP_IMPORTED_CONFIG_RELEASE "")
  193. add_library(importedFallback2 SHARED IMPORTED)
  194. set_property(TARGET importedFallback2 PROPERTY ENABLE_EXPORTS TRUE)
  195. set_property(TARGET importedFallback2 PROPERTY IMPORTED_LOCATION_NOCONFIG noconfig_loc)
  196. set_property(TARGET importedFallback2 PROPERTY IMPORTED_IMPLIB_NOCONFIG noconfig_imp)
  197. set_property(TARGET importedFallback2 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
  198. set_property(TARGET importedFallback2 PROPERTY IMPORTED_IMPLIB_DEBUG debug_imp)
  199. set_property(TARGET importedFallback2 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  200. set_property(TARGET importedFallback2 PROPERTY IMPORTED_IMPLIB_RELEASE release_imp)
  201. set_property(TARGET importedFallback2 PROPERTY IMPORTED_LOCATION fallback_loc)
  202. set_property(TARGET importedFallback2 PROPERTY IMPORTED_IMPLIB fallback_imp)
  203. set_property(TARGET importedFallback2 PROPERTY IMPORTED_IMPLIB_SPECIAL special_imp)
  204. set_property(TARGET importedFallback2 PROPERTY MAP_IMPORTED_CONFIG_NOCONFIG SPECIAL "")
  205. set_property(TARGET importedFallback2 PROPERTY MAP_IMPORTED_CONFIG_DEBUG SPECIAL "")
  206. set_property(TARGET importedFallback2 PROPERTY MAP_IMPORTED_CONFIG_RELEASE SPECIAL "")
  207. set_property(TARGET importedFallback2 PROPERTY MAP_IMPORTED_CONFIG_RELWITHDEBINFO SPECIAL "")
  208. add_library(importedFallback3 SHARED IMPORTED)
  209. set_property(TARGET importedFallback3 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
  210. set_property(TARGET importedFallback3 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  211. set_property(TARGET importedFallback3 PROPERTY IMPORTED_LOCATION fallback_loc)
  212. set_property(TARGET importedFallback3 PROPERTY IMPORTED_IMPLIB imp_loc)
  213. set_property(TARGET importedFallback3 PROPERTY MAP_IMPORTED_CONFIG_DEBUG "" DEBUG)
  214. set_property(TARGET importedFallback3 PROPERTY MAP_IMPORTED_CONFIG_RELEASE "")
  215. add_library(importedFallback4 SHARED IMPORTED)
  216. set_property(TARGET importedFallback4 PROPERTY IMPORTED_LOCATION fallback_loc)
  217. set_property(TARGET importedFallback4 PROPERTY IMPORTED_IMPLIB imp_loc)
  218. add_library(importedFallback5 SHARED IMPORTED)
  219. set_property(TARGET importedFallback5 PROPERTY IMPORTED_IMPLIB imp_loc)
  220. add_library(importedFallback_genex STATIC IMPORTED)
  221. set_property(TARGET importedFallback_genex PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
  222. set_property(TARGET importedFallback_genex PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
  223. set_property(TARGET importedFallback_genex PROPERTY
  224. INTERFACE_COMPILE_DEFINITIONS $<$<CONFIG:Release>:FOOBAR=1>)
  225. add_custom_target(check-part3 ALL
  226. COMMAND ${msys2_no_conv} ${CMAKE_COMMAND}
  227. -Dtest_version_greater_1=$<VERSION_GREATER:1.0,1.1.1>
  228. -Dtest_version_greater_2=$<VERSION_GREATER:1.1.1,1.0>
  229. -Dtest_version_less_1=$<VERSION_LESS:1.1.1,1.0>
  230. -Dtest_version_less_2=$<VERSION_LESS:1.0,1.1.1>
  231. -Dtest_version_equal_1=$<VERSION_EQUAL:1.0.1,1.1>
  232. -Dtest_version_equal_2=$<VERSION_EQUAL:1.1,1.1>
  233. -Dconfig=$<CONFIGURATION>
  234. -Dtest_imported_includes=$<TARGET_PROPERTY:imported4,INCLUDE_DIRECTORIES>
  235. -Dtest_imported_fallback=$<STREQUAL:$<TARGET_FILE_NAME:importedFallback>,fallback_loc>
  236. -Dtest_imported_fallback2=$<STREQUAL:$<TARGET_LINKER_FILE_NAME:importedFallback2>,special_imp>
  237. -Dtest_imported_fallback3=$<IF:$<PLATFORM_ID:Windows,CYGWIN,MSYS>,$<STREQUAL:$<TARGET_LINKER_FILE_NAME:importedFallback3>,imp_loc>,$<STREQUAL:$<TARGET_LINKER_FILE_NAME:importedFallback3>,fallback_loc>>
  238. -Dtest_imported_fallback4=$<IF:$<PLATFORM_ID:Windows,CYGWIN,MSYS>,$<STREQUAL:$<TARGET_LINKER_FILE_NAME:importedFallback4>,imp_loc>,$<STREQUAL:$<TARGET_LINKER_FILE_NAME:importedFallback4>,fallback_loc>>
  239. -Dtest_imported_fallback5=$<STREQUAL:$<TARGET_LINKER_FILE_NAME:importedFallback5>,imp_loc>
  240. -Dtest_imported_fallback_genex=$<STREQUAL:$<TARGET_PROPERTY:importedFallback_genex,INTERFACE_COMPILE_DEFINITIONS>,FOOBAR=1>
  241. -Dtest_alias_file_exe=$<STREQUAL:$<TARGET_FILE:Alias::SomeExe>,$<TARGET_FILE:someexe>>
  242. -Dtest_alias_file_lib=$<STREQUAL:$<TARGET_FILE:Alias::SomeLib>,$<TARGET_FILE:empty1>>
  243. -Dtest_alias_target_name=$<STREQUAL:$<TARGET_PROPERTY:Alias::SomeLib,NAME>,$<TARGET_PROPERTY:empty1,NAME>>
  244. -Dtest_early_termination_1=$<$<1:>:
  245. -Dtest_early_termination_2=$<$<1:>:,
  246. -Dsystem_name=${CMAKE_HOST_SYSTEM_NAME}
  247. -Dtest_platform_id=$<PLATFORM_ID>
  248. -Dtest_platform_id_supported=$<PLATFORM_ID:Linux,Windows,Darwin>
  249. -Dtest_platform_id_Linux=$<PLATFORM_ID:Linux>
  250. -Dtest_platform_id_Windows=$<PLATFORM_ID:Windows>
  251. -Dtest_platform_id_Darwin=$<PLATFORM_ID:Darwin>
  252. -Dlower_case=$<LOWER_CASE:Mi,XeD>
  253. -Dupper_case=$<UPPER_CASE:MiX,eD>
  254. -Dmake_c_identifier=$<MAKE_C_IDENTIFIER:4f,oo:+bar-$>
  255. -Dequal1=$<EQUAL:1,2>
  256. -Dequal2=$<EQUAL:1,1>
  257. -Dequal3=$<EQUAL:0x1,1>
  258. -Dequal4=$<EQUAL:0X1,2>
  259. -Dequal5=$<EQUAL:0xA,0xa>
  260. -Dequal6=$<EQUAL:0xA,10>
  261. -Dequal7=$<EQUAL:0xA,012>
  262. -Dequal8=$<EQUAL:10,012>
  263. -Dequal9=$<EQUAL:10,010>
  264. -Dequal10=$<EQUAL:10,0b1010>
  265. -Dequal11=$<EQUAL:-10,-0xa>
  266. -Dequal12=$<EQUAL:10,+0xa>
  267. -Dequal13=$<EQUAL:+10,+0Xa>
  268. -Dequal14=$<EQUAL:+10,0xa>
  269. -Dequal15=$<EQUAL:-10,-0Xa>
  270. -Dequal16=$<EQUAL:-10,-0b1010>
  271. -Dequal17=$<EQUAL:-10,+0b1010>
  272. -Dequal18=$<EQUAL:10,+0B1010>
  273. -Dequal19=$<EQUAL:10,-0B1010>
  274. -Dequal20=$<EQUAL:10,0B1010>
  275. -Dequal21=$<EQUAL:10,+012>
  276. -Dequal22=$<EQUAL:10,-012>
  277. -Dequal23=$<EQUAL:-10,-012>
  278. -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part3.cmake
  279. COMMAND ${CMAKE_COMMAND} -E echo "check done (part 3 of 5)"
  280. VERBATIM
  281. )
  282. if(WIN32)
  283. set(test_shell_path c:/shell/path)
  284. set(test_shell_path2 c:/shell/path d:/another/path)
  285. else()
  286. set(test_shell_path /shell/path)
  287. set(test_shell_path2 /shell/path /another/path)
  288. endif()
  289. set(test_shell_path_genex "$<SHELL_PATH:${test_shell_path}>")
  290. set(test_shell_path2_genex "$<SHELL_PATH:${test_shell_path2}>")
  291. if(msys1_prefix)
  292. # Add a prefix to the value produced by the genex so that the path does
  293. # not look absolute, thus suppressing conversion by MSYS 1.0 bash.
  294. set(test_shell_path_genex "${msys1_prefix}${test_shell_path_genex}")
  295. # There is no way to suppress conversion of the second path in
  296. # MSYS 1.0 bash, so do the comparison at generate time instead.
  297. set(test_shell_path2_genex "$<STREQUAL:${test_shell_path2_genex},/c/shell/path:/d/another/path>")
  298. endif()
  299. add_custom_target(check-part4 ALL
  300. COMMAND ${msys2_no_conv} ${CMAKE_COMMAND}
  301. # Prefix path to bypass its further conversion when being processed by
  302. # CMake as command-line argument
  303. -Dmsys1_prefix=${msys1_prefix}
  304. "-Dtest_shell_path=${test_shell_path_genex}"
  305. "-Dtest_shell_path2=${test_shell_path2_genex}"
  306. -Dif_1=$<IF:1,a,b>
  307. -Dif_2=$<IF:0,a,b>
  308. -Dif_3=$<IF:$<EQUAL:10,30>,a,b>
  309. -Dif_4=$<IF:$<EQUAL:30,30>,a,b>
  310. -DWIN32=${WIN32}
  311. -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
  312. -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part4.cmake
  313. COMMAND ${CMAKE_COMMAND} -E echo "check done (part 4 of 5)"
  314. VERBATIM
  315. )
  316. add_custom_target(check-part5 ALL
  317. COMMAND ${CMAKE_COMMAND} -E echo "check done (part 5 of 5)"
  318. DEPENDS check-part5.stamp
  319. VERBATIM
  320. )
  321. add_custom_command(
  322. OUTPUT check-part5.stamp
  323. DEPENDS $<FILTER:file.foo.bar,EXCLUDE,\\.foo\\.bar$>
  324. COMMAND ${CMAKE_COMMAND} -E sleep 0
  325. VERBATIM
  326. )
  327. set_property(SOURCE check-part5.stamp PROPERTY SYMBOLIC 1)
  328. add_custom_command(
  329. OUTPUT file.foo.bar
  330. COMMAND ${CMAKE_COMMAND} -P check-part5.cmake
  331. VERBATIM
  332. )
  333. #-----------------------------------------------------------------------------
  334. # Cover source file properties with generator expressions.
  335. ## generate various source files
  336. foreach (item IN ITEMS flags flags_COMPILE_LANGUAGE
  337. options options_COMPILE_LANGUAGE
  338. defs defs_COMPILE_LANGUAGE)
  339. set(TARGET_NAME srcgenex_${item})
  340. configure_file(srcgenex.c.in ${TARGET_NAME}.c @ONLY)
  341. endforeach()
  342. add_executable(srcgenex_flags "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_flags.c")
  343. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_flags.c"
  344. PROPERTY COMPILE_FLAGS "-DNAME=$<TARGET_PROPERTY:NAME>")
  345. add_executable(srcgenex_flags_COMPILE_LANGUAGE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_flags_COMPILE_LANGUAGE.c")
  346. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_flags_COMPILE_LANGUAGE.c"
  347. PROPERTY COMPILE_FLAGS "$<$<COMPILE_LANGUAGE:C>:-DNAME=$<TARGET_PROPERTY:NAME>>")
  348. add_executable(srcgenex_options "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_options.c")
  349. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_options.c"
  350. PROPERTY COMPILE_OPTIONS -DUNUSED -DNAME=$<TARGET_PROPERTY:NAME>)
  351. add_executable(srcgenex_options_COMPILE_LANGUAGE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_options_COMPILE_LANGUAGE.c")
  352. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_options_COMPILE_LANGUAGE.c"
  353. PROPERTY COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:C>:-DNAME=$<TARGET_PROPERTY:NAME>>)
  354. add_executable(srcgenex_defs "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_defs.c")
  355. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_defs.c"
  356. PROPERTY COMPILE_DEFINITIONS UNUSED NAME=$<TARGET_PROPERTY:NAME>)
  357. add_executable(srcgenex_defs_COMPILE_LANGUAGE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_defs_COMPILE_LANGUAGE.c")
  358. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_defs_COMPILE_LANGUAGE.c"
  359. PROPERTY COMPILE_DEFINITIONS $<$<COMPILE_LANGUAGE:C>:NAME=$<TARGET_PROPERTY:NAME>>)
  360. foreach (item IN ITEMS basic COMPILE_LANGUAGE)
  361. set(TARGET_NAME srcgenex_includes_${item})
  362. configure_file(srcgenex_includes.h.in "sf_includes_${item}/${TARGET_NAME}.h" @ONLY)
  363. configure_file(srcgenex_includes.c.in ${TARGET_NAME}.c @ONLY)
  364. endforeach()
  365. add_executable(srcgenex_includes_basic "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_includes_basic.c")
  366. # first include directory is useless but ensure list aspect is tested
  367. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_includes_basic.c"
  368. PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/sf_includes_basic")
  369. if (CMAKE_GENERATOR MATCHES "Makefiles|Ninja|Watcom WMake")
  370. add_executable(srcgenex_includes_COMPILE_LANGUAGE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_includes_COMPILE_LANGUAGE.c")
  371. # first include directory is useless but ensure list aspect is tested
  372. set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/srcgenex_includes_COMPILE_LANGUAGE.c"
  373. PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}" $<$<COMPILE_LANGUAGE:C>:${CMAKE_CURRENT_BINARY_DIR}/sf_includes_COMPILE_LANGUAGE>)
  374. endif()
  375. #-----------------------------------------------------------------------------
  376. # Cover test properties with generator expressions.
  377. add_executable(echo echo.c)
  378. add_executable(pwd pwd.c)
  379. add_test(NAME echo-configuration COMMAND echo $<CONFIGURATION>)
  380. set_property(TEST echo-configuration PROPERTY
  381. PASS_REGULAR_EXPRESSION "^$<CONFIGURATION>\n$")
  382. add_test(NAME echo-target-file COMMAND echo $<TARGET_FILE:echo>)
  383. set_property(TEST echo-target-file PROPERTY
  384. PASS_REGULAR_EXPRESSION "/echo${CMAKE_EXECUTABLE_SUFFIX}\n$")
  385. set_property(TEST echo-target-file PROPERTY
  386. REQUIRED_FILES "$<TARGET_FILE:echo>")
  387. add_test(NAME working-dir-arg
  388. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/WorkingDirectory/$<CONFIGURATION>"
  389. COMMAND pwd)
  390. set_property(TEST working-dir-arg PROPERTY
  391. PASS_REGULAR_EXPRESSION "WorkingDirectory/$<CONFIGURATION>\n$")
  392. foreach(c ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
  393. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/WorkingDirectory/${c}")
  394. endforeach()
  395. add_test(echo-old-style echo "\$<CONFIGURATION>")
  396. set_property(TEST echo-old-style PROPERTY
  397. PASS_REGULAR_EXPRESSION "^\\$<CONFIGURATION>\n$")
  398. add_subdirectory(CMP0044 ${CMAKE_BINARY_DIR}/CMP0044-WARN)
  399. set(CMP0044_TYPE NEW)
  400. add_subdirectory(CMP0044 ${CMAKE_BINARY_DIR}/CMP0044-NEW)
  401. set(CMP0044_TYPE OLD)
  402. add_subdirectory(CMP0044 ${CMAKE_BINARY_DIR}/CMP0044-OLD)
  403. if(NOT CMAKE_GENERATOR STREQUAL Xcode OR NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")
  404. add_library(objlib OBJECT objlib1.c objlib2.c)
  405. file(GENERATE
  406. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/objlib_files_$<CONFIGURATION>"
  407. CONTENT "$<JOIN:$<TARGET_OBJECTS:objlib>,\n>\n"
  408. )
  409. add_custom_target(check_object_files ALL
  410. COMMAND ${CMAKE_COMMAND}
  411. "-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/objlib_files_$<CONFIGURATION>"
  412. -DEXPECTED_NUM_OBJECTFILES=2
  413. -P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
  414. DEPENDS objlib
  415. )
  416. add_library(sharedlib SHARED objlib1.c objlib2.c)
  417. file(GENERATE
  418. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/sharedlib_files_$<CONFIGURATION>"
  419. CONTENT "$<JOIN:$<TARGET_OBJECTS:sharedlib>,\n>\n"
  420. )
  421. add_custom_target(check_sharedlib_objs ALL
  422. COMMAND ${CMAKE_COMMAND}
  423. "-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/sharedlib_files_$<CONFIGURATION>"
  424. -DEXPECTED_NUM_OBJECTFILES=2
  425. -P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
  426. DEPENDS sharedlib
  427. )
  428. add_library(staticlib STATIC objlib1.c objlib2.c)
  429. file(GENERATE
  430. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/staticlib_files_$<CONFIGURATION>"
  431. CONTENT "$<JOIN:$<TARGET_OBJECTS:staticlib>,\n>\n"
  432. )
  433. add_custom_target(check_staticlib_objs ALL
  434. COMMAND ${CMAKE_COMMAND}
  435. "-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/staticlib_files_$<CONFIGURATION>"
  436. -DEXPECTED_NUM_OBJECTFILES=2
  437. -P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
  438. DEPENDS staticlib
  439. )
  440. add_executable(execobjs objlib1.c objlib2.c echo.c)
  441. file(GENERATE
  442. OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/execobjs_files_$<CONFIGURATION>"
  443. CONTENT "$<JOIN:$<TARGET_OBJECTS:execobjs>,\n>\n"
  444. )
  445. add_custom_target(check_exec_objs ALL
  446. COMMAND ${CMAKE_COMMAND}
  447. "-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/execobjs_files_$<CONFIGURATION>"
  448. -DEXPECTED_NUM_OBJECTFILES=3
  449. -P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
  450. DEPENDS execobjs
  451. )
  452. endif()