CMakeLists.txt 9.85 KB
Newer Older
Brad King's avatar
Brad King committed
1
cmake_minimum_required (VERSION 2.8.8)
2
3
4
project(GeneratorExpression)

include(CTest)
Brad King's avatar
Brad King committed
5

6
7
8
# This test is split into multiple parts as needed to avoid NMake command
# length limits.

9
add_custom_target(check-part1 ALL
Brad King's avatar
Brad King committed
10
11
  COMMAND ${CMAKE_COMMAND}
    -Dtest_0=$<0:nothing>
12
    -Dtest_0_with_comma=$<0:-Wl,--no-undefined>
Brad King's avatar
Brad King committed
13
    -Dtest_1=$<1:content>
14
    -Dtest_1_with_comma=$<1:-Wl,--no-undefined>
Brad King's avatar
Brad King committed
15
16
17
18
19
20
21
    -Dconfig=$<CONFIGURATION>
    -Dtest_and_0=$<AND:0>
    -Dtest_and_0_0=$<AND:0,0>
    -Dtest_and_0_1=$<AND:0,1>
    -Dtest_and_1=$<AND:1>
    -Dtest_and_1_0=$<AND:1,0>
    -Dtest_and_1_1=$<AND:1,1>
22
23
24
    # Ordinarily, the 'invalidcontent' would cause an error, but
    # the '0' makes the AND abort early.
    -Dtest_and_0_invalidcontent=$<AND:0,invalidcontent>
25
26
    -Dtest_config_0=$<CONFIG:$<CONFIGURATION>x>
    -Dtest_config_1=$<CONFIG:$<CONFIGURATION>>
27
28
29
30
    -Dtest_config_debug=$<CONFIG:Debug>$<CONFIG:DEBUG>$<CONFIG:DeBuG>
    -Dtest_config_release=$<CONFIG:Release>$<CONFIG:RELEASE>$<CONFIG:ReLeAsE>
    -Dtest_config_relwithdebinfo=$<CONFIG:RelWithDebInfo>$<CONFIG:RELWITHDEBINFO>$<CONFIG:relwithdebinfo>
    -Dtest_config_minsizerel=$<CONFIG:MinSizeRel>$<CONFIG:MINSIZEREL>$<CONFIG:minsizerel>
Brad King's avatar
Brad King committed
31
32
33
34
35
36
37
38
    -Dtest_not_0=$<NOT:0>
    -Dtest_not_1=$<NOT:1>
    -Dtest_or_0=$<OR:0>
    -Dtest_or_0_0=$<OR:0,0>
    -Dtest_or_0_1=$<OR:0,1>
    -Dtest_or_1=$<OR:1>
    -Dtest_or_1_0=$<OR:1,0>
    -Dtest_or_1_1=$<OR:1,1>
39
    -Dtest_or_1_invalidcontent=$<OR:1,invalidcontent>
40
41
42
43
44
45
46
47
    -Dtest_bool_notfound=$<BOOL:NOTFOUND>
    -Dtest_bool_foo_notfound=$<BOOL:Foo-NOTFOUND>
    -Dtest_bool_true=$<BOOL:True>
    -Dtest_bool_false=$<BOOL:False>
    -Dtest_bool_on=$<BOOL:On>
    -Dtest_bool_off=$<BOOL:Off>
    -Dtest_bool_no=$<BOOL:No>
    -Dtest_bool_n=$<BOOL:N>
48
    -Dtest_bool_empty=$<BOOL:>
49
50
51
52
53
54
    -Dtest_strequal_yes_yes=$<STREQUAL:Yes,Yes>
    -Dtest_strequal_yes_yes_cs=$<STREQUAL:Yes,yes>
    -Dtest_strequal_yes_no=$<STREQUAL:Yes,No>
    -Dtest_strequal_no_yes=$<STREQUAL:No,Yes>
    -Dtest_strequal_angle_r=$<STREQUAL:$<ANGLE-R>,$<ANGLE-R>>
    -Dtest_strequal_comma=$<STREQUAL:$<COMMA>,$<COMMA>>
55
    -Dtest_strequal_semicolon=$<STREQUAL:$<SEMICOLON>,$<SEMICOLON>>
56
    -Dtest_strequal_angle_r_comma=$<STREQUAL:$<ANGLE-R>,$<COMMA>>
57
58
    -Dtest_strequal_both_empty=$<STREQUAL:,>
    -Dtest_strequal_one_empty=$<STREQUAL:something,>
59
60
    -Dtest_angle_r=$<ANGLE-R>
    -Dtest_comma=$<COMMA>
61
    -Dtest_semicolon=$<SEMICOLON>
62
63
64
65
66
    -Dtest_colons_1=$<1::>
    -Dtest_colons_2=$<1:::>
    -Dtest_colons_3=$<1:Qt5::Core>
    -Dtest_colons_4=$<1:C:\\CMake>
    -Dtest_colons_5=$<1:C:/CMake>
67
    -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part1.cmake
68
  COMMAND ${CMAKE_COMMAND} -E echo "check done (part 1 of 3)"
69
70
71
  VERBATIM
  )

