c9e41f5646bcf97cc771b2a77b31918a21ab0257
[platform/upstream/cmake.git] / Tests / ExportImport / Export / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.7.20090711)
2 if(POLICY CMP0129)
3   cmake_policy(SET CMP0129 NEW)
4 endif()
5 project(Export C CXX)
6
7 # Pretend that RelWithDebInfo should link to debug libraries to test
8 # the DEBUG_CONFIGURATIONS property.
9 set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS Debug RelWithDebInfo)
10
11 add_library(testExe1lib STATIC testExe1lib.c) # not exported
12 add_executable(testExe1 testExe1.c)
13 target_link_libraries(testExe1 testExe1lib)
14 set_property(TARGET testExe1 PROPERTY VERSION 4)
15
16 add_library(testExe2libImp SHARED testExe2libImp.c)
17 set_property(TARGET testExe2libImp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
18 add_library(testExe2lib SHARED testExe2lib.c)
19 target_link_libraries(testExe2lib testExe2libImp)
20 set_property(TARGET testExe2lib PROPERTY LINK_INTERFACE_LIBRARIES "")
21 add_executable(testExe2 testExe2.c)
22 set_property(TARGET testExe2 PROPERTY ENABLE_EXPORTS 1)
23 set_property(TARGET testExe2 PROPERTY LINK_INTERFACE_LIBRARIES testExe2lib)
24
25 add_library(testLib1 STATIC testLib1.c)
26 add_library(testLib2 STATIC testLib2.c)
27 target_link_libraries(testLib2 testLib1)
28
29 # Test install(FILES) with generator expressions referencing testLib1.
30 add_custom_command(TARGET testLib1 POST_BUILD
31   COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:testLib1>
32                                    $<TARGET_FILE:testLib1>.genex
33   )
34 install(FILES $<TARGET_FILE:testLib1>.genex
35   DESTINATION $<1:lib>$<0:/wrong>
36   )
37 set_property(TARGET testLib1 PROPERTY MY_FILES
38   ${CMAKE_CURRENT_SOURCE_DIR}/testLib1file1.txt
39   ${CMAKE_CURRENT_SOURCE_DIR}/testLib1file2.txt
40   )
41 install(FILES $<TARGET_PROPERTY:testLib1,MY_FILES>
42   DESTINATION $<1:doc>$<0:/wrong>
43   )
44
45 # Test library with empty link interface.  Link it to an implementation
46 # dependency that itself links to dependencies publicly.
47 add_library(testLib3ImpDep SHARED testLib3ImpDep.c)
48 set_property(TARGET testLib3ImpDep PROPERTY LIBRARY_OUTPUT_DIRECTORY impl/dep)
49 add_library(testLib3Imp SHARED testLib3Imp.c)
50 set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
51 target_link_libraries(testLib3Imp testLib3ImpDep)
52 add_library(testLib3 SHARED testLib3.c)
53 target_link_libraries(testLib3 testLib3Imp)
54 set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "")
55 set_property(TARGET testLib3 PROPERTY VERSION 1.2)
56 set_property(TARGET testLib3 PROPERTY SOVERSION 3)
57
58 # Test <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME[_<CONFIG>] properties.
59 set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_DEBUG testLib3dll-d)
60 set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_RELEASE testLib3dll-r)
61 set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME testLib3dll)
62 set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_DEBUG testLib3lib-d)
63 set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_RELEASE testLib3lib-r)
64 set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME testLib3lib)
65 set_property(TARGET testLib3 PROPERTY ARCHIVE_OUTPUT_NAME testLib3import)
66
67 add_library(testLib4 SHARED testLib4.c)
68 set_property(TARGET testLib4 PROPERTY FRAMEWORK 1)
69
70 add_library(testLib5 SHARED testLib5.c)
71
72 add_library(testLib6 STATIC testLib6.cxx testLib6c.c)
73
74 add_library(testLibPerConfigDest STATIC testLibPerConfigDest.c)
75 install(TARGETS testLibPerConfigDest EXPORT exp
76   DESTINATION lib/$<$<BOOL:$<CONFIG>>:$<CONFIG>>$<$<NOT:$<BOOL:$<CONFIG>>>:NoConfig>
77   )
78
79 # Test OUTPUT_NAME properties with generator expressions
80 add_library(testLib7 STATIC testLib7.c)
81 set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_DEBUG testLib7D-$<CONFIG>)
82 set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_RELEASE testLib7R-$<CONFIG>)
83 set_property(TARGET testLib7 PROPERTY OUTPUT_NAME testLib7-$<CONFIG>)
84
85 # Test exporting OBJECT targets
86 add_library(testLib8 OBJECT testLib8A.c testLib8B.c sub/testLib8C.c)
87
88 if(NOT CMAKE_GENERATOR STREQUAL "Xcode" OR NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")
89   set(maybe_OBJECTS_DESTINATION OBJECTS DESTINATION $<1:lib>)
90 else()
91   set(maybe_OBJECTS_DESTINATION "")
92 endif()
93
94 cmake_policy(PUSH)
95 cmake_policy(SET CMP0022 NEW)
96 add_library(testLib9ObjPub OBJECT testLib9ObjPub.c)
97 target_compile_definitions(testLib9ObjPub INTERFACE testLib9ObjPub_USED)
98 add_library(testLib9ObjPriv OBJECT testLib9ObjPriv.c)
99 target_compile_definitions(testLib9ObjPriv INTERFACE testLib9ObjPriv_USED)
100 add_library(testLib9ObjIface OBJECT testLib9ObjIface.c)
101 target_compile_definitions(testLib9ObjIface INTERFACE testLib9ObjIface_USED)
102 add_library(testLib9 STATIC testLib9.c)
103 target_link_libraries(testLib9 INTERFACE testLib9ObjIface PUBLIC testLib9ObjPub PRIVATE testLib9ObjPriv)
104 cmake_policy(POP)
105
106 # Test using the target_link_libraries command to set the
107 # LINK_INTERFACE_LIBRARIES* properties.  We construct two libraries
108 # providing the same two symbols.  In each library one of the symbols
109 # will work and the other one will fail to link.  The import part of
110 # this test will try to use the symbol corresponding to the
111 # configuration in which it is built.  If the proper library is not
112 # used via the link interface the import test will fail to link.
113 add_library(testLib4lib STATIC testLib4lib.c)
114 add_library(testLib4libdbg STATIC testLib4libopt.c testLib4libdbg.c)
115 add_library(testLib4libopt STATIC testLib4libdbg.c testLib4libopt.c)
116 set_property(TARGET testLib4libdbg PROPERTY COMPILE_DEFINITIONS LIB_DBG)
117 set_property(TARGET testLib4libopt PROPERTY COMPILE_DEFINITIONS LIB_OPT)
118 target_link_libraries(testLib4
119   LINK_INTERFACE_LIBRARIES
120   testLib4lib debug testLib4libdbg optimized testLib4libopt
121   )
122
123 add_executable(testExe3 testExe3.c)
124 set_property(TARGET testExe3 PROPERTY MACOSX_BUNDLE 1)
125
126 # Test <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_DIRECTORY[_<CONFIG>] properties with generator expressions
127 add_executable(testExe4 testExe4.c)
128 target_link_libraries(testExe4 testExe1lib)
129 set_property(TARGET testLib7 PROPERTY ARCHIVE_OUTPUT_DIRECTORY_DEBUG testLib7D-$<CONFIG>)
130 set_property(TARGET testLib7 PROPERTY ARCHIVE_OUTPUT_DIRECTORY_RELEASE testLib7R-$<CONFIG>)
131 set_property(TARGET testLib7 PROPERTY ARCHIVE_OUTPUT_DIRECTORY testLib7-$<CONFIG>)
132 set_property(TARGET testLib5 PROPERTY LIBRARY_OUTPUT_DIRECTORY_DEBUG testLib5D-$<CONFIG>)
133 set_property(TARGET testLib5 PROPERTY LIBRARY_OUTPUT_DIRECTORY_RELEASE testLib5R-$<CONFIG>)
134 set_property(TARGET testLib5 PROPERTY LIBRARY_OUTPUT_DIRECTORY testLib5-$<CONFIG>)
135 set_property(TARGET testExe4 PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG testExe4D-$<CONFIG>)
136 set_property(TARGET testExe4 PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE testExe4R-$<CONFIG>)
137 set_property(TARGET testExe4 PROPERTY RUNTIME_OUTPUT_DIRECTORY testExe4-$<CONFIG>)
138
139 # Test cyclic dependencies.
140 add_library(testLibCycleA STATIC
141   testLibCycleA1.c testLibCycleA2.c testLibCycleA3.c)
142 add_library(testLibCycleB STATIC
143   testLibCycleB1.c testLibCycleB2.c testLibCycleB3.c)
144 target_link_libraries(testLibCycleA testLibCycleB)
145 target_link_libraries(testLibCycleB testLibCycleA)
146 set_property(TARGET testLibCycleA PROPERTY LINK_INTERFACE_MULTIPLICITY 3)
147
148 add_library(testLibNoSONAME SHARED testLibNoSONAME.c)
149 set_property(TARGET testLibNoSONAME PROPERTY NO_SONAME 1)
150
151 add_library(testInterfaceIncludeUser INTERFACE)
152 target_include_directories(testInterfaceIncludeUser
153   INTERFACE
154     "$<INSTALL_INTERFACE:include/testInterfaceIncludeUser>"
155     "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/testInterfaceIncludeUser>"
156 )
157 set_property(TARGET testInterfaceIncludeUser PROPERTY IMPORTED_NO_SYSTEM 1)
158 install(
159   FILES
160     "${CMAKE_CURRENT_SOURCE_DIR}/include/testInterfaceIncludeUser/testInterfaceInclude.h"
161   DESTINATION include/testInterfaceIncludeUser
162 )
163
164 cmake_policy(PUSH)
165 cmake_policy(SET CMP0022 NEW)
166
167 # Test control over direct linking.
168 include(../../InterfaceLinkLibrariesDirect/testStaticLibPlugin.cmake)
169 include(../../InterfaceLinkLibrariesDirect/testSharedLibWithHelper.cmake)
170 include(../../InterfaceLinkLibrariesDirect/testExeWithPluginHelper.cmake)
171 if(NOT maybe_OBJECTS_DESTINATION)
172   target_compile_definitions(testSharedLibHelperObj INTERFACE testSharedLibHelperObj_NO_OBJECT)
173   target_compile_definitions(testExePluginHelperObj INTERFACE testExePluginHelperObj_NO_OBJECT)
174 endif()
175
176 # Test exporting dependent libraries into different exports
177 add_library(testLibRequired testLibRequired.c)
178 add_library(testLibDepends testLibDepends.c)
179 target_link_libraries(testLibDepends LINK_PUBLIC testLibRequired)
180 add_library(testStaticLibRequiredPrivate testStaticLibRequiredPrivate.c)
181 target_link_libraries(testLibDepends PRIVATE testStaticLibRequiredPrivate)
182 cmake_policy(POP)
183
184 cmake_policy(PUSH)
185 cmake_policy(SET CMP0022 NEW)
186 cmake_policy(SET CMP0079 NEW)
187 add_library(TopDirLib STATIC testTopDirLib.c)
188 add_subdirectory(SubDirLinkA)
189 add_subdirectory(SubDirLinkB)
190 cmake_policy(POP)
191
192 macro(add_include_lib _libName)
193   file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}.c" "/* no content */\n")
194   add_library(${_libName} "${CMAKE_CURRENT_BINARY_DIR}/${_libName}.c")
195   file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_libName}")
196   set_property(TARGET ${_libName} APPEND PROPERTY
197       INTERFACE_INCLUDE_DIRECTORIES
198         "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${_libName}>"
199       )
200   if (NOT "${ARGV1}" STREQUAL "NO_HEADER")
201       file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h" "/* no content */\n")
202       install(FILES
203         "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h"
204           DESTINATION include/${_libName}
205       )
206   endif()
207 endmacro()
208
209 add_include_lib(testLibIncludeRequired1)
210 add_include_lib(testLibIncludeRequired2)
211 add_include_lib(testLibIncludeRequired3 NO_HEADER)
212 # Generate testLibIncludeRequired4 in the testLibIncludeRequired3 directory
213 # with an error. If the includes from testLibIncludeRequired3 appear first,
214 # the error will be hit.
215 # Below, the '3' library appears before the '4' library
216 # but we are testing that the INSTALL_INTERFACE causes it not to be used
217 # at build time.
218 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h" "#error Should not be included\n")
219 install(FILES
220   "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h"
221     DESTINATION include/testLibIncludeRequired3
222 )
223 add_include_lib(testLibIncludeRequired4)
224 add_include_lib(testLibIncludeRequired5 NO_HEADER)
225 # Generate testLibIncludeRequired6 in the testLibIncludeRequired5 directory
226 # with an error. If the includes from testLibIncludeRequired5 appear first,
227 # the error will be hit.
228 # Below, the '5' library appears before the '6' library
229 # but we are testing that when the installed IMPORTED target is used, from
230 # the Import side of this unit test, the '6' include from the '5' directory
231 # will not be used because it is in the BUILD_INTERFACE only.
232 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired5/testLibIncludeRequired6.h" "#error Should not be included\n")
233 install(FILES
234   "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired5/testLibIncludeRequired6.h"
235     DESTINATION include/testLibIncludeRequired5
236 )
237 add_include_lib(testLibIncludeRequired6)
238
239 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h" "/* No content */\n")
240 install(FILES
241   "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h"
242     DESTINATION include/testLibIncludeRequired7
243 )
244
245 set_property(TARGET testLibRequired APPEND PROPERTY
246   INTERFACE_INCLUDE_DIRECTORIES
247     $<TARGET_PROPERTY:testLibIncludeRequired1,INTERFACE_INCLUDE_DIRECTORIES>
248     $<TARGET_PROPERTY:$<1:$<TARGET_NAME:testLibIncludeRequired2>>,INTERFACE_INCLUDE_DIRECTORIES>
249     $<INSTALL_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired3,INTERFACE_INCLUDE_DIRECTORIES>>
250     $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired4,INTERFACE_INCLUDE_DIRECTORIES>>
251     $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired5,INTERFACE_INCLUDE_DIRECTORIES>>
252     $<INSTALL_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired6,INTERFACE_INCLUDE_DIRECTORIES>>
253     # The BUILD_INTERFACE entry from above is duplicated below. This is to test that
254     # the INSTALL_INTERFACE entry bound by a BUILD_INTERFACE entry on either side is
255     # preprocessed correctly on install(EXPORT).
256     $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired5,INTERFACE_INCLUDE_DIRECTORIES>>
257     # Test that the below is non-fatal
258     $<$<STREQUAL:one,two>:$<TARGET_PROPERTY:not_a_target,INTERFACE_INCLUDE_DIRECTORIES>>
259     $<INSTALL_INTERFACE:include/testLibIncludeRequired7;include/testLibIncludeRequired4>
260 )
261
262 set_property(TARGET testLibRequired APPEND PROPERTY
263   INTERFACE_COMPILE_DEFINITIONS
264     testLibRequired_IFACE_DEFINE
265     $<BUILD_INTERFACE:BuildOnly_DEFINE>
266     $<INSTALL_INTERFACE:InstallOnly_DEFINE>
267 )
268 include(GenerateExportHeader)
269
270 # Test deprecation of imported library
271 add_library(testLibDeprecation STATIC testLib1.c)
272 set_property(TARGET testLibDeprecation PROPERTY DEPRECATION "Deprecated version. Please use latest version")
273
274 add_subdirectory(renamed)
275
276 add_library(testSharedLibRequired SHARED testSharedLibRequired.cpp)
277 generate_export_header(testSharedLibRequired)
278 set_property(TARGET testSharedLibRequired
279   PROPERTY
280     INTERFACE_POSITION_INDEPENDENT_CODE ON
281 )
282 set_property(TARGET testSharedLibRequired APPEND PROPERTY
283   INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
284 )
285 install(FILES
286   "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequired.h"
287   "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequired_export.h"
288     DESTINATION include/testSharedLibRequired
289 )
290 set_property(TARGET testSharedLibRequired APPEND PROPERTY
291   INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
292 )
293 set_property(TARGET testSharedLibRequired APPEND PROPERTY
294   INTERFACE_COMPILE_DEFINITIONS USING_TESTSHAREDLIBREQUIRED
295 )
296 set_property(TARGET testSharedLibRequired
297   APPEND PROPERTY
298     COMPATIBLE_INTERFACE_BOOL CUSTOM_PROP
299 )
300 set_property(TARGET testSharedLibRequired
301   PROPERTY
302     INTERFACE_CUSTOM_PROP ON
303 )
304 set_property(TARGET testSharedLibRequired
305   APPEND PROPERTY
306     COMPATIBLE_INTERFACE_STRING CUSTOM_STRING
307 )
308 set_property(TARGET testSharedLibRequired
309   PROPERTY
310     INTERFACE_CUSTOM_STRING testcontent
311 )
312 set_property(TARGET testSharedLibRequired APPEND PROPERTY
313   INTERFACE_COMPILE_OPTIONS
314     $<$<CXX_COMPILER_ID:GNU>:-DCUSTOM_COMPILE_OPTION>
315     $<$<CXX_COMPILER_ID:LCC>:-DCUSTOM_COMPILE_OPTION>
316 )
317
318 add_library(testSharedLibRequiredUser SHARED testSharedLibRequiredUser.cpp)
319 generate_export_header(testSharedLibRequiredUser)
320 # LINK_PRIVATE so that it appears in the LINK_DEPENDENT_LIBRARIES, but not
321 # the INTERFACE_LINK_LIBRARIES.
322 set_property(TARGET testSharedLibRequiredUser APPEND PROPERTY
323   INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
324 )
325 target_link_libraries(testSharedLibRequiredUser LINK_PRIVATE testSharedLibRequired)
326 install(FILES
327   "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequiredUser.h"
328   "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequireduser_export.h"
329     DESTINATION include/testSharedLibRequiredUser
330 )
331
332 cmake_policy(PUSH)
333 cmake_policy(SET CMP0022 NEW)
334 add_library(testSharedLibRequiredUser2 SHARED testSharedLibRequiredUser2.cpp)
335 generate_export_header(testSharedLibRequiredUser2)
336 set_property(TARGET testSharedLibRequiredUser2 APPEND PROPERTY
337   INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
338 )
339 set_property(TARGET testSharedLibRequiredUser2 PROPERTY LINK_LIBRARIES testSharedLibRequired)
340 set_property(TARGET testSharedLibRequiredUser2 PROPERTY INTERFACE_LINK_LIBRARIES testSharedLibRequired)
341 install(FILES
342   "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequiredUser2.h"
343   "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequireduser2_export.h"
344     DESTINATION include/testSharedLibRequiredUser2
345 )
346 cmake_policy(POP)
347
348 cmake_policy(PUSH)
349 cmake_policy(SET CMP0041 NEW)
350 add_library(testSharedLibDepends SHARED testSharedLibDepends.cpp)
351 set_property(TARGET testSharedLibDepends APPEND PROPERTY
352   INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
353 )
354 generate_export_header(testSharedLibDepends)
355
356 set_property(TARGET testSharedLibDepends APPEND PROPERTY
357   INTERFACE_INCLUDE_DIRECTORIES
358     $<TARGET_PROPERTY:testSharedLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
359 )
360 install(FILES
361   "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibDepends.h"
362   "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibdepends_export.h"
363     DESTINATION include/testSharedLibDepends
364 )
365 set_property(TARGET testSharedLibDepends APPEND PROPERTY
366   INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/$<1:include>/testSharedLibDepends>"
367                                 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
368 )
369 cmake_policy(POP)
370
371 # LINK_PRIVATE because the LINK_INTERFACE_LIBRARIES is specified above.
372 target_link_libraries(testSharedLibDepends LINK_PRIVATE testSharedLibRequired)
373 target_link_libraries(testSharedLibDepends LINK_PUBLIC renamed_on_export)
374 target_link_libraries(testSharedLibDepends LINK_INTERFACE_LIBRARIES
375   $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:$<TARGET_NAME:testSharedLibRequired>>)
376
377 cmake_policy(PUSH)
378 cmake_policy(SET CMP0022 OLD)
379 add_library(cmp0022OLD SHARED cmp0022_vs6_1.cpp)
380 generate_export_header(cmp0022OLD BASE_NAME cmp0022)
381 target_include_directories(cmp0022OLD PUBLIC
382   "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
383   "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/cmp0022>"
384 )
385 cmake_policy(SET CMP0022 NEW)
386 add_library(cmp0022NEW SHARED cmp0022_vs6_1.cpp)
387 set_property(TARGET cmp0022NEW PROPERTY DEFINE_SYMBOL cmp0022OLD_EXPORTS)
388 target_include_directories(cmp0022NEW PUBLIC
389   "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
390   "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/cmp0022>"
391 )
392 cmake_policy(POP)
393 install(FILES
394   "${CMAKE_CURRENT_SOURCE_DIR}/cmp0022.h"
395   "${CMAKE_CURRENT_BINARY_DIR}/cmp0022_export.h"
396     DESTINATION include/cmp0022
397 )
398
399 set_property(TARGET testLib2 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USING_TESTLIB2)
400 set_property(TARGET testLib3 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USING_TESTLIB3)
401 set_target_properties(testLib3 PROPERTIES
402   EXPORT_PROPERTIES "EXPORTED_PROPERTY1"
403   EXPORTED_PROPERTY1 "EXPORTING_TESTLIB3")
404 set_target_properties(testLib4 PROPERTIES
405   EXPORTED_PROPERTY2 "EXPORTING_TESTLIB4_1"
406   EXPORTED_PROPERTY3 "EXPORTING_TESTLIB4_2")
407 set_property(TARGET testLib4 PROPERTY
408   EXPORT_PROPERTIES EXPORTED_PROPERTY2 EXPORTED_PROPERTY3)
409
410 set_property(TARGET cmp0022NEW APPEND PROPERTY INTERFACE_LINK_LIBRARIES testLib2)
411 # set_property(TARGET cmp0022NEW APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLibIncludeRequired2) # TODO: Test for error
412 set_property(TARGET cmp0022OLD APPEND PROPERTY INTERFACE_LINK_LIBRARIES testLib2)
413 set_property(TARGET cmp0022OLD APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLib3)
414
415 add_library(noIncludesInterface empty.cpp)
416
417 add_library(systemlib SHARED systemlib.cpp)
418 install(FILES systemlib.h DESTINATION include/systemlib)
419 target_include_directories(systemlib
420   INTERFACE
421     $<INSTALL_INTERFACE:include/systemlib>
422     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
423 )
424
425 add_library(testMod1 MODULE empty.cpp)
426 add_library(testMod2 MODULE empty.cpp)
427 set_property(TARGET testMod2 PROPERTY BUNDLE 1)
428
429 install(TARGETS testLibRequired
430         EXPORT RequiredExp DESTINATION lib
431         INCLUDES DESTINATION
432           installIncludesTest
433           $<INSTALL_PREFIX>/installIncludesTest2
434           installIncludesTest3/$<TARGET_PROPERTY:NAME>
435           $<TARGET_PROPERTY:NAME>/installIncludesTest4
436           $<INSTALL_INTERFACE:installIncludesTest5$<0:>>
437           $<INSTALL_INTERFACE:$<0:>installIncludesTest6>
438           $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/installIncludesTest7>
439 )
440
441 target_include_directories(testLibRequired INTERFACE
442   # These can't be in the above install(INCLUDES DESTINATION call because
443   # that is only for installed interfaces. These directories are prefixes
444   # in the build dir, which is an error for the installed interface.
445   # We add them here so that we don't have to add conditions in the Import
446   # component of the test.
447   $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5$<0:>>
448   $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/$<0:>installIncludesTest6>
449   $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7>
450   $<INSTALL_INTERFACE:installIncludesTest8/$<0:>>
451   $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8$<0:>>
452 )
453 install(TARGETS
454           testLibIncludeRequired1
455           testLibIncludeRequired2
456           testLibIncludeRequired3
457           testLibIncludeRequired4
458           testLibIncludeRequired5
459           testLibIncludeRequired6
460           testSharedLibRequired
461           testSharedLibRequiredUser
462           testSharedLibRequiredUser2
463           noIncludesInterface
464         EXPORT RequiredExp DESTINATION lib
465         INCLUDES DESTINATION
466           $<INSTALL_PREFIX>/include/$<TARGET_PROPERTY:NAME>
467 )
468 install(TARGETS
469           testStaticLibRequiredPrivate
470         EXPORT RequiredExp DESTINATION lib
471 )
472 install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredTargets.cmake DESTINATION lib/cmake/testLibRequired)
473
474 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest")
475 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h" "/* No content */\n")
476
477 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2")
478 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h" "/* No content */\n")
479 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired")
480 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h" "/* No content */\n")
481 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4")
482 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h" "/* No content */\n")
483 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5")
484 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h" "/* No content */\n")
485 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6")
486 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h" "/* No content */\n")
487 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7")
488 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h" "/* No content */\n")
489 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8")
490 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h" "/* No content */\n")
491 install(FILES
492   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
493   DESTINATION installIncludesTest
494 )
495 install(FILES
496   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
497   DESTINATION installIncludesTest2
498 )
499 install(FILES
500   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h"
501   DESTINATION installIncludesTest3/testLibRequired
502 )
503 install(FILES
504   "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h"
505   DESTINATION testLibRequired/installIncludesTest4
506 )
507 install(FILES
508   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h"
509   DESTINATION installIncludesTest5
510 )
511 install(FILES
512   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h"
513   DESTINATION installIncludesTest6
514 )
515 install(FILES
516   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h"
517   DESTINATION installIncludesTest7
518 )
519 install(FILES
520   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h"
521   DESTINATION installIncludesTest8
522 )
523
524 install(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
525 install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)
526
527 file(WRITE
528   "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfig.cmake"
529   "
530 if(\${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION VERSION_LESS 2.3 AND NOT \${CMAKE_FIND_PACKAGE_NAME}_INTERFACES)
531   set(\${CMAKE_FIND_PACKAGE_NAME}_NO_INTERFACES 1)
532 endif()
533 include(\"\${CMAKE_CURRENT_LIST_DIR}/testLibRequiredTargets.cmake\")
534 set(\${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS \"${CMAKE_CURRENT_BINARY_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}\" )
535 "
536 )
537
538 include(CMakePackageConfigHelpers)
539 write_basic_package_version_file( testLibRequiredConfigVersion.cmake VERSION 2.5 COMPATIBILITY AnyNewerVersion)
540
541 install(FILES
542   "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfig.cmake"
543   "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfigVersion.cmake"
544   DESTINATION lib/cmake/testLibRequired
545 )
546
547 # Install and export from install tree.
548 install(
549   TARGETS
550   testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3 testExe4
551   testExe2lib testLib4lib testLib4libdbg testLib4libopt
552   testLib6 testLib7 testLib8
553   testLib9
554   testLibDeprecation
555   testLibCycleA testLibCycleB
556   testLibNoSONAME
557   testStaticLibWithPlugin testStaticLibPluginExtra testStaticLibPlugin
558   testSharedLibWithHelper testSharedLibHelperObj
559   testExeWithPluginHelper testExePluginHelperObj
560   testMod1 testMod2
561   cmp0022NEW cmp0022OLD
562   TopDirLib SubDirLinkA
563   systemlib
564   testInterfaceIncludeUser
565   EXPORT exp
566   RUNTIME DESTINATION $<1:bin>$<0:/wrong>
567   LIBRARY DESTINATION $<1:lib>$<0:/wrong> NAMELINK_SKIP
568   ARCHIVE DESTINATION $<1:lib>$<0:/wrong>
569   ${maybe_OBJECTS_DESTINATION}
570   FRAMEWORK DESTINATION Frameworks
571   BUNDLE DESTINATION Applications
572   )
573 install(
574   TARGETS
575   testLib9ObjPub testLib9ObjPriv testLib9ObjIface
576   EXPORT exp
577   )
578 if (APPLE)
579   file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/testLib4.framework/Headers)
580   file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Debug/testLib4.framework/Headers)
581   file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Release/testLib4.framework/Headers)
582   install(FILES testLib4.h DESTINATION Frameworks/testLib4.framework/Headers)
583 endif()
584 install(
585   TARGETS
586   testExe2libImp testLib3Imp
587   EXPORT exp
588   RUNTIME DESTINATION bin
589   LIBRARY DESTINATION lib/impl
590   ARCHIVE DESTINATION lib/impl
591   )
592 install(
593   TARGETS
594   testLib3ImpDep
595   EXPORT exp
596   RUNTIME DESTINATION bin
597   LIBRARY DESTINATION lib/impl/dep
598   ARCHIVE DESTINATION lib/impl/dep
599   )
600 install(
601   TARGETS testLib5
602   EXPORT exp
603   # Leave out RUNTIME DESTINATION to test implib-only export.
604   LIBRARY DESTINATION lib
605   ARCHIVE DESTINATION lib
606   )
607 install(EXPORT exp NAMESPACE exp_ DESTINATION lib/exp)
608
609 # Install testLib5.dll outside the export.
610 if(WIN32)
611   install(TARGETS testLib5 RUNTIME DESTINATION bin)
612 endif()
613
614 add_subdirectory(sublib) # For CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE test.
615
616 # Export from build tree.
617 export(TARGETS testExe1 testLib1 testLib2 testLib3
618   testExe2libImp testLib3Imp testLib3ImpDep subdirlib
619   testSharedLibRequired testSharedLibRequiredUser testSharedLibRequiredUser2
620   testSharedLibDepends renamed_on_export
621   cmp0022NEW cmp0022OLD
622   TopDirLib SubDirLinkA
623   systemlib
624   testInterfaceIncludeUser
625   NAMESPACE bld_
626   FILE ExportBuildTree.cmake
627   )
628 export(TARGETS testExe2 testLib4 testLib5 testLib6 testLib7 testExe3 testExe4 testExe2lib
629   testLib8
630   testLib9 testLib9ObjPub testLib9ObjPriv testLib9ObjIface
631   testLibDeprecation
632   testLib4lib testLib4libdbg testLib4libopt
633   testLibCycleA testLibCycleB
634   testLibNoSONAME
635   testStaticLibWithPlugin testStaticLibPluginExtra testStaticLibPlugin
636   testSharedLibWithHelper testSharedLibHelperObj
637   testExeWithPluginHelper testExePluginHelperObj
638   testMod1 testMod2
639   testLibPerConfigDest
640   NAMESPACE bld_
641   APPEND FILE ExportBuildTree.cmake
642   )
643
644 add_subdirectory(Interface)
645
646 #-----------------------------------------------------------------------------
647 # Install export with absolute destination but relative pieces.
648 add_library(testLibAbs1 STATIC testLibAbs1.c)
649 target_include_directories(testLibAbs1 INTERFACE
650   "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/abs/1a;include/abs/1b>"
651   )
652 install(
653   TARGETS testLibAbs1
654   EXPORT expAbs
655   ARCHIVE DESTINATION lib
656   INCLUDES DESTINATION include/abs
657   )
658 install(DIRECTORY $<1:include/abs>$<0:/wrong> DESTINATION $<1:include>$<0:/wrong>)
659 install(EXPORT expAbs NAMESPACE expAbs_ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/expAbs)
660
661
662 #------------------------------------------------------------------------------
663 # test export of INTERFACE_LINK_OPTIONS
664 add_library(testLinkOptions INTERFACE)
665 target_link_options(testLinkOptions INTERFACE INTERFACE_FLAG)
666
667 install(TARGETS testLinkOptions
668         EXPORT RequiredExp DESTINATION lib)
669 export(TARGETS testLinkOptions NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
670
671
672 #------------------------------------------------------------------------------
673 # test export of INTERFACE_LINK_DIRECTORIES
674 add_library(testLinkDirectories INTERFACE)
675 target_link_directories(testLinkDirectories INTERFACE
676   $<BUILD_INTERFACE:/interface/build>
677   $<INSTALL_INTERFACE:interface/install>)
678
679 install(TARGETS testLinkDirectories
680         EXPORT RequiredExp DESTINATION lib)
681 export(TARGETS testLinkDirectories NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
682
683
684 #------------------------------------------------------------------------------
685 # test export of INTERFACE_LINK_DEPENDS
686 if(CMAKE_GENERATOR MATCHES "Make|Ninja")
687   add_library(testLinkDepends INTERFACE)
688   set_property(TARGET testLinkDepends PROPERTY INTERFACE_LINK_DEPENDS
689     $<BUILD_INTERFACE:BUILD_LINK_DEPENDS>
690     $<INSTALL_INTERFACE:INSTALL_LINK_DEPENDS>)
691
692   install(TARGETS testLinkDepends
693     EXPORT RequiredExp DESTINATION lib)
694   export(TARGETS testLinkDepends NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
695 endif()
696
697 #------------------------------------------------------------------------------
698 # test export of CUDA language
699 if(CMake_TEST_CUDA)
700   enable_language(CUDA)
701   add_library(cudaInterfaceLib INTERFACE)
702   target_compile_features(cudaInterfaceLib INTERFACE $<BUILD_INTERFACE:cuda_std_11> $<INSTALL_INTERFACE:cuda_std_14>)
703
704   install(TARGETS cudaInterfaceLib
705     EXPORT RequiredExp DESTINATION lib)
706   export(TARGETS cudaInterfaceLib NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
707 endif()
708
709 # Test the presence of targets named the same as languages.
710 # IMPORTED_LINK_INTERFACE_LANGUAGES entries should not be targets.
711 add_library(C INTERFACE)
712 add_library(CXX INTERFACE)
713
714 #------------------------------------------------------------------------------
715 # test export of targets built from sources named using $<CONFIG> generator-expression
716 # FIXME: Enable test on Xcode generator when it supports per-config sources.
717 if(NOT XCODE)
718   file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Generated_$<CONFIG>.cpp" CONTENT "// content")
719   add_library(testStaticFromGeneratedSource STATIC)
720   target_sources(testStaticFromGeneratedSource PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/Generated_$<CONFIG>.cpp")
721
722   add_library(testLibFromGeneratedSource SHARED empty.cpp)
723   target_link_libraries(testLibFromGeneratedSource PRIVATE testStaticFromGeneratedSource)
724
725   install(TARGETS testLibFromGeneratedSource EXPORT testLibFromGeneratedSource_Export)
726   install(EXPORT testLibFromGeneratedSource_Export DESTINATION lib)
727 endif()
728
729 add_subdirectory(install-RUNTIME_DEPENDENCY_SET)