CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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 library with empty link interface. Link it to an implementation
  22. # dependency that itself links to dependencies publicly.
  23. add_library(testLib3ImpDep SHARED testLib3ImpDep.c)
  24. set_property(TARGET testLib3ImpDep PROPERTY LIBRARY_OUTPUT_DIRECTORY impl/dep)
  25. add_library(testLib3Imp SHARED testLib3Imp.c)
  26. set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
  27. target_link_libraries(testLib3Imp testLib3ImpDep)
  28. add_library(testLib3 SHARED testLib3.c)
  29. target_link_libraries(testLib3 testLib3Imp)
  30. set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "")
  31. set_property(TARGET testLib3 PROPERTY VERSION 1.2)
  32. set_property(TARGET testLib3 PROPERTY SOVERSION 3)
  33. # Test <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME[_<CONFIG>] properties.
  34. set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_DEBUG testLib3dll-d)
  35. set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_RELEASE testLib3dll-r)
  36. set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME testLib3dll)
  37. set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_DEBUG testLib3lib-d)
  38. set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_RELEASE testLib3lib-r)
  39. set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME testLib3lib)
  40. set_property(TARGET testLib3 PROPERTY ARCHIVE_OUTPUT_NAME testLib3import)
  41. add_library(testLib4 SHARED testLib4.c)
  42. set_property(TARGET testLib4 PROPERTY FRAMEWORK 1)
  43. add_library(testLib5 SHARED testLib5.c)
  44. add_library(testLib6 STATIC testLib6.cxx testLib6c.c)
  45. # Work-around: Visual Studio 6 does not support per-target object files.
  46. set(VS6)
  47. if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
  48. set(VS6 1)
  49. endif()
  50. # Test using the target_link_libraries command to set the
  51. # LINK_INTERFACE_LIBRARIES* properties. We construct two libraries
  52. # providing the same two symbols. In each library one of the symbols
  53. # will work and the other one will fail to link. The import part of
  54. # this test will try to use the symbol corresponding to the
  55. # configuration in which it is built. If the proper library is not
  56. # used via the link interface the import test will fail to link.
  57. add_library(testLib4lib STATIC testLib4lib.c)
  58. add_library(testLib4libdbg STATIC testLib4libopt.c testLib4libdbg${VS6}.c)
  59. add_library(testLib4libopt STATIC testLib4libdbg.c testLib4libopt${VS6}.c)
  60. set_property(TARGET testLib4libdbg PROPERTY COMPILE_DEFINITIONS LIB_DBG)
  61. set_property(TARGET testLib4libopt PROPERTY COMPILE_DEFINITIONS LIB_OPT)
  62. target_link_libraries(testLib4
  63. LINK_INTERFACE_LIBRARIES
  64. testLib4lib debug testLib4libdbg optimized testLib4libopt
  65. )
  66. add_executable(testExe3 testExe3.c)
  67. set_property(TARGET testExe3 PROPERTY MACOSX_BUNDLE 1)
  68. # Test cyclic dependencies.
  69. add_library(testLibCycleA STATIC
  70. testLibCycleA1.c testLibCycleA2.c testLibCycleA3.c)
  71. add_library(testLibCycleB STATIC
  72. testLibCycleB1.c testLibCycleB2.c testLibCycleB3.c)
  73. target_link_libraries(testLibCycleA testLibCycleB)
  74. target_link_libraries(testLibCycleB testLibCycleA)
  75. set_property(TARGET testLibCycleA PROPERTY LINK_INTERFACE_MULTIPLICITY 3)
  76. # Test exporting dependent libraries into different exports
  77. add_library(testLibRequired testLibRequired.c)
  78. add_library(testLibDepends testLibDepends.c)
  79. set_property(TARGET testLibDepends APPEND PROPERTY
  80. INCLUDE_DIRECTORIES
  81. $<TARGET_PROPERTY:testLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
  82. )
  83. set_property(TARGET testLibDepends APPEND PROPERTY
  84. COMPILE_DEFINITIONS
  85. $<TARGET_PROPERTY:testLibRequired,INTERFACE_COMPILE_DEFINITIONS>
  86. )
  87. set_property(TARGET testLibDepends APPEND PROPERTY
  88. INTERFACE_INCLUDE_DIRECTORIES
  89. $<TARGET_PROPERTY:testLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
  90. )
  91. set_property(TARGET testLibDepends APPEND PROPERTY
  92. INTERFACE_COMPILE_DEFINITIONS
  93. $<TARGET_PROPERTY:testLibRequired,INTERFACE_COMPILE_DEFINITIONS>
  94. )
  95. target_link_libraries(testLibDepends testLibRequired)
  96. macro(add_include_lib _libName)
  97. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}.c" "// no content\n")
  98. add_library(${_libName} "${CMAKE_CURRENT_BINARY_DIR}/${_libName}.c")
  99. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_libName}")
  100. set_property(TARGET ${_libName} APPEND PROPERTY
  101. INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/${_libName}")
  102. if (NOT "${ARGV1}" STREQUAL "NO_HEADER")
  103. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h" "// no content\n")
  104. endif()
  105. endmacro()
  106. add_include_lib(testLibIncludeRequired1)
  107. add_include_lib(testLibIncludeRequired2)
  108. add_include_lib(testLibIncludeRequired3 NO_HEADER)
  109. # Generate testLibIncludeRequired4 in the testLibIncludeRequired3 directory
  110. # with an error. If the includes from testLibIncludeRequired3 appear first,
  111. # the error will be hit.
  112. # Below, the '3' library appears before the '4' library
  113. # but we are testing that the INSTALL_INTERFACE causes it not to be used
  114. # at build time.
  115. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired3/testLibIncludeRequired4.h" "#error Should not be included\n")
  116. add_include_lib(testLibIncludeRequired4)
  117. add_include_lib(testLibIncludeRequired5 NO_HEADER)
  118. # Generate testLibIncludeRequired6 in the testLibIncludeRequired5 directory
  119. # with an error. If the includes from testLibIncludeRequired5 appear first,
  120. # the error will be hit.
  121. # Below, the '5' library appears before the '6' library
  122. # but we are testing that when the installed IMPORTED target is used, from
  123. # the Import side of this unit test, the '6' include from the '5' directory
  124. # will not be used because it is in the BUILD_INTERFACE only.
  125. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired5/testLibIncludeRequired6.h" "#error Should not be included\n")
  126. add_include_lib(testLibIncludeRequired6)
  127. set_property(TARGET testLibRequired APPEND PROPERTY
  128. INTERFACE_INCLUDE_DIRECTORIES
  129. $<TARGET_PROPERTY:testLibIncludeRequired1,INTERFACE_INCLUDE_DIRECTORIES>
  130. $<TARGET_PROPERTY:$<1:$<TARGET_NAME:testLibIncludeRequired2>>,INTERFACE_INCLUDE_DIRECTORIES>
  131. $<INSTALL_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired3,INTERFACE_INCLUDE_DIRECTORIES>>
  132. $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired4,INTERFACE_INCLUDE_DIRECTORIES>>
  133. $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired5,INTERFACE_INCLUDE_DIRECTORIES>>
  134. $<INSTALL_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired6,INTERFACE_INCLUDE_DIRECTORIES>>
  135. )
  136. set_property(TARGET testLibRequired APPEND PROPERTY
  137. INTERFACE_COMPILE_DEFINITIONS
  138. testLibRequired_IFACE_DEFINE
  139. $<BUILD_INTERFACE:BuildOnly_DEFINE>
  140. $<INSTALL_INTERFACE:InstallOnly_DEFINE>
  141. )
  142. include(GenerateExportHeader)
  143. add_library(testSharedLibRequired SHARED testSharedLibRequired.cpp)
  144. generate_export_header(testSharedLibRequired)
  145. set_property(TARGET testSharedLibRequired
  146. PROPERTY
  147. INTERFACE_POSITION_INDEPENDENT_CODE ON
  148. )
  149. set_property(TARGET testSharedLibRequired APPEND PROPERTY
  150. INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
  151. )
  152. set_property(TARGET testSharedLibRequired APPEND PROPERTY
  153. INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
  154. "${CMAKE_CURRENT_SOURCE_DIR}"
  155. )
  156. set_property(TARGET testSharedLibRequired
  157. APPEND PROPERTY
  158. COMPATIBLE_INTERFACE_BOOL CUSTOM_PROP
  159. )
  160. set_property(TARGET testSharedLibRequired
  161. PROPERTY
  162. INTERFACE_CUSTOM_PROP ON
  163. )
  164. add_library(testSharedLibDepends SHARED testSharedLibDepends.cpp)
  165. set_property(TARGET testSharedLibDepends APPEND PROPERTY
  166. INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
  167. )
  168. generate_export_header(testSharedLibDepends)
  169. set_property(TARGET testSharedLibDepends APPEND PROPERTY
  170. INTERFACE_INCLUDE_DIRECTORIES
  171. $<TARGET_PROPERTY:testSharedLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
  172. )
  173. set_property(TARGET testSharedLibDepends APPEND PROPERTY
  174. LINK_INTERFACE_LIBRARIES
  175. $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:$<TARGET_NAME:testSharedLibRequired>>
  176. )
  177. # LINK_PRIVATE because the LINK_INTERFACE_LIBRARIES is specified above.
  178. target_link_libraries(testSharedLibDepends LINK_PRIVATE testSharedLibRequired)
  179. install(TARGETS testLibRequired
  180. testLibIncludeRequired1
  181. testLibIncludeRequired2
  182. testLibIncludeRequired3
  183. testLibIncludeRequired4
  184. testLibIncludeRequired5
  185. testLibIncludeRequired6
  186. testSharedLibRequired
  187. EXPORT RequiredExp DESTINATION lib )
  188. install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredConfig.cmake DESTINATION lib/cmake/testLibRequired)
  189. install(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
  190. install(EXPORT DependsExp FILE testLibDependsConfig.cmake DESTINATION lib/cmake/testLibDepends)
  191. # Install and export from install tree.
  192. install(
  193. TARGETS
  194. testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3
  195. testExe2lib testLib4lib testLib4libdbg testLib4libopt
  196. testLib6
  197. testLibCycleA testLibCycleB
  198. EXPORT exp
  199. RUNTIME DESTINATION bin
  200. LIBRARY DESTINATION lib NAMELINK_SKIP
  201. ARCHIVE DESTINATION lib
  202. FRAMEWORK DESTINATION Frameworks
  203. BUNDLE DESTINATION Applications
  204. )
  205. install(
  206. TARGETS
  207. testExe2libImp testLib3Imp
  208. EXPORT exp
  209. RUNTIME DESTINATION bin
  210. LIBRARY DESTINATION lib/impl
  211. ARCHIVE DESTINATION lib/impl
  212. )
  213. install(
  214. TARGETS
  215. testLib3ImpDep
  216. EXPORT exp
  217. RUNTIME DESTINATION bin
  218. LIBRARY DESTINATION lib/impl/dep
  219. ARCHIVE DESTINATION lib/impl/dep
  220. )
  221. install(
  222. TARGETS testLib5
  223. EXPORT exp
  224. # Leave out RUNTIME DESTINATION to test implib-only export.
  225. LIBRARY DESTINATION lib
  226. ARCHIVE DESTINATION lib
  227. )
  228. install(EXPORT exp NAMESPACE exp_ DESTINATION lib/exp)
  229. # Install testLib5.dll outside the export.
  230. if(WIN32)
  231. install(TARGETS testLib5 RUNTIME DESTINATION bin)
  232. endif()
  233. add_subdirectory(sublib) # For CMAKE_BUILD_INTERFACE_INCLUDES test.
  234. # Export from build tree.
  235. export(TARGETS testExe1 testLib1 testLib2 testLib3
  236. testExe2libImp testLib3Imp testLib3ImpDep subdirlib
  237. testSharedLibRequired testSharedLibDepends
  238. NAMESPACE bld_
  239. FILE ExportBuildTree.cmake
  240. )
  241. export(TARGETS testExe2 testLib4 testLib5 testLib6 testExe3 testExe2lib
  242. testLib4lib testLib4libdbg testLib4libopt
  243. testLibCycleA testLibCycleB
  244. NAMESPACE bld_
  245. APPEND FILE ExportBuildTree.cmake
  246. )