CMakeLists.txt 5.32 KB
Newer Older
1
2
cmake_minimum_required (VERSION 2.7.20090711)
project(Export C CXX)
3

4
5
6
7
# Pretend that RelWithDebInfo should link to debug libraries to test
# the DEBUG_CONFIGURATIONS property.
set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS Debug RelWithDebInfo)

8
add_library(testExe1lib STATIC testExe1lib.c) # not exported
9
add_executable(testExe1 testExe1.c)
10
target_link_libraries(testExe1 testExe1lib)
11
set_property(TARGET testExe1 PROPERTY VERSION 4)
12

13
add_library(testExe2libImp SHARED testExe2libImp.c)
14
set_property(TARGET testExe2libImp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
15
16
17
add_library(testExe2lib SHARED testExe2lib.c)
target_link_libraries(testExe2lib testExe2libImp)
set_property(TARGET testExe2lib PROPERTY LINK_INTERFACE_LIBRARIES "")
18
19
add_executable(testExe2 testExe2.c)
set_property(TARGET testExe2 PROPERTY ENABLE_EXPORTS 1)
20
set_property(TARGET testExe2 PROPERTY LINK_INTERFACE_LIBRARIES testExe2lib)
21
22
23
24
25

add_library(testLib1 STATIC testLib1.c)
add_library(testLib2 STATIC testLib2.c)
target_link_libraries(testLib2 testLib1)

26
27
28
29
# Test library with empty link interface.  Link it to an implementation
# dependency that itself links to dependencies publicly.
add_library(testLib3ImpDep SHARED testLib3ImpDep.c)
set_property(TARGET testLib3ImpDep PROPERTY LIBRARY_OUTPUT_DIRECTORY impl/dep)
30
add_library(testLib3Imp SHARED testLib3Imp.c)
31
set_property(TARGET testLib3Imp PROPERTY LIBRARY_OUTPUT_DIRECTORY impl)
32
target_link_libraries(testLib3Imp testLib3ImpDep)
33
add_library(testLib3 SHARED testLib3.c)
34
35
target_link_libraries(testLib3 testLib3Imp)
set_property(TARGET testLib3 PROPERTY LINK_INTERFACE_LIBRARIES "")
36
37
set_property(TARGET testLib3 PROPERTY VERSION 1.2)
set_property(TARGET testLib3 PROPERTY SOVERSION 3)
38

39
40
41
42
43
44
45
46
47
# Test <ARCHIVE|LIBRARY|RUNTIME>_OUTPUT_NAME[_<CONFIG>] properties.
set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_DEBUG testLib3dll-d)
set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME_RELEASE testLib3dll-r)
set_property(TARGET testLib3 PROPERTY RUNTIME_OUTPUT_NAME testLib3dll)
set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_DEBUG testLib3lib-d)
set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME_RELEASE testLib3lib-r)
set_property(TARGET testLib3 PROPERTY LIBRARY_OUTPUT_NAME testLib3lib)
set_property(TARGET testLib3 PROPERTY ARCHIVE_OUTPUT_NAME testLib3import)

48
49
50
add_library(testLib4 SHARED testLib4.c)
set_property(TARGET testLib4 PROPERTY FRAMEWORK 1)

51
52
add_library(testLib5 SHARED testLib5.c)

53
add_library(testLib6 STATIC testLib6.cxx testLib6c.c)
54

Brad King's avatar
Brad King committed
55
56
57
58
# Work-around: Visual Studio 6 does not support per-target object files.
set(VS6)
if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
  set(VS6 1)
59
endif()
Brad King's avatar
Brad King committed
60

61
62
63
64
65
66
67
68
# Test using the target_link_libraries command to set the
# LINK_INTERFACE_LIBRARIES* properties.  We construct two libraries
# providing the same two symbols.  In each library one of the symbols
# will work and the other one will fail to link.  The import part of
# this test will try to use the symbol corresponding to the
# configuration in which it is built.  If the proper library is not
# used via the link interface the import test will fail to link.
add_library(testLib4lib STATIC testLib4lib.c)
Brad King's avatar
Brad King committed
69
70
add_library(testLib4libdbg STATIC testLib4libopt.c testLib4libdbg${VS6}.c)
add_library(testLib4libopt STATIC testLib4libdbg.c testLib4libopt${VS6}.c)
71
72
73
set_property(TARGET testLib4libdbg PROPERTY COMPILE_DEFINITIONS LIB_DBG)
set_property(TARGET testLib4libopt PROPERTY COMPILE_DEFINITIONS LIB_OPT)
target_link_libraries(testLib4
74
75
  LINK_INTERFACE_LIBRARIES
  testLib4lib debug testLib4libdbg optimized testLib4libopt
76
77
  )

78
79
80
add_executable(testExe3 testExe3.c)
set_property(TARGET testExe3 PROPERTY MACOSX_BUNDLE 1)

81
82
83
84
85
86
87
88
89
# Test cyclic dependencies.
add_library(testLibCycleA STATIC
  testLibCycleA1.c testLibCycleA2.c testLibCycleA3.c)
add_library(testLibCycleB STATIC
  testLibCycleB1.c testLibCycleB2.c testLibCycleB3.c)
target_link_libraries(testLibCycleA testLibCycleB)
target_link_libraries(testLibCycleB testLibCycleA)
set_property(TARGET testLibCycleA PROPERTY LINK_INTERFACE_MULTIPLICITY 3)

90
# Install and export from install tree.
91
92
install(
  TARGETS
93
  testExe1 testLib1 testLib2 testExe2 testLib3 testLib4 testExe3
94
  testExe2lib testLib4lib testLib4libdbg testLib4libopt
95
  testLib6
96
  testLibCycleA testLibCycleB
97
98
  EXPORT exp
  RUNTIME DESTINATION bin
99
  LIBRARY DESTINATION lib NAMELINK_SKIP
100
  ARCHIVE DESTINATION lib
101
  FRAMEWORK DESTINATION Frameworks
102
  BUNDLE DESTINATION Applications
103
  )
104
105
106
107
108
109
110
111
install(
  TARGETS
  testExe2libImp testLib3Imp
  EXPORT exp
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib/impl
  ARCHIVE DESTINATION lib/impl
  )
112
113
114
115
116
117
118
119
install(
  TARGETS
  testLib3ImpDep
  EXPORT exp
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib/impl/dep
  ARCHIVE DESTINATION lib/impl/dep
  )
120
121
122
123
124
125
126
install(
  TARGETS testLib5
  EXPORT exp
  # Leave out RUNTIME DESTINATION to test implib-only export.
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  )
127
128
install(EXPORT exp NAMESPACE exp_ DESTINATION lib/exp)

129
130
131
# Install testLib5.dll outside the export.
if(WIN32)
  install(TARGETS testLib5 RUNTIME DESTINATION bin)
132
endif()
133

134
# Export from build tree.
135
export(TARGETS testExe1 testLib1 testLib2 testLib3
136
  testExe2libImp testLib3Imp testLib3ImpDep
137
138
139
  NAMESPACE bld_
  FILE ExportBuildTree.cmake
  )
140
export(TARGETS testExe2 testLib4 testLib5 testLib6 testExe3 testExe2lib
141
  testLib4lib testLib4libdbg testLib4libopt
142
  testLibCycleA testLibCycleB
143
144
145
  NAMESPACE bld_
  APPEND FILE ExportBuildTree.cmake
  )