summaryrefslogtreecommitdiffstats
path: root/Tests/CustomTransitiveProperties/CMakeLists.txt
blob: 8d800ea6369bcfdad1cf9377a7c34c419c1ce6af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
cmake_minimum_required(VERSION 3.29)
cmake_policy(SET CMP0166 NEW)
project(CustomTransitiveProperties C)

add_library(iface1 INTERFACE)
set_target_properties(iface1 PROPERTIES
  TRANSITIVE_COMPILE_PROPERTIES "CUSTOM_A" # LINK_ONLY not pierced
  TRANSITIVE_LINK_PROPERTIES    "CUSTOM_U" # LINK_ONLY pierced

  INTERFACE_CUSTOM_A "CUSTOM_A_IFACE1;CUSTOM_A_TARGET_NAME_$<UPPER_CASE:$<TARGET_PROPERTY:NAME>>"
  INTERFACE_CUSTOM_B "CUSTOM_B_IFACE1"
  INTERFACE_CUSTOM_C "CUSTOM_C_IFACE1"
  INTERFACE_CUSTOM_U "CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_$<UPPER_CASE:$<TARGET_PROPERTY:NAME>>"
  INTERFACE_CUSTOM_V "CUSTOM_V_IFACE1"
  INTERFACE_CUSTOM_W "CUSTOM_W_IFACE1"
  )

add_library(iface2 INTERFACE)
set_target_properties(iface2 PROPERTIES
  INTERFACE_CUSTOM_A "CUSTOM_A_IFACE2;CUSTOM_A_TARGET_TYPE_$<TARGET_PROPERTY:TYPE>"
  INTERFACE_CUSTOM_U "CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_$<TARGET_PROPERTY:TYPE>"
  )
target_link_libraries(iface2 INTERFACE iface1)

# Test that the INTERFACE prefix is removed.
set(unnecessary_INTERFACE_ "INTERFACE_")

add_library(static1 STATIC static1.c)
target_link_libraries(static1 PRIVATE iface2)
set_target_properties(static1 PROPERTIES
  TRANSITIVE_COMPILE_PROPERTIES "${unnecessary_INTERFACE_}CUSTOM_B" # LINK_ONLY not pierced
  TRANSITIVE_LINK_PROPERTIES    "${unnecessary_INTERFACE_}CUSTOM_V" # LINK_ONLY pierced

  CUSTOM_A "CUSTOM_A_STATIC1"
  CUSTOM_B "CUSTOM_B_STATIC1"
  CUSTOM_U "CUSTOM_U_STATIC1"
  CUSTOM_V "CUSTOM_V_STATIC1"
  INTERFACE_CUSTOM_A "CUSTOM_A_STATIC1_IFACE"
  INTERFACE_CUSTOM_B "CUSTOM_B_STATIC1_IFACE"
  INTERFACE_CUSTOM_U "CUSTOM_U_STATIC1_IFACE"
  INTERFACE_CUSTOM_V "CUSTOM_V_STATIC1_IFACE"
  )
target_compile_definitions(static1 PRIVATE
  $<TARGET_PROPERTY:CUSTOM_A>
  $<TARGET_PROPERTY:CUSTOM_B>
  $<TARGET_PROPERTY:CUSTOM_U>
  $<TARGET_PROPERTY:CUSTOM_V>
  )

add_library(object1 OBJECT object1.c)
target_link_libraries(object1 PRIVATE iface2)
set_target_properties(object1 PROPERTIES
  TRANSITIVE_COMPILE_PROPERTIES "${unnecessary_INTERFACE_}CUSTOM_C" # LINK_ONLY not pierced
  TRANSITIVE_LINK_PROPERTIES    "${unnecessary_INTERFACE_}CUSTOM_W" # LINK_ONLY pierced

  CUSTOM_A "CUSTOM_A_OBJECT1"
  CUSTOM_C "CUSTOM_C_OBJECT1"
  CUSTOM_U "CUSTOM_U_OBJECT1"
  CUSTOM_W "CUSTOM_W_OBJECT1"
  INTERFACE_CUSTOM_A "CUSTOM_A_OBJECT1_IFACE"
  INTERFACE_CUSTOM_C "CUSTOM_C_OBJECT1_IFACE"
  INTERFACE_CUSTOM_U "CUSTOM_U_OBJECT1_IFACE"
  INTERFACE_CUSTOM_W "CUSTOM_W_OBJECT1_IFACE"
  )
