CMakeLists.txt 31 KB

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