CMakeLists.txt 31 KB

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