target_compile_definitions(object1 PRIVATE
  $<TARGET_PROPERTY:CUSTOM_A>
  $<TARGET_PROPERTY:CUSTOM_C>
  $<TARGET_PROPERTY:CUSTOM_U>
  $<TARGET_PROPERTY:CUSTOM_W>
  )

add_executable(CustomTransitiveProperties main.c)
target_link_libraries(CustomTransitiveProperties PRIVATE static1 object1)
set_target_properties(CustomTransitiveProperties PROPERTIES
  CUSTOM_A "CUSTOM_A_MAIN"
  CUSTOM_B "CUSTOM_B_MAIN"
  CUSTOM_C "CUSTOM_C_MAIN"
  CUSTOM_U "CUSTOM_U_MAIN"
  CUSTOM_V "CUSTOM_V_MAIN"
  CUSTOM_W "CUSTOM_W_MAIN"
  )

# Test TRANSITIVE_*_PROPERTY evaluation within usage requirements.
target_compile_definitions(CustomTransitiveProperties PRIVATE
  $<TARGET_PROPERTY:CUSTOM_A>
  $<TARGET_PROPERTY:CUSTOM_B>
  $<TARGET_PROPERTY:CUSTOM_C>
  $<TARGET_PROPERTY:CUSTOM_U>
  $<TARGET_PROPERTY:CUSTOM_V>
  $<TARGET_PROPERTY:CUSTOM_W>
  )

# Test TRANSITIVE_LINK_PROPERTIES containing LINK_LIBRARIES itself.
add_library(iface10 INTERFACE)
set_property(TARGET iface10 PROPERTY TRANSITIVE_LINK_PROPERTIES "LINK_LIBRARIES")
add_library(iface11 INTERFACE)
target_link_libraries(iface11 INTERFACE iface10)
add_library(static10 STATIC static10.c)
target_link_libraries(static10 PRIVATE iface11)
add_library(static11 STATIC static11.c)
target_link_libraries(static11 PRIVATE static10 iface11)
add_executable(main10 main10.c)
target_link_libraries(main10 PRIVATE static11 static10)

# Test CMP0189 OLD and NEW behavior.
add_library(iface20 INTERFACE)
add_library(iface21 INTERFACE)
target_link_libraries(iface21 INTERFACE iface20)
add_library(static20 STATIC static20.c)
target_link_libraries(static20 PRIVATE iface21)
add_library(static21 STATIC static21.c)
target_link_libraries(static21 PRIVATE static20 iface21)
add_executable(main20 main20.c)
target_link_libraries(main20 PRIVATE static21 static20)