72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
add_library(empty1 empty.cpp)
target_include_directories(empty1 PUBLIC /empty1/public)
target_include_directories(empty1 PRIVATE /empty1/private)

add_library(empty2 empty.cpp)
target_include_directories(empty2 PUBLIC /empty2/public)

add_library(empty3 empty.cpp)
target_include_directories(empty3 PUBLIC /empty3/public)
target_include_directories(empty3 PRIVATE /empty3/private)

add_library(empty4 empty.cpp)
target_include_directories(empty4 PUBLIC /empty4/public)

target_link_libraries(empty1 LINK_PUBLIC empty2)
target_link_libraries(empty2 LINK_PUBLIC empty3 empty4)
target_link_libraries(empty3 LINK_PUBLIC empty2 empty4)

add_library(empty5 empty.cpp)
target_include_directories(empty5 PRIVATE /empty5/private1 /empty5/private2)

93
94
add_custom_target(check-part2 ALL
  COMMAND ${CMAKE_COMMAND}
95
96
97
98
99
100
101
102
103
104
105
106
107
    -Dtest_incomplete_1=$<
    -Dtest_incomplete_2=$<something
    -Dtest_incomplete_3=$<something:
    -Dtest_incomplete_4=$<something:,
    -Dtest_incomplete_5=$something:,>
    -Dtest_incomplete_6=<something:,>
    -Dtest_incomplete_7=$<something::
    -Dtest_incomplete_8=$<something:,
    -Dtest_incomplete_9=$<something:,,
    -Dtest_incomplete_10=$<something:,:
    -Dtest_incomplete_11=$<something,,
    -Dtest_incomplete_12=$<,,
    -Dtest_incomplete_13=$<some$<1:special>thing
108
    -Dtest_incomplete_14=$<$<ANGLE-R>
109
    -Dtest_incomplete_15=$<some$<thing
110
    -Dtest_incomplete_16=$<BOOL:something
111
112
113
114
115
    -Dtest_incomplete_17=$<1:some$thing>
    -Dtest_incomplete_18=$<1:some,thing
    -Dtest_incomplete_19=$<1:some,thing$<ANGLE-R>
    -Dtest_incomplete_20=$<CONFIGURATION$<ANGLE-R>
    -Dtest_incomplete_21=$<BOOL:something$<ANGLE-R>
116
117
    -Dtest_build_interface=$<BUILD_INTERFACE:build>
    -Dtest_install_interface=$<INSTALL_INTERFACE:install>
118
119
    -Dtest_target_name_1=$<TARGET_NAME:tgt,ok>
    -Dtest_target_name_2=$<TARGET_NAME:tgt:ok>
120
121
122
123
124
125
126
127
    -Dtest_target_includes1=$<TARGET_PROPERTY:empty1,INTERFACE_INCLUDE_DIRECTORIES>
    -Dtest_target_includes2=$<TARGET_PROPERTY:empty2,INTERFACE_INCLUDE_DIRECTORIES>
    -Dtest_target_includes3=$<TARGET_PROPERTY:empty3,INTERFACE_INCLUDE_DIRECTORIES>
    -Dtest_target_includes4=$<TARGET_PROPERTY:empty1,INCLUDE_DIRECTORIES>
    -Dtest_target_includes5=$<TARGET_PROPERTY:empty2,INCLUDE_DIRECTORIES>
    -Dtest_target_includes6=$<TARGET_PROPERTY:empty3,INCLUDE_DIRECTORIES>
    -Dtest_target_includes7=$<TARGET_PROPERTY:empty1,INTERFACE_INCLUDE_DIRECTORIES>
    -Dtest_target_includes8=$<TARGET_PROPERTY:empty5,INCLUDE_DIRECTORIES>
128
129
130
131
132
133
134
135
136
137
    -Dtest_arbitrary_content_comma_1=$<1:a,>
    -Dtest_arbitrary_content_comma_2=$<1:,a>
    -Dtest_arbitrary_content_comma_3=$<1:a,,>
    -Dtest_arbitrary_content_comma_4=$<1:,>
    -Dtest_arbitrary_content_comma_5=$<1:,,>
    -Dtest_arbitrary_content_comma_6=$<1:,,,>
    -Dtest_arbitrary_content_comma_7=$<1:,,a>
    -Dtest_arbitrary_content_comma_8=$<1:a,,b>
    -Dtest_arbitrary_content_comma_9=$<1:a,,b,,>
    -Dtest_arbitrary_content_comma_10=$<1:,,a,,b,,>
138
139
140
141
142
    -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part2.cmake
  COMMAND ${CMAKE_COMMAND} -E echo "check done (part 2 of 3)"
  VERBATIM
)

