1 cmake_minimum_required (VERSION 2.7.20090711)
3 cmake_policy(SET CMP0129 NEW)
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)
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)
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)
25 add_library(testLib1 STATIC testLib1.c)
26 add_library(testLib2 STATIC testLib2.c)
27 target_link_libraries(testLib2 testLib1)
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
34 install(FILES $<TARGET_FILE:testLib1>.genex
35 DESTINATION $<1:lib>$<0:/wrong>
37 set_property(TARGET testLib1 PROPERTY MY_FILES
38 ${CMAKE_CURRENT_SOURCE_DIR}/testLib1file1.txt
39 ${CMAKE_CURRENT_SOURCE_DIR}/testLib1file2.txt
41 install(FILES $<TARGET_PROPERTY:testLib1,MY_FILES>
42 DESTINATION $<1:doc>$<0:/wrong>
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)
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)
67 add_library(testLib4 SHARED testLib4.c)
68 set_property(TARGET testLib4 PROPERTY FRAMEWORK 1)
70 add_library(testLib5 SHARED testLib5.c)
72 add_library(testLib6 STATIC testLib6.cxx testLib6c.c)
74 add_library(testLibPerConfigDest STATIC testLibPerConfigDest.c)
75 install(TARGETS testLibPerConfigDest EXPORT exp
76 DESTINATION lib/$<$<BOOL:$<CONFIG>>:$<CONFIG>>$<$<NOT:$<BOOL:$<CONFIG>>>:NoConfig>
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>)
85 # Test exporting OBJECT targets
86 add_library(testLib8 OBJECT testLib8A.c testLib8B.c sub/testLib8C.c)
88 if(NOT CMAKE_GENERATOR STREQUAL "Xcode" OR NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")
89 set(maybe_OBJECTS_DESTINATION OBJECTS DESTINATION $<1:lib>)
91 set(maybe_OBJECTS_DESTINATION "")
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)
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
123 add_executable(testExe3 testExe3.c)
124 set_property(TARGET testExe3 PROPERTY MACOSX_BUNDLE 1)
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>)
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)
148 add_library(testLibNoSONAME SHARED testLibNoSONAME.c)
149 set_property(TARGET testLibNoSONAME PROPERTY NO_SONAME 1)
151 add_library(testInterfaceIncludeUser INTERFACE)
152 target_include_directories(testInterfaceIncludeUser
154 "$<INSTALL_INTERFACE:include/testInterfaceIncludeUser>"
155 "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/testInterfaceIncludeUser>"
157 set_property(TARGET testInterfaceIncludeUser PROPERTY IMPORTED_NO_SYSTEM 1)
160 "${CMAKE_CURRENT_SOURCE_DIR}/include/testInterfaceIncludeUser/testInterfaceInclude.h"
161 DESTINATION include/testInterfaceIncludeUser
165 cmake_policy(SET CMP0022 NEW)
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)
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)
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)
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}>"
200 if (NOT "${ARGV1}" STREQUAL "NO_HEADER")
201 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h" "/* no content */\n")
203 "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h"
204 DESTINATION include/${_libName}
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
218 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h" "#error Should not be included\n")
220 "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h"
221 DESTINATION include/testLibIncludeRequired3
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")
234 "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired5/testLibIncludeRequired6.h"
235 DESTINATION include/testLibIncludeRequired5
237 add_include_lib(testLibIncludeRequired6)
239 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h" "/* No content */\n")
241 "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h"
242 DESTINATION include/testLibIncludeRequired7
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>
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>
268 include(GenerateExportHeader)
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")
274 add_subdirectory(renamed)
276 add_library(testSharedLibRequired SHARED testSharedLibRequired.cpp)
277 generate_export_header(testSharedLibRequired)
278 set_property(TARGET testSharedLibRequired
280 INTERFACE_POSITION_INDEPENDENT_CODE ON
282 set_property(TARGET testSharedLibRequired APPEND PROPERTY
283 INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
286 "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequired.h"
287 "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequired_export.h"
288 DESTINATION include/testSharedLibRequired
290 set_property(TARGET testSharedLibRequired APPEND PROPERTY
291 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
293 set_property(TARGET testSharedLibRequired APPEND PROPERTY
294 INTERFACE_COMPILE_DEFINITIONS USING_TESTSHAREDLIBREQUIRED
296 set_property(TARGET testSharedLibRequired
298 COMPATIBLE_INTERFACE_BOOL CUSTOM_PROP
300 set_property(TARGET testSharedLibRequired
302 INTERFACE_CUSTOM_PROP ON
304 set_property(TARGET testSharedLibRequired
306 COMPATIBLE_INTERFACE_STRING CUSTOM_STRING
308 set_property(TARGET testSharedLibRequired
310 INTERFACE_CUSTOM_STRING testcontent
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>
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}>"
325 target_link_libraries(testSharedLibRequiredUser LINK_PRIVATE testSharedLibRequired)
327 "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequiredUser.h"
328 "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequireduser_export.h"
329 DESTINATION include/testSharedLibRequiredUser
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}>"
339 set_property(TARGET testSharedLibRequiredUser2 PROPERTY LINK_LIBRARIES testSharedLibRequired)
340 set_property(TARGET testSharedLibRequiredUser2 PROPERTY INTERFACE_LINK_LIBRARIES testSharedLibRequired)
342 "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequiredUser2.h"
343 "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequireduser2_export.h"
344 DESTINATION include/testSharedLibRequiredUser2
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}"
354 generate_export_header(testSharedLibDepends)
356 set_property(TARGET testSharedLibDepends APPEND PROPERTY
357 INTERFACE_INCLUDE_DIRECTORIES
358 $<TARGET_PROPERTY:testSharedLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
361 "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibDepends.h"
362 "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibdepends_export.h"
363 DESTINATION include/testSharedLibDepends
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}>"
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>>)
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>"
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>"
394 "${CMAKE_CURRENT_SOURCE_DIR}/cmp0022.h"
395 "${CMAKE_CURRENT_BINARY_DIR}/cmp0022_export.h"
396 DESTINATION include/cmp0022
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)
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)
415 add_library(noIncludesInterface empty.cpp)
417 add_library(systemlib SHARED systemlib.cpp)
418 install(FILES systemlib.h DESTINATION include/systemlib)
419 target_include_directories(systemlib
421 $<INSTALL_INTERFACE:include/systemlib>
422 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
425 add_library(testMod1 MODULE empty.cpp)
426 add_library(testMod2 MODULE empty.cpp)
427 set_property(TARGET testMod2 PROPERTY BUNDLE 1)
429 install(TARGETS testLibRequired
430 EXPORT RequiredExp DESTINATION lib
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>
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:>>
454 testLibIncludeRequired1
455 testLibIncludeRequired2
456 testLibIncludeRequired3
457 testLibIncludeRequired4
458 testLibIncludeRequired5
459 testLibIncludeRequired6
460 testSharedLibRequired
461 testSharedLibRequiredUser
462 testSharedLibRequiredUser2
464 EXPORT RequiredExp DESTINATION lib
466 $<INSTALL_PREFIX>/include/$<TARGET_PROPERTY:NAME>
469 testStaticLibRequiredPrivate
470 EXPORT RequiredExp DESTINATION lib
472 install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredTargets.cmake DESTINATION lib/cmake/testLibRequired)
474 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest")
475 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h" "/* No content */\n")
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")
492 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
493 DESTINATION installIncludesTest
496 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
497 DESTINATION installIncludesTest2
500 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h"
501 DESTINATION installIncludesTest3/testLibRequired
504 "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h"
505 DESTINATION testLibRequired/installIncludesTest4
508 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h"
509 DESTINATION installIncludesTest5
512 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h"
513 DESTINATION installIncludesTest6
516 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h"
517 DESTINATION installIncludesTest7
520 "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h"
521 DESTINATION installIncludesTest8
524 install(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
525 install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)
528 "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfig.cmake"
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)
533 include(\"\${CMAKE_CURRENT_LIST_DIR}/testLibRequiredTargets.cmake\")
534 set(\${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS \"${CMAKE_CURRENT_BINARY_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}\" )
538 include(CMakePackageConfigHelpers)
539 write_basic_package_version_file( testLibRequiredConfigVersion.cmake VERSION 2.5 COMPATIBILITY AnyNewerVersion)
542 "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfig.cmake"
543 "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfigVersion.cmake"
544 DESTINATION lib/cmake/testLibRequired
547 # Install and export from install tree.
550 testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3 testExe4
551 testExe2lib testLib4lib testLib4libdbg testLib4libopt
552 testLib6 testLib7 testLib8
555 testLibCycleA testLibCycleB
557 testStaticLibWithPlugin testStaticLibPluginExtra testStaticLibPlugin
558 testSharedLibWithHelper testSharedLibHelperObj
559 testExeWithPluginHelper testExePluginHelperObj
561 cmp0022NEW cmp0022OLD
562 TopDirLib SubDirLinkA
564 testInterfaceIncludeUser
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
575 testLib9ObjPub testLib9ObjPriv testLib9ObjIface
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)
586 testExe2libImp testLib3Imp
588 RUNTIME DESTINATION bin
589 LIBRARY DESTINATION lib/impl
590 ARCHIVE DESTINATION lib/impl
596 RUNTIME DESTINATION bin
597 LIBRARY DESTINATION lib/impl/dep
598 ARCHIVE DESTINATION lib/impl/dep
603 # Leave out RUNTIME DESTINATION to test implib-only export.
604 LIBRARY DESTINATION lib
605 ARCHIVE DESTINATION lib
607 install(EXPORT exp NAMESPACE exp_ DESTINATION lib/exp)
609 # Install testLib5.dll outside the export.
611 install(TARGETS testLib5 RUNTIME DESTINATION bin)
614 add_subdirectory(sublib) # For CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE test.
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
624 testInterfaceIncludeUser
626 FILE ExportBuildTree.cmake
628 export(TARGETS testExe2 testLib4 testLib5 testLib6 testLib7 testExe3 testExe4 testExe2lib
630 testLib9 testLib9ObjPub testLib9ObjPriv testLib9ObjIface
632 testLib4lib testLib4libdbg testLib4libopt
633 testLibCycleA testLibCycleB
635 testStaticLibWithPlugin testStaticLibPluginExtra testStaticLibPlugin
636 testSharedLibWithHelper testSharedLibHelperObj
637 testExeWithPluginHelper testExePluginHelperObj
641 APPEND FILE ExportBuildTree.cmake
644 add_subdirectory(Interface)
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>"
655 ARCHIVE DESTINATION lib
656 INCLUDES DESTINATION include/abs
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)
662 #------------------------------------------------------------------------------
663 # test export of INTERFACE_LINK_OPTIONS
664 add_library(testLinkOptions INTERFACE)
665 target_link_options(testLinkOptions INTERFACE INTERFACE_FLAG)
667 install(TARGETS testLinkOptions
668 EXPORT RequiredExp DESTINATION lib)
669 export(TARGETS testLinkOptions NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
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>)
679 install(TARGETS testLinkDirectories
680 EXPORT RequiredExp DESTINATION lib)
681 export(TARGETS testLinkDirectories NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
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>)
692 install(TARGETS testLinkDepends
693 EXPORT RequiredExp DESTINATION lib)
694 export(TARGETS testLinkDepends NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
697 #------------------------------------------------------------------------------
698 # test export of CUDA language
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>)
704 install(TARGETS cudaInterfaceLib
705 EXPORT RequiredExp DESTINATION lib)
706 export(TARGETS cudaInterfaceLib NAMESPACE bld_ APPEND FILE ExportBuildTree.cmake)
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)
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.
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")
722 add_library(testLibFromGeneratedSource SHARED empty.cpp)
723 target_link_libraries(testLibFromGeneratedSource PRIVATE testStaticFromGeneratedSource)
725 install(TARGETS testLibFromGeneratedSource EXPORT testLibFromGeneratedSource_Export)
726 install(EXPORT testLibFromGeneratedSource_Export DESTINATION lib)
729 add_subdirectory(install-RUNTIME_DEPENDENCY_SET)