# Test TRANSITIVE_*_PROPERTY evaluation outside of usage requirements.
add_executable(check-args check-args.c)
set(out "${CMAKE_CURRENT_BINARY_DIR}/out-$<CONFIG>.txt")
set(in_CUSTOM [====[
iface1 CUSTOM_A: '$<TARGET_PROPERTY:iface1,CUSTOM_A>'
iface1 INTERFACE_CUSTOM_A: '$<TARGET_PROPERTY:iface1,INTERFACE_CUSTOM_A>'
iface2 CUSTOM_A: '$<TARGET_PROPERTY:iface2,CUSTOM_A>'
iface2 INTERFACE_CUSTOM_A: '$<TARGET_PROPERTY:iface2,INTERFACE_CUSTOM_A>'
static1 CUSTOM_A: '$<TARGET_PROPERTY:static1,CUSTOM_A>'
static1 INTERFACE_CUSTOM_A: '$<TARGET_PROPERTY:static1,INTERFACE_CUSTOM_A>'
static1 CUSTOM_B: '$<TARGET_PROPERTY:static1,CUSTOM_B>'
static1 INTERFACE_CUSTOM_B: '$<TARGET_PROPERTY:static1,INTERFACE_CUSTOM_B>'
static1 CUSTOM_U: '$<TARGET_PROPERTY:static1,CUSTOM_U>'
static1 INTERFACE_CUSTOM_U: '$<TARGET_PROPERTY:static1,INTERFACE_CUSTOM_U>'
static1 CUSTOM_V: '$<TARGET_PROPERTY:static1,CUSTOM_V>'
static1 INTERFACE_CUSTOM_V: '$<TARGET_PROPERTY:static1,INTERFACE_CUSTOM_V>'
object1 CUSTOM_A: '$<TARGET_PROPERTY:object1,CUSTOM_A>'
object1 INTERFACE_CUSTOM_A: '$<TARGET_PROPERTY:object1,INTERFACE_CUSTOM_A>'
object1 CUSTOM_C: '$<TARGET_PROPERTY:object1,CUSTOM_C>'
object1 INTERFACE_CUSTOM_C: '$<TARGET_PROPERTY:object1,INTERFACE_CUSTOM_C>'
object1 CUSTOM_U: '$<TARGET_PROPERTY:object1,CUSTOM_U>'
object1 INTERFACE_CUSTOM_U: '$<TARGET_PROPERTY:object1,INTERFACE_CUSTOM_U>'
object1 CUSTOM_W: '$<TARGET_PROPERTY:object1,CUSTOM_W>'
object1 INTERFACE_CUSTOM_W: '$<TARGET_PROPERTY:object1,INTERFACE_CUSTOM_W>'
main CUSTOM_A: '$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_A>'
main INTERFACE_CUSTOM_A: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_CUSTOM_A>'
main CUSTOM_B: '$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_B>'
main INTERFACE_CUSTOM_B: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_CUSTOM_B>'
main CUSTOM_C: '$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_C>'
main INTERFACE_CUSTOM_C: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_CUSTOM_C>'
main CUSTOM_U: '$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_U>'
main INTERFACE_CUSTOM_U: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_CUSTOM_U>'
main CUSTOM_V: '$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_V>'
main INTERFACE_CUSTOM_V: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_CUSTOM_V>'
main CUSTOM_W: '$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_W>'
main INTERFACE_CUSTOM_W: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_CUSTOM_W>'
]====])
set(in_LINK_LIBRARIES [====[
iface1 LINK_LIBRARIES: '$<TARGET_PROPERTY:iface1,LINK_LIBRARIES>'
iface1 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:iface1,INTERFACE_LINK_LIBRARIES>'
iface2 LINK_LIBRARIES: '$<TARGET_PROPERTY:iface2,LINK_LIBRARIES>'
iface2 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:iface2,INTERFACE_LINK_LIBRARIES>'
static1 LINK_LIBRARIES: '$<TARGET_PROPERTY:static1,LINK_LIBRARIES>'
static1 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:static1,INTERFACE_LINK_LIBRARIES>'
main LINK_LIBRARIES: '$<TARGET_PROPERTY:CustomTransitiveProperties,LINK_LIBRARIES>'
main INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_LINK_LIBRARIES>'
iface10 LINK_LIBRARIES: '$<TARGET_PROPERTY:iface10,LINK_LIBRARIES>'
iface10 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:iface10,INTERFACE_LINK_LIBRARIES>'
iface11 LINK_LIBRARIES: '$<TARGET_PROPERTY:iface11,LINK_LIBRARIES>'
iface11 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:iface11,INTERFACE_LINK_LIBRARIES>'
static10 LINK_LIBRARIES: '$<TARGET_PROPERTY:static10,LINK_LIBRARIES>'
static10 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:static10,INTERFACE_LINK_LIBRARIES>'
static11 LINK_LIBRARIES: '$<TARGET_PROPERTY:static11,LINK_LIBRARIES>'
static11 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:static11,INTERFACE_LINK_LIBRARIES>'
main10 LINK_LIBRARIES: '$<TARGET_PROPERTY:main10,LINK_LIBRARIES>'
main10 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:main10,INTERFACE_LINK_LIBRARIES>'
iface20 LINK_LIBRARIES: '$<TARGET_PROPERTY:iface20,LINK_LIBRARIES>'
iface20 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:iface20,INTERFACE_LINK_LIBRARIES>'
iface21 LINK_LIBRARIES: '$<TARGET_PROPERTY:iface21,LINK_LIBRARIES>'
iface21 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:iface21,INTERFACE_LINK_LIBRARIES>'
static20 LINK_LIBRARIES: '$<TARGET_PROPERTY:static20,LINK_LIBRARIES>'
static20 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:static20,INTERFACE_LINK_LIBRARIES>'
static21 LINK_LIBRARIES: '$<TARGET_PROPERTY:static21,LINK_LIBRARIES>'
static21 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:static21,INTERFACE_LINK_LIBRARIES>'
main20 LINK_LIBRARIES: '$<TARGET_PROPERTY:main20,LINK_LIBRARIES>'
main20 INTERFACE_LINK_LIBRARIES: '$<TARGET_PROPERTY:main20,INTERFACE_LINK_LIBRARIES>'
]====])
file(GENERATE OUTPUT "${out}" CONTENT "# file(GENERATE) produced:
${in_CUSTOM}
${in_LINK_LIBRARIES}
")
add_custom_target(check ALL VERBATIM
  COMMAND ${CMAKE_COMMAND} -Dconfig=$<CONFIG> -Dout=${out} -P${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
  COMMAND CustomTransitiveProperties
  COMMAND check-args
  "$<TARGET_PROPERTY:static1,CUSTOM_A>" "CUSTOM_A_STATIC1;CUSTOM_A_IFACE2;CUSTOM_A_TARGET_TYPE_STATIC_LIBRARY;CUSTOM_A_IFACE1;CUSTOM_A_TARGET_NAME_STATIC1"
  "$<TARGET_PROPERTY:static1,CUSTOM_B>" "CUSTOM_B_STATIC1;CUSTOM_B_IFACE1"
  "$<TARGET_PROPERTY:static1,CUSTOM_U>" "CUSTOM_U_STATIC1;CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_STATIC_LIBRARY;CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_STATIC1"
  "$<TARGET_PROPERTY:static1,CUSTOM_V>" "CUSTOM_V_STATIC1;CUSTOM_V_IFACE1"
  "$<TARGET_PROPERTY:object1,CUSTOM_A>" "CUSTOM_A_OBJECT1;CUSTOM_A_IFACE2;CUSTOM_A_TARGET_TYPE_OBJECT_LIBRARY;CUSTOM_A_IFACE1;CUSTOM_A_TARGET_NAME_OBJECT1"
  "$<TARGET_PROPERTY:object1,CUSTOM_C>" "CUSTOM_C_OBJECT1;CUSTOM_C_IFACE1"
  "$<TARGET_PROPERTY:object1,CUSTOM_U>" "CUSTOM_U_OBJECT1;CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_OBJECT_LIBRARY;CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_OBJECT1"
  "$<TARGET_PROPERTY:object1,CUSTOM_W>" "CUSTOM_W_OBJECT1;CUSTOM_W_IFACE1"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_A>" "CUSTOM_A_MAIN"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_B>" "CUSTOM_B_MAIN;CUSTOM_B_STATIC1_IFACE"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_C>" "CUSTOM_C_MAIN;CUSTOM_C_OBJECT1_IFACE"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_U>" "CUSTOM_U_MAIN;CUSTOM_U_STATIC1_IFACE;CUSTOM_U_IFACE2;CUSTOM_U_TARGET_TYPE_EXECUTABLE;CUSTOM_U_IFACE1;CUSTOM_U_TARGET_NAME_CUSTOMTRANSITIVEPROPERTIES;CUSTOM_U_OBJECT1_IFACE"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_V>" "CUSTOM_V_MAIN;CUSTOM_V_STATIC1_IFACE;CUSTOM_V_IFACE1"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,CUSTOM_W>" "CUSTOM_W_MAIN;CUSTOM_W_IFACE1;CUSTOM_W_OBJECT1_IFACE"
  COMMAND check-args
  "$<TARGET_PROPERTY:iface1,LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface1,INTERFACE_LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface2,LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface2,INTERFACE_LINK_LIBRARIES>" "iface1"
  "$<TARGET_PROPERTY:static1,LINK_LIBRARIES>" "iface2"
  "$<TARGET_PROPERTY:static1,INTERFACE_LINK_LIBRARIES>" "$<LINK_ONLY:iface2$<ANGLE-R>"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,LINK_LIBRARIES>" "static1;object1"
  "$<TARGET_PROPERTY:CustomTransitiveProperties,INTERFACE_LINK_LIBRARIES>" ""
  COMMAND check-args
  "$<TARGET_PROPERTY:iface10,LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface10,INTERFACE_LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface11,LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface11,INTERFACE_LINK_LIBRARIES>" "iface10"
  "$<TARGET_PROPERTY:static10,LINK_LIBRARIES>" "iface11;iface10"
  #                                              _/         \__
  #                                             /              \
  #                               "static10[iface11];iface11[iface10]"
  "$<TARGET_PROPERTY:static10,INTERFACE_LINK_LIBRARIES>" "iface11;iface10"
  "$<TARGET_PROPERTY:static11,LINK_LIBRARIES>" "static10;iface11;iface11;iface10"
  #                                             __/      __/         \__     \__________
  #                                            /        /               \               \
  #                              "static11[static10;iface11];static10[iface11;iface11[iface10]]"
  "$<TARGET_PROPERTY:static11,INTERFACE_LINK_LIBRARIES>" "static10;iface11;iface11;iface10"
  "$<TARGET_PROPERTY:main10,LINK_LIBRARIES>" "static11;static10;static10;iface11;iface11;iface10"
  #                                      _______/ _______/         |        |        \______ \______________
  #                                     /        /                 |        |               \               \
  #                         "main10[static11;static10];static11[static10;iface11;static10[iface11;iface11[iface10]]]"
  "$<TARGET_PROPERTY:main10,INTERFACE_LINK_LIBRARIES>" ""
  COMMAND check-args
  "$<TARGET_PROPERTY:iface20,LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface20,INTERFACE_LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface21,LINK_LIBRARIES>" ""
  "$<TARGET_PROPERTY:iface21,INTERFACE_LINK_LIBRARIES>" "iface20"
  "$<TARGET_PROPERTY:static20,LINK_LIBRARIES>" "iface21"
  "$<TARGET_PROPERTY:static20,INTERFACE_LINK_LIBRARIES>" "$<LINK_ONLY:iface21$<ANGLE-R>"
  "$<TARGET_PROPERTY:static21,LINK_LIBRARIES>" "static20;iface21"
  "$<TARGET_PROPERTY:static21,INTERFACE_LINK_LIBRARIES>" "$<LINK_ONLY:static20$<ANGLE-R>;$<LINK_ONLY:iface21$<ANGLE-R>"
  "$<TARGET_PROPERTY:main20,LINK_LIBRARIES>" "static21;static20"
  "$<TARGET_PROPERTY:main20,INTERFACE_LINK_LIBRARIES>" ""
  )

add_subdirectory(CMP0189)