summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake/XcodeProject/LinkBinariesBuildPhase.cmake
blob: a9ea717df3a3962f80d24bf97b0e264203f20aff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
enable_language(C)

set(prototypes [[
#include <stdio.h>
#include <zlib.h>
#include <resolv.h>
int func1();
int func2();
int func3();
int func4();
int func5();
int func6();
int func7();
]])
set(prototypes_objc [[
#import <CoreFoundation/CoreFoundation.h>
]])
set(impl [[
{
  printf("%p %p\n", compress, res_close);
  return func1() + func2() + func3() + func4() + func5() + func6() + func7();
}
]])
set(impl_objc [[
{
  CFStringRef cfStr = CFSTR("This is a string");
  printf("%p %p %ld\n", compress, res_close, (long)CFStringGetLength(cfStr));
  return func1() + func2() + func3() + func4() + func5() + func6() + func7();
}
]])

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mainOuter.m
  "${prototypes}\n${prototypes_objc}\nint main(int argc, char** argv) ${impl_objc}"
)

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/funcOuter.c
  "${prototypes}\nint funcOuter() ${impl}"
)

foreach(i RANGE 1 5)
  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/func${i}.c
    "int func${i}() { return 32 + ${i}; }\n"
  )
endforeach()

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/CMakeLists.txt
[[
cmake_minimum_required(VERSION 3.18)
project(ExternalFrameworks)
add_library(staticFrameworkExt STATIC func6.c)
add_library(sharedFrameworkExt SHARED func7.c)
set_target_properties(staticFrameworkExt PROPERTIES FRAMEWORK TRUE)
set_target_properties(sharedFrameworkExt PROPERTIES FRAMEWORK TRUE)
]]
)

foreach(i RANGE 6 7)
  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/func${i}.c
    "int func${i}() { return 32 + ${i}; }\n"
  )
endforeach()

add_custom_target(prebuildDependencies ALL
    COMMAND ${CMAKE_COMMAND} -S ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks -B ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build -G Xcode
    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build --target staticFrameworkExt sharedFrameworkExt --config Debug
)
add_executable(app1 mainOuter.m)
add_executable(app2 mainOuter.m)
add_executable(app3 mainOuter.m)
add_library(static1 STATIC funcOuter.c)
add_library(shared1 SHARED funcOuter.c)
add_library(shared3 SHARED funcOuter.c)
add_library(shared4 SHARED funcOuter.c)
add_library(module1 MODULE funcOuter.c)
add_library(obj1    OBJECT funcOuter.c)
add_library(staticFramework1 STATIC funcOuter.c)
add_library(sharedFramework1 SHARED funcOuter.c)
set_target_properties(staticFramework1 PROPERTIES FRAMEWORK TRUE)
set_target_properties(sharedFramework1 PROPERTIES FRAMEWORK TRUE)
add_dependencies(app1 prebuildDependencies)
add_dependencies(app2 prebuildDependencies)
add_dependencies(app3 prebuildDependencies)
add_dependencies(static1 prebuildDependencies)
add_dependencies(shared1 prebuildDependencies)
add_dependencies(shared3 prebuildDependencies)
add_dependencies(shared4 prebuildDependencies)
add_dependencies(module1 prebuildDependencies)
add_dependencies(obj1 prebuildDependencies)
add_dependencies(staticFramework1 prebuildDependencies)
add_dependencies(sharedFramework1 prebuildDependencies)

add_library(static2 STATIC func1.c)
add_library(shared2 SHARED func2.c)
add_library(obj2    OBJECT func3.c)
add_library(staticFramework2 STATIC func4.c)
add_library(sharedFramework2 SHARED func5.c)
set_target_properties(staticFramework2 PROPERTIES FRAMEWORK TRUE)
set_target_properties(sharedFramework2 PROPERTIES FRAMEWORK TRUE)

# Pick some external libraries that are always present in the Xcode SDK
find_library(libz z REQUIRED)
find_library(libresolv resolv REQUIRED)
find_library(CoreFoundation CoreFoundation REQUIRED)
add_library(imported2 UNKNOWN IMPORTED)
set_target_properties(imported2 PROPERTIES IMPORTED_LOCATION ${libz})

# Save these for the check script to use
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/foundLibs.cmake "
set(libz \"${libz}\")
set(libresolv \"${libresolv}\")
set(CoreFoundation \"${CoreFoundation}\")
")

macro(SET_LINK_LIBRARIES)
  foreach(mainTarget IN LISTS mainTargets)
    foreach(linkTo IN LISTS linkToThings)
      target_link_libraries(${mainTarget} PRIVATE ${linkTo})
    endforeach()
  endforeach()
endmacro()

set(mainTargets
    app1
    static1
    shared1
    module1
    obj1
    staticFramework1
    sharedFramework1
)
set(linkToThings
    static2
    shared2
    obj2
    staticFramework2
    sharedFramework2
    imported2
    ${libresolv}
    ${CoreFoundation}
    "${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/sharedFrameworkExt.framework"
    "${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/staticFrameworkExt.framework"
)

set_link_libraries()

set(mainTargets
    app2
    shared3
)

set(linkToThings
    static2
    "$<LINK_LIBRARY:WEAK_LIBRARY,shared2>"
    obj2
    staticFramework2
    "$<LINK_LIBRARY:WEAK_FRAMEWORK,sharedFramework2>"
    imported2
    ${libresolv}
    ${CoreFoundation}
    "$<LINK_LIBRARY:WEAK_FRAMEWORK,${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/sharedFrameworkExt.framework>"
    "${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/staticFrameworkExt.framework"
)

set_link_libraries()

set(mainTargets
    app3
    shared4
)

set(linkToThings
    static2
    "$<LINK_LIBRARY:REEXPORT_LIBRARY,shared2>"
    obj2
    staticFramework2
    "$<LINK_LIBRARY:REEXPORT_FRAMEWORK,sharedFramework2>"
    imported2
    ${libresolv}
    ${CoreFoundation}
    "$<LINK_LIBRARY:REEXPORT_FRAMEWORK,${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/sharedFrameworkExt.framework>"
    "${CMAKE_CURRENT_BINARY_DIR}/ExternalFrameworks/build/Debug/staticFrameworkExt.framework"
)

set_link_libraries()