CMakeLists.txt 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. cmake_minimum_required (VERSION 2.7.20090711)
  2. project(Export C CXX)
  3. # Pretend that RelWithDebInfo should link to debug libraries to test
  4. # the DEBUG_CONFIGURATIONS property.
  5. set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS Debug RelWithDebInfo)
  6. add_library(testExe1lib STATIC testExe1lib.c) # not exported
  7. add_executable(testExe1 testExe1.c)
  8. target_link_libraries(testExe1 testExe1lib)
  9. set_property(TARGET testExe1 PROPERTY VERSION 4)
  10. add_library(testExe2libImp SHARED testExe2libImp.c)
  11. set_property(TARGET testExe2libImp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
  12. add_library(testExe2lib SHARED testExe2lib.c)
  13. target_link_libraries(testExe2lib testExe2libImp)
  14. set_property(TARGET testExe2lib PROPERTY LINK_INTERFACE_LIBRARIES "")
  15. add_executable(testExe2 testExe2.c)
  16. set_property(TARGET testExe2 PROPERTY ENABLE_EXPORTS 1)
  17. set_property(TARGET testExe2 PROPERTY LINK_INTERFACE_LIBRARIES testExe2lib)
  18. add_library(testLib1 STATIC testLib1.c)
  19. add_library(testLib2 STATIC testLib2.c)
  20. target_link_libraries(testLib2 testLib1)
  21. # Test install(FILES) with generator expressions referencing testLib1.
  22. add_custom_command(TARGET testLib1 POST_BUILD
  23. COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:testLib1>
  24. $<TARGET_FILE:testLib1>.genex
  25. )
  26. install(FILES $<TARGET_FILE:testLib1>.genex
  27. DESTINATION $<1:lib>$<0:/wrong>
  28. )
  29. set_property(TARGET testLib1 PROPERTY MY_FILES
  30. ${CMAKE_CURRENT_SOURCE_DIR}/testLib1file1.txt
  31. ${CMAKE_CURRENT_SOURCE_DIR}/testLib1file2.txt
  32. )
  33. install(FILES $<TARGET_PROPERTY:testLib1,MY_FILES>
  34. DESTINATION $<1:doc>$<0:/wrong>
  35. )
  36. # Test library with empty link interface. Link it to an implementation
  37. # dependency that itself links to dependencies publicly.
  38. add_library(testLib3ImpDep SHARED testLib3ImpDep.c)
  39. set_property(TARGET testLib3ImpDep PROPERTY LIBRARY_OUTPUT_DIRECTORY impl/dep)
  40. add_library(testLib3Imp SHARED testLib3Imp.c)
  41. set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
  42. target_link_libraries(testLib3Imp testLib3ImpDep)
  43. add_library(testLib3 SHARED testLib3.c)
  44. target_link_libraries(testLib3 testLib3Imp)
  45. set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "")
  46. set_property(TARGET testLib3 PROPERTY VERSION 1.2)
  47. set_property(TARGET testLib3 PROPERTY SOVERSION 3)
  48. # Test <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME[_<CONFIG>] properties.
  49. set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_DEBUG testLib3dll-d)
  50. set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_RELEASE testLib3dll-r)
  51. set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME testLib3dll)
  52. set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_DEBUG testLib3lib-d)
  53. set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_RELEASE testLib3lib-r)
  54. set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME testLib3lib)
  55. set_property(TARGET testLib3 PROPERTY ARCHIVE_OUTPUT_NAME testLib3import)
  56. add_library(testLib4 SHARED testLib4.c)
  57. set_property(TARGET testLib4 PROPERTY FRAMEWORK 1)
  58. add_library(testLib5 SHARED testLib5.c)
  59. add_library(testLib6 STATIC testLib6.cxx testLib6c.c)
  60. add_library(testLibPerConfigDest STATIC testLibPerConfigDest.c)
  61. install(TARGETS testLibPerConfigDest EXPORT exp
  62. DESTINATION lib/$<$<BOOL:$<CONFIG>>:$<CONFIG>>$<$<NOT:$<BOOL:$<CONFIG>>>:NoConfig>
  63. )
  64. # Test OUTPUT_NAME properties with generator expressions
  65. add_library(testLib7 STATIC testLib7.c)
  66. set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_DEBUG testLib7D-$<CONFIG>)
  67. set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_RELEASE testLib7R-$<CONFIG>)
  68. set_property(TARGET testLib7 PROPERTY OUTPUT_NAME testLib7-$<CONFIG>)
  69. # Test exporting OBJECT targets
  70. add_library(testLib8 OBJECT testLib8A.c testLib8B.c sub/testLib8C.c)
  71. if(NOT CMAKE_GENERATOR STREQUAL "Xcode" OR NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;$]")
  72. set(maybe_OBJECTS_DESTINATION OBJECTS DESTINATION $<1:lib>)
  73. else()
  74. set(maybe_OBJECTS_DESTINATION "")
  75. endif()
  76. add_library(testLib9Obj OBJECT testLib9Obj.c)
  77. # Test using the target_link_libraries command to set the
  78. # LINK_INTERFACE_LIBRARIES* properties. We construct two libraries
  79. # providing the same two symbols. In each library one of the symbols
  80. # will work and the other one will fail to link. The import part of
  81. # this test will try to use the symbol corresponding to the
  82. # configuration in which it is built. If the proper library is not
  83. # used via the link interface the import test will fail to link.
  84. add_library(testLib4lib STATIC testLib4lib.c)
  85. add_library(testLib4libdbg STATIC testLib4libopt.c testLib4libdbg.c)
  86. add_library(testLib4libopt STATIC testLib4libdbg.c testLib4libopt.c)
  87. set_property(TARGET testLib4libdbg PROPERTY COMPILE_DEFINITIONS LIB_DBG)
  88. set_property(TARGET testLib4libopt PROPERTY COMPILE_DEFINITIONS LIB_OPT)
  89. target_link_libraries(testLib4
  90. LINK_INTERFACE_LIBRARIES
  91. testLib4lib debug testLib4libdbg optimized testLib4libopt
  92. )
  93. add_executable(testExe3 testExe3.c)
  94. set_property(TARGET testExe3 PROPERTY MACOSX_BUNDLE 1)
  95. # Test <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_DIRECTORY[_<CONFIG>] properties with generator expressions
  96. add_executable(testExe4 testExe4.c)
  97. target_link_libraries(testExe4 testExe1lib)
  98. set_property(TARGET testLib7 PROPERTY ARCHIVE_OUTPUT_DIRECTORY_DEBUG testLib7D-$<CONFIG>)
  99. set_property(TARGET testLib7 PROPERTY ARCHIVE_OUTPUT_DIRECTORY_RELEASE testLib7R-$<CONFIG>)
  100. set_property(TARGET testLib7 PROPERTY ARCHIVE_OUTPUT_DIRECTORY testLib7-$<CONFIG>)
  101. set_property(TARGET testLib5 PROPERTY LIBRARY_OUTPUT_DIRECTORY_DEBUG testLib5D-$<CONFIG>)
  102. set_property(TARGET testLib5 PROPERTY LIBRARY_OUTPUT_DIRECTORY_RELEASE testLib5R-$<CONFIG>)
  103. set_property(TARGET testLib5 PROPERTY LIBRARY_OUTPUT_DIRECTORY testLib5-$<CONFIG>)
  104. set_property(TARGET testExe4 PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG testExe4D-$<CONFIG>)
  105. set_property(TARGET testExe4 PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE testExe4R-$<CONFIG>)
  106. set_property(TARGET testExe4 PROPERTY RUNTIME_OUTPUT_DIRECTORY testExe4-$<CONFIG>)
  107. # Test cyclic dependencies.
  108. add_library(testLibCycleA STATIC
  109. testLibCycleA1.c testLibCycleA2.c testLibCycleA3.c)
  110. add_library(testLibCycleB STATIC
  111. testLibCycleB1.c testLibCycleB2.c testLibCycleB3.c)
  112. target_link_libraries(testLibCycleA testLibCycleB)
  113. target_link_libraries(testLibCycleB testLibCycleA)
  114. set_property(TARGET testLibCycleA PROPERTY LINK_INTERFACE_MULTIPLICITY 3)
  115. add_library(testLibNoSONAME SHARED testLibNoSONAME.c)
  116. set_property(TARGET testLibNoSONAME PROPERTY NO_SONAME 1)
  117. cmake_policy(PUSH)
  118. cmake_policy(SET CMP0022 NEW)
  119. # Test exporting dependent libraries into different exports
  120. add_library(testLibRequired testLibRequired.c)
  121. add_library(testLibDepends testLibDepends.c)
  122. target_link_libraries(testLibDepends LINK_PUBLIC testLibRequired)
  123. add_library(testStaticLibRequiredPrivate testStaticLibRequiredPrivate.c)
  124. target_link_libraries(testLibDepends PRIVATE testStaticLibRequiredPrivate)
  125. cmake_policy(POP)
  126. macro(add_include_lib _libName)
  127. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}.c" "/* no content */\n")
  128. add_library(${_libName} "${CMAKE_CURRENT_BINARY_DIR}/${_libName}.c")
  129. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_libName}")
  130. set_property(TARGET ${_libName} APPEND PROPERTY
  131. INTERFACE_INCLUDE_DIRECTORIES
  132. "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${_libName}>"
  133. )
  134. if (NOT "${ARGV1}" STREQUAL "NO_HEADER")
  135. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h" "/* no content */\n")
  136. install(FILES
  137. "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h"
  138. DESTINATION include/${_libName}
  139. )
  140. endif()
  141. endmacro()
  142. add_include_lib(testLibIncludeRequired1)
  143. add_include_lib(testLibIncludeRequired2)
  144. add_include_lib(testLibIncludeRequired3 NO_HEADER)
  145. # Generate testLibIncludeRequired4 in the testLibIncludeRequired3 directory
  146. # with an error. If the includes from testLibIncludeRequired3 appear first,
  147. # the error will be hit.
  148. # Below, the '3' library appears before the '4' library
  149. # but we are testing that the INSTALL_INTERFACE causes it not to be used
  150. # at build time.
  151. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h" "#error Should not be included\n")
  152. install(FILES
  153. "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h"
  154. DESTINATION include/testLibIncludeRequired3
  155. )
  156. add_include_lib(testLibIncludeRequired4)
  157. add_include_lib(testLibIncludeRequired5 NO_HEADER)
  158. # Generate testLibIncludeRequired6 in the testLibIncludeRequired5 directory
  159. # with an error. If the includes from testLibIncludeRequired5 appear first,
  160. # the error will be hit.
  161. # Below, the '5' library appears before the '6' library
  162. # but we are testing that when the installed IMPORTED target is used, from
  163. # the Import side of this unit test, the '6' include from the '5' directory
  164. # will not be used because it is in the BUILD_INTERFACE only.
  165. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired5/testLibIncludeRequired6.h" "#error Should not be included\n")
  166. install(FILES
  167. "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired5/testLibIncludeRequired6.h"
  168. DESTINATION include/testLibIncludeRequired5
  169. )
  170. add_include_lib(testLibIncludeRequired6)
  171. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h" "/* No content */\n")
  172. install(FILES
  173. "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h"
  174. DESTINATION include/testLibIncludeRequired7
  175. )
  176. set_property(TARGET testLibRequired APPEND PROPERTY
  177. INTERFACE_INCLUDE_DIRECTORIES
  178. $<TARGET_PROPERTY:testLibIncludeRequired1,INTERFACE_INCLUDE_DIRECTORIES>
  179. $<TARGET_PROPERTY:$<1:$<TARGET_NAME:testLibIncludeRequired2>>,INTERFACE_INCLUDE_DIRECTORIES>
  180. $<INSTALL_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired3,INTERFACE_INCLUDE_DIRECTORIES>>
  181. $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired4,INTERFACE_INCLUDE_DIRECTORIES>>
  182. $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired5,INTERFACE_INCLUDE_DIRECTORIES>>
  183. $<INSTALL_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired6,INTERFACE_INCLUDE_DIRECTORIES>>
  184. # The BUILD_INTERFACE entry from above is duplicated below. This is to test that
  185. # the INSTALL_INTERFACE entry bound by a BUILD_INTERFACE entry on either side is
  186. # preprocessed correctly on install(EXPORT).
  187. $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired5,INTERFACE_INCLUDE_DIRECTORIES>>
  188. # Test that the below is non-fatal
  189. $<$<STREQUAL:one,two>:$<TARGET_PROPERTY:not_a_target,INTERFACE_INCLUDE_DIRECTORIES>>
  190. $<INSTALL_INTERFACE:include/testLibIncludeRequired7;include/testLibIncludeRequired4>
  191. )
  192. set_property(TARGET testLibRequired APPEND PROPERTY
  193. INTERFACE_COMPILE_DEFINITIONS
  194. testLibRequired_IFACE_DEFINE
  195. $<BUILD_INTERFACE:BuildOnly_DEFINE>
  196. $<INSTALL_INTERFACE:InstallOnly_DEFINE>
  197. )
  198. include(GenerateExportHeader)
  199. add_subdirectory(renamed)
  200. add_library(testSharedLibRequired SHARED testSharedLibRequired.cpp)
  201. generate_export_header(testSharedLibRequired)
  202. set_property(TARGET testSharedLibRequired
  203. PROPERTY
  204. INTERFACE_POSITION_INDEPENDENT_CODE ON
  205. )
  206. set_property(TARGET testSharedLibRequired APPEND PROPERTY
  207. INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
  208. )
  209. install(FILES
  210. "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequired.h"
  211. "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequired_export.h"
  212. DESTINATION include/testSharedLibRequired
  213. )
  214. set_property(TARGET testSharedLibRequired APPEND PROPERTY
  215. INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
  216. )
  217. set_property(TARGET testSharedLibRequired APPEND PROPERTY
  218. INTERFACE_COMPILE_DEFINITIONS USING_TESTSHAREDLIBREQUIRED
  219. )
  220. set_property(TARGET testSharedLibRequired
  221. APPEND PROPERTY
  222. COMPATIBLE_INTERFACE_BOOL CUSTOM_PROP
  223. )
  224. set_property(TARGET testSharedLibRequired
  225. PROPERTY
  226. INTERFACE_CUSTOM_PROP ON
  227. )
  228. set_property(TARGET testSharedLibRequired
  229. APPEND PROPERTY
  230. COMPATIBLE_INTERFACE_STRING CUSTOM_STRING
  231. )
  232. set_property(TARGET testSharedLibRequired
  233. PROPERTY
  234. INTERFACE_CUSTOM_STRING testcontent
  235. )
  236. set_property(TARGET testSharedLibRequired APPEND PROPERTY
  237. INTERFACE_COMPILE_OPTIONS
  238. $<$<CXX_COMPILER_ID:GNU>:-DCUSTOM_COMPILE_OPTION>
  239. )
  240. add_library(testSharedLibRequiredUser SHARED testSharedLibRequiredUser.cpp)
  241. generate_export_header(testSharedLibRequiredUser)
  242. # LINK_PRIVATE so that it appears in the LINK_DEPENDENT_LIBRARIES, but not
  243. # the INTERFACE_LINK_LIBRARIES.
  244. set_property(TARGET testSharedLibRequiredUser APPEND PROPERTY
  245. INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
  246. )
  247. target_link_libraries(testSharedLibRequiredUser LINK_PRIVATE testSharedLibRequired)
  248. install(FILES
  249. "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequiredUser.h"
  250. "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequireduser_export.h"
  251. DESTINATION include/testSharedLibRequiredUser
  252. )
  253. cmake_policy(PUSH)
  254. cmake_policy(SET CMP0022 NEW)
  255. add_library(testSharedLibRequiredUser2 SHARED testSharedLibRequiredUser2.cpp)
  256. generate_export_header(testSharedLibRequiredUser2)
  257. set_property(TARGET testSharedLibRequiredUser2 APPEND PROPERTY
  258. INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
  259. )
  260. set_property(TARGET testSharedLibRequiredUser2 PROPERTY LINK_LIBRARIES testSharedLibRequired)
  261. set_property(TARGET testSharedLibRequiredUser2 PROPERTY INTERFACE_LINK_LIBRARIES testSharedLibRequired)
  262. install(FILES
  263. "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequiredUser2.h"
  264. "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequireduser2_export.h"
  265. DESTINATION include/testSharedLibRequiredUser2
  266. )
  267. cmake_policy(POP)
  268. add_library(testSharedLibDepends SHARED testSharedLibDepends.cpp)
  269. set_property(TARGET testSharedLibDepends APPEND PROPERTY
  270. INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
  271. )
  272. generate_export_header(testSharedLibDepends)
  273. set_property(TARGET testSharedLibDepends APPEND PROPERTY
  274. INTERFACE_INCLUDE_DIRECTORIES
  275. $<TARGET_PROPERTY:testSharedLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
  276. )
  277. install(FILES
  278. "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibDepends.h"
  279. "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibdepends_export.h"
  280. DESTINATION include/testSharedLibDepends
  281. )
  282. set_property(TARGET testSharedLibDepends APPEND PROPERTY
  283. INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/testSharedLibDepends>"
  284. "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
  285. )
  286. # LINK_PRIVATE because the LINK_INTERFACE_LIBRARIES is specified above.
  287. target_link_libraries(testSharedLibDepends LINK_PRIVATE testSharedLibRequired)
  288. target_link_libraries(testSharedLibDepends LINK_PUBLIC renamed_on_export)
  289. target_link_libraries(testSharedLibDepends LINK_INTERFACE_LIBRARIES
  290. $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:$<TARGET_NAME:testSharedLibRequired>>)
  291. cmake_policy(PUSH)
  292. cmake_policy(SET CMP0022 OLD)
  293. add_library(cmp0022OLD SHARED cmp0022_vs6_1.cpp)
  294. generate_export_header(cmp0022OLD BASE_NAME cmp0022)
  295. target_include_directories(cmp0022OLD PUBLIC
  296. "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
  297. "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/cmp0022>"
  298. )
  299. cmake_policy(SET CMP0022 NEW)
  300. add_library(cmp0022NEW SHARED cmp0022_vs6_1.cpp)
  301. set_property(TARGET cmp0022NEW PROPERTY DEFINE_SYMBOL cmp0022OLD_EXPORTS)
  302. target_include_directories(cmp0022NEW PUBLIC
  303. "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
  304. "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/cmp0022>"
  305. )
  306. cmake_policy(POP)
  307. install(FILES
  308. "${CMAKE_CURRENT_SOURCE_DIR}/cmp0022.h"
  309. "${CMAKE_CURRENT_BINARY_DIR}/cmp0022_export.h"
  310. DESTINATION include/cmp0022
  311. )
  312. set_property(TARGET testLib2 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USING_TESTLIB2)
  313. set_property(TARGET testLib3 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USING_TESTLIB3)
  314. set_property(TARGET cmp0022NEW APPEND PROPERTY INTERFACE_LINK_LIBRARIES testLib2)
  315. # set_property(TARGET cmp0022NEW APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLibIncludeRequired2) # TODO: Test for error
  316. set_property(TARGET cmp0022OLD APPEND PROPERTY INTERFACE_LINK_LIBRARIES testLib2)
  317. set_property(TARGET cmp0022OLD APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLib3)
  318. add_library(noIncludesInterface empty.cpp)
  319. add_library(systemlib SHARED systemlib.cpp)
  320. install(FILES systemlib.h DESTINATION include/systemlib)
  321. target_include_directories(systemlib
  322. INTERFACE
  323. $<INSTALL_INTERFACE:include/systemlib>
  324. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  325. )
  326. install(TARGETS testLibRequired
  327. EXPORT RequiredExp DESTINATION lib
  328. INCLUDES DESTINATION
  329. installIncludesTest
  330. $<INSTALL_PREFIX>/installIncludesTest2
  331. installIncludesTest3/$<TARGET_PROPERTY:NAME>
  332. $<TARGET_PROPERTY:NAME>/installIncludesTest4
  333. $<INSTALL_INTERFACE:installIncludesTest5$<0:>>
  334. $<INSTALL_INTERFACE:$<0:>installIncludesTest6>
  335. $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/installIncludesTest7>
  336. )
  337. target_include_directories(testLibRequired INTERFACE
  338. # These can't be in the above install(INCLUDES DESTINATION call because
  339. # that is only for installed interfaces. These directories are prefixes
  340. # in the build dir, which is an error for the installed interface.
  341. # We add them here so that we don't have to add conditions in the Import
  342. # component of the test.
  343. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5$<0:>>
  344. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/$<0:>installIncludesTest6>
  345. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7>
  346. $<INSTALL_INTERFACE:installIncludesTest8/$<0:>>
  347. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8$<0:>>
  348. )
  349. install(TARGETS
  350. testLibIncludeRequired1
  351. testLibIncludeRequired2
  352. testLibIncludeRequired3
  353. testLibIncludeRequired4
  354. testLibIncludeRequired5
  355. testLibIncludeRequired6
  356. testSharedLibRequired
  357. testSharedLibRequiredUser
  358. testSharedLibRequiredUser2
  359. noIncludesInterface
  360. EXPORT RequiredExp DESTINATION lib
  361. INCLUDES DESTINATION
  362. $<INSTALL_PREFIX>/include/$<TARGET_PROPERTY:NAME>
  363. )
  364. install(TARGETS
  365. testStaticLibRequiredPrivate
  366. EXPORT RequiredExp DESTINATION lib
  367. )
  368. install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredTargets.cmake DESTINATION lib/cmake/testLibRequired)
  369. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest")
  370. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h" "/* No content */\n")
  371. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2")
  372. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h" "/* No content */\n")
  373. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired")
  374. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h" "/* No content */\n")
  375. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4")
  376. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h" "/* No content */\n")
  377. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5")
  378. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h" "/* No content */\n")
  379. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6")
  380. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h" "/* No content */\n")
  381. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7")
  382. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h" "/* No content */\n")
  383. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8")
  384. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h" "/* No content */\n")
  385. install(FILES
  386. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
  387. DESTINATION installIncludesTest
  388. )
  389. install(FILES
  390. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
  391. DESTINATION installIncludesTest2
  392. )
  393. install(FILES
  394. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h"
  395. DESTINATION installIncludesTest3/testLibRequired
  396. )
  397. install(FILES
  398. "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h"
  399. DESTINATION testLibRequired/installIncludesTest4
  400. )
  401. install(FILES
  402. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h"
  403. DESTINATION installIncludesTest5
  404. )
  405. install(FILES
  406. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h"
  407. DESTINATION installIncludesTest6
  408. )
  409. install(FILES
  410. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h"
  411. DESTINATION installIncludesTest7
  412. )
  413. install(FILES
  414. "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h"
  415. DESTINATION installIncludesTest8
  416. )
  417. install(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
  418. install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)
  419. file(WRITE
  420. "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfig.cmake"
  421. "
  422. if(\${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION VERSION_LESS 2.3 AND NOT \${CMAKE_FIND_PACKAGE_NAME}_INTERFACES)
  423. set(\${CMAKE_FIND_PACKAGE_NAME}_NO_INTERFACES 1)
  424. endif()
  425. include(\"\${CMAKE_CURRENT_LIST_DIR}/testLibRequiredTargets.cmake\")
  426. set(\${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS \"${CMAKE_CURRENT_BINARY_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}\" )
  427. "
  428. )
  429. include(CMakePackageConfigHelpers)
  430. write_basic_package_version_file( testLibRequiredConfigVersion.cmake VERSION 2.5 COMPATIBILITY AnyNewerVersion)
  431. install(FILES
  432. "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfig.cmake"
  433. "${CMAKE_CURRENT_BINARY_DIR}/testLibRequiredConfigVersion.cmake"
  434. DESTINATION lib/cmake/testLibRequired
  435. )
  436. # Install and export from install tree.
  437. install(
  438. TARGETS
  439. testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3 testExe4
  440. testExe2lib testLib4lib testLib4libdbg testLib4libopt
  441. testLib6 testLib7 testLib8
  442. testLibCycleA testLibCycleB
  443. testLibNoSONAME
  444. cmp0022NEW cmp0022OLD
  445. systemlib
  446. EXPORT exp
  447. RUNTIME DESTINATION $<1:bin>
  448. LIBRARY DESTINATION $<1:lib> NAMELINK_SKIP
  449. ARCHIVE DESTINATION $<1:lib>
  450. ${maybe_OBJECTS_DESTINATION}
  451. FRAMEWORK DESTINATION Frameworks
  452. BUNDLE DESTINATION Applications
  453. )
  454. install(
  455. TARGETS
  456. testLib9Obj
  457. EXPORT exp
  458. )
  459. if (APPLE)
  460. file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/testLib4.framework/Headers)
  461. file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Debug/testLib4.framework/Headers)
  462. file(COPY testLib4.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/Release/testLib4.framework/Headers)
  463. install(FILES testLib4.h DESTINATION Frameworks/testLib4.framework/Headers)
  464. endif()
  465. install(
  466. TARGETS
  467. testExe2libImp testLib3Imp
  468. EXPORT exp
  469. RUNTIME DESTINATION bin
  470. LIBRARY DESTINATION lib/impl
  471. ARCHIVE DESTINATION lib/impl
  472. )
  473. install(
  474. TARGETS
  475. testLib3ImpDep
  476. EXPORT exp
  477. RUNTIME DESTINATION bin
  478. LIBRARY DESTINATION lib/impl/dep
  479. ARCHIVE DESTINATION lib/impl/dep
  480. )
  481. install(
  482. TARGETS testLib5
  483. EXPORT exp
  484. # Leave out RUNTIME DESTINATION to test implib-only export.
  485. LIBRARY DESTINATION lib
  486. ARCHIVE DESTINATION lib
  487. )
  488. install(EXPORT exp NAMESPACE exp_ DESTINATION lib/exp)
  489. # Install testLib5.dll outside the export.
  490. if(WIN32)
  491. install(TARGETS testLib5 RUNTIME DESTINATION bin)
  492. endif()
  493. add_subdirectory(sublib) # For CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE test.
  494. # Export from build tree.
  495. export(TARGETS testExe1 testLib1 testLib2 testLib3
  496. testExe2libImp testLib3Imp testLib3ImpDep subdirlib
  497. testSharedLibRequired testSharedLibRequiredUser testSharedLibRequiredUser2
  498. testSharedLibDepends renamed_on_export
  499. cmp0022NEW cmp0022OLD
  500. systemlib
  501. NAMESPACE bld_
  502. FILE ExportBuildTree.cmake
  503. )
  504. export(TARGETS testExe2 testLib4 testLib5 testLib6 testLib7 testExe3 testExe4 testExe2lib
  505. testLib8
  506. testLib9Obj
  507. testLib4lib testLib4libdbg testLib4libopt
  508. testLibCycleA testLibCycleB
  509. testLibNoSONAME
  510. testLibPerConfigDest
  511. NAMESPACE bld_
  512. APPEND FILE ExportBuildTree.cmake
  513. )
  514. add_subdirectory(Interface)
  515. #-----------------------------------------------------------------------------
  516. # Install export with absolute destination but relative pieces.
  517. add_library(testLibAbs1 STATIC testLibAbs1.c)
  518. target_include_directories(testLibAbs1 INTERFACE
  519. "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/abs/1a;include/abs/1b>"
  520. )
  521. install(
  522. TARGETS testLibAbs1
  523. EXPORT expAbs
  524. ARCHIVE DESTINATION lib
  525. INCLUDES DESTINATION include/abs
  526. )
  527. install(DIRECTORY $<1:include/abs>$<0:/wrong> DESTINATION $<1:include>$<0:/wrong>)
  528. install(EXPORT expAbs NAMESPACE expAbs_ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/expAbs)