143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
add_library(imported1 SHARED IMPORTED)
set_property(TARGET imported1 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
set_property(TARGET imported1 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
set_property(TARGET imported1 PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
set_property(TARGET imported1 PROPERTY INTERFACE_INCLUDE_DIRECTORIES /imported1/include)

add_library(imported2 SHARED IMPORTED)
set_property(TARGET imported2 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
set_property(TARGET imported2 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
set_property(TARGET imported2 PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
set_property(TARGET imported2 PROPERTY INTERFACE_INCLUDE_DIRECTORIES /imported2/include)

add_library(imported3 SHARED IMPORTED)
set_property(TARGET imported3 PROPERTY IMPORTED_LOCATION_RELEASE release_loc)
set_property(TARGET imported3 PROPERTY IMPORTED_LOCATION_DEBUG debug_loc)
# Both Debug and Release should not be true when this is evaluated.
set_property(TARGET imported3 APPEND PROPERTY
  INTERFACE_INCLUDE_DIRECTORIES $<$<CONFIG:DEBUG>:$<TARGET_PROPERTY:imported1,INTERFACE_INCLUDE_DIRECTORIES>>)
set_property(TARGET imported3 APPEND PROPERTY
  INTERFACE_INCLUDE_DIRECTORIES $<$<CONFIG:RELEASE>:$<TARGET_PROPERTY:imported2,INTERFACE_INCLUDE_DIRECTORIES>>)

add_library(imported4 SHARED IMPORTED)
set_property(TARGET imported4 APPEND PROPERTY
  INCLUDE_DIRECTORIES $<TARGET_PROPERTY:imported3,INTERFACE_INCLUDE_DIRECTORIES>)

168
169
170
171
172
add_executable(someexe empty.cpp)
add_executable(Alias::SomeExe ALIAS someexe)

add_library(Alias::SomeLib ALIAS empty1)

173
174
add_custom_target(check-part3 ALL
  COMMAND ${CMAKE_COMMAND}
175
176
177
178
179
180
    -Dtest_version_greater_1=$<VERSION_GREATER:1.0,1.1.1>
    -Dtest_version_greater_2=$<VERSION_GREATER:1.1.1,1.0>
    -Dtest_version_less_1=$<VERSION_LESS:1.1.1,1.0>
    -Dtest_version_less_2=$<VERSION_LESS:1.0,1.1.1>
    -Dtest_version_equal_1=$<VERSION_EQUAL:1.0.1,1.1>
    -Dtest_version_equal_2=$<VERSION_EQUAL:1.1,1.1>
181
182
183
184
185
    -Dconfig=$<CONFIGURATION>
    -Dtest_imported_debug=$<TARGET_PROPERTY:imported4,INCLUDE_DIRECTORIES>
    -Dtest_imported_release=$<TARGET_PROPERTY:imported4,INCLUDE_DIRECTORIES>
    -Dtest_imported_relwithdebinfo=$<TARGET_PROPERTY:imported4,INCLUDE_DIRECTORIES>
    -Dtest_imported_minsizerel=$<TARGET_PROPERTY:imported4,INCLUDE_DIRECTORIES>
186
187
188
    -Dtest_alias_file_exe=$<STREQUAL:$<TARGET_FILE:Alias::SomeExe>,$<TARGET_FILE:someexe>>
    -Dtest_alias_file_lib=$<STREQUAL:$<TARGET_FILE:Alias::SomeLib>,$<TARGET_FILE:empty1>>
    -Dtest_alias_target_name=$<STREQUAL:$<TARGET_PROPERTY:Alias::SomeLib,NAME>,$<TARGET_PROPERTY:empty1,NAME>>
189
190
    -Dtest_early_termination_1=$<$<1:>:
    -Dtest_early_termination_2=$<$<1:>:,
191
192
193
194
195
    -Dsystem_name=${CMAKE_HOST_SYSTEM_NAME}
    -Dtest_platform_id=$<PLATFORM_ID>
    -Dtest_platform_id_Linux=$<PLATFORM_ID:Linux>
    -Dtest_platform_id_Windows=$<PLATFORM_ID:Windows>
    -Dtest_platform_id_Darwin=$<PLATFORM_ID:Darwin>
196
197
198
    -Dlower_case=$<LOWER_CASE:Mi,XeD>
    -Dupper_case=$<UPPER_CASE:MiX,eD>
    -Dmake_c_identifier=$<MAKE_C_IDENTIFIER:4f,oo:+bar-$>
199
200
    -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part3.cmake
  COMMAND ${CMAKE_COMMAND} -E echo "check done (part 3 of 3)"
Brad King's avatar
Brad King committed
201
202
  VERBATIM
  )
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230

#-----------------------------------------------------------------------------
# Cover test properties with generator expressions.
add_executable(echo echo.c)
add_executable(pwd pwd.c)

add_test(NAME echo-configuration COMMAND echo $<CONFIGURATION>)
set_property(TEST echo-configuration PROPERTY
  PASS_REGULAR_EXPRESSION "^$<CONFIGURATION>\n$")

add_test(NAME echo-target-file COMMAND echo $<TARGET_FILE:echo>)
set_property(TEST echo-target-file PROPERTY
  PASS_REGULAR_EXPRESSION "/echo${CMAKE_EXECUTABLE_SUFFIX}\n$")
set_property(TEST echo-target-file PROPERTY
  REQUIRED_FILES "$<TARGET_FILE:echo>")

add_test(NAME working-dir-arg
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/WorkingDirectory/$<CONFIGURATION>"
  COMMAND pwd)
set_property(TEST working-dir-arg PROPERTY
  PASS_REGULAR_EXPRESSION "WorkingDirectory/$<CONFIGURATION>\n$")
foreach(c ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
  file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/WorkingDirectory/${c}")
endforeach()

add_test(echo-old-style echo "\$<CONFIGURATION>")
set_property(TEST echo-old-style PROPERTY
    PASS_REGULAR_EXPRESSION "^\\$<CONFIGURATION>\n$")