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()
|