Skip to content

Commit 16b6831

Browse files
authored
Merge pull request #1786 from compnerd/static-shared-library
2 parents 007f527 + 9775b23 commit 16b6831

File tree

2 files changed

+89
-23
lines changed

2 files changed

+89
-23
lines changed

CMakeLists.txt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ project(Foundation
99
C)
1010
enable_testing()
1111

12+
option(BUILD_SHARED_LIBS "build shared libraries" ON)
13+
1214
option(FOUNDATION_ENABLE_LIBDISPATCH "Enable GCD Support" YES)
1315
option(FOUNDATION_PATH_TO_LIBDISPATCH_SOURCE "Path to libdispatch source" "")
1416
option(FOUNDATION_PATH_TO_LIBDISPATCH_BUILD "Path to libdispatch build" "")
@@ -259,8 +261,9 @@ add_swift_library(Foundation
259261
-I;${ICU_INCLUDE_DIR}
260262
${libdispatch_cflags}
261263
${swift_enable_testing}
262-
${swift_optimization_flags})
263-
add_dependencies(Foundation CoreFoundation)
264+
${swift_optimization_flags}
265+
DEPENDS
266+
CoreFoundation)
264267

265268
add_swift_executable(plutil
266269
SOURCES
@@ -280,8 +283,10 @@ add_swift_executable(plutil
280283
-I;${ICU_INCLUDE_DIR}
281284
${libdispatch_cflags}
282285
${swift_enable_testing}
283-
${swift_optimization_flags})
284-
add_dependencies(plutil Foundation CoreFoundation)
286+
${swift_optimization_flags}
287+
DEPENDS
288+
Foundation
289+
CoreFoundation)
285290

286291
if(ENABLE_TESTING)
287292
add_swift_executable(xdgTestHelper
@@ -298,8 +303,10 @@ if(ENABLE_TESTING)
298303
SWIFT_FLAGS
299304
-I;${CMAKE_CURRENT_BINARY_DIR}/swift
300305
-I;${ICU_INCLUDE_DIR}
301-
${libdispatch_cflags})
302-
add_dependencies(xdgTestHelper Foundation CoreFoundation)
306+
${libdispatch_cflags}
307+
DEPENDS
308+
Foundation
309+
CoreFoundation)
303310

304311
add_swift_executable(TestFoundation
305312
SOURCES
@@ -429,8 +436,11 @@ if(ENABLE_TESTING)
429436
-I;${FOUNDATION_PATH_TO_XCTEST_BUILD}/swift
430437
-I;${ICU_INCLUDE_DIR}
431438
${libdispatch_cflags}
432-
${swift_optimization_flags})
433-
add_dependencies(TestFoundation Foundation CoreFoundation xdgTestHelper)
439+
${swift_optimization_flags}
440+
DEPENDS
441+
Foundation
442+
CoreFoundation
443+
xdgTestHelper)
434444

435445
add_custom_command(TARGET TestFoundation
436446
POST_BUILD

cmake/modules/SwiftSupport.cmake

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
include(CMakeParseArguments)
33

44
function(add_swift_target target)
5-
set(options LIBRARY)
5+
set(options LIBRARY;SHARED;STATIC)
66
set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT;TARGET)
77
set(multiple_value_options CFLAGS;DEPENDS;LINK_FLAGS;RESOURCES;SOURCES;SWIFT_FLAGS)
88

@@ -44,13 +44,35 @@ function(add_swift_target target)
4444
list(APPEND link_flags ${flag})
4545
endforeach()
4646
endif()
47+
if(AST_LIBRARY)
48+
if(AST_STATIC AND AST_SHARED)
49+
message(SEND_ERROR "add_swift_target asked to create library as STATIC and SHARED")
50+
elseif(AST_STATIC OR NOT BUILD_SHARED_LIBS)
51+
set(library_kind STATIC)
52+
elseif(AST_SHARED OR BUILD_SHARED_LIBS)
53+
set(library_kind SHARED)
54+
endif()
55+
else()
56+
if(AST_STATIC OR AST_SHARED)
57+
message(SEND_ERROR "add_swift_target asked to create executable as STATIC or SHARED")
58+
endif()
59+
endif()
4760
if(NOT AST_OUTPUT)
4861
if(AST_LIBRARY)
49-
set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX})
62+
if(AST_SHARED OR BUILD_SHARED_LIBS)
63+
set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX})
64+
else()
65+
set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_STATIC_LIBRARY_PREFIX}${target}${CMAKE_STATIC_LIBRARY_SUFFIX})
66+
endif()
5067
else()
5168
set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${target}${CMAKE_EXECUTABLE_SUFFIX})
5269
endif()
5370
endif()
71+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
72+
if(AST_SHARED OR BUILD_SHARED_LIBS)
73+
set(IMPORT_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_IMPORT_LIBRARY_PREFIX}${target}${CMAKE_IMPORT_LIBRARY_SUFFIX})
74+
endif()
75+
endif()
5476

5577
set(sources)
5678
foreach(source ${AST_SOURCES})
@@ -113,19 +135,42 @@ function(add_swift_target target)
113135
if(AST_LIBRARY)
114136
set(emit_library -emit-library)
115137
endif()
116-
add_custom_command(OUTPUT
117-
${AST_OUTPUT}
118-
DEPENDS
119-
${objs}
120-
${AST_DEPENDS}
121-
COMMAND
122-
${CMAKE_SWIFT_COMPILER} ${emit_library} ${link_flags} -o ${AST_OUTPUT} ${objs})
123-
add_custom_target(${target}
124-
ALL
125-
DEPENDS
126-
${AST_OUTPUT}
127-
${module}
128-
${documentation})
138+
if(NOT AST_LIBRARY OR library_kind STREQUAL SHARED)
139+
add_custom_command(OUTPUT
140+
${AST_OUTPUT}
141+
DEPENDS
142+
${objs}
143+
${AST_DEPENDS}
144+
COMMAND
145+
${CMAKE_SWIFT_COMPILER} ${emit_library} ${link_flags} -o ${AST_OUTPUT} ${objs})
146+
add_custom_target(${target}
147+
ALL
148+
DEPENDS
149+
${AST_OUTPUT}
150+
${module}
151+
${documentation})
152+
else()
153+
add_library(${target}-static STATIC ${objs})
154+
if(AST_DEPENDS)
155+
add_dependencies(${target}-static ${AST_DEPENDS})
156+
endif()
157+
get_filename_component(ast_output_bn ${AST_OUTPUT} NAME)
158+
string(REGEX REPLACE "^${CMAKE_STATIC_LIBRARY_PREFIX}" "" ast_output_bn ${ast_output_bn})
159+
string(REGEX REPLACE "${CMAKE_STATIC_LIBRARY_SUFFIX}$" "" ast_output_bn ${ast_output_bn})
160+
get_filename_component(ast_output_dn ${AST_OUTPUT} DIRECTORY)
161+
set_target_properties(${target}-static
162+
PROPERTIES
163+
LINKER_LANGUAGE C
164+
ARCHIVE_OUTPUT_DIRECTORY ${ast_output_dn}
165+
OUTPUT_DIRECTORY ${ast_output_dn}
166+
OUTPUT_NAME ${ast_output_bn})
167+
add_custom_target(${target}
168+
ALL
169+
DEPENDS
170+
${target}-static
171+
${module}
172+
${documentation})
173+
endif()
129174

130175
if(AST_RESOURCES)
131176
add_custom_command(TARGET
@@ -150,6 +195,15 @@ function(add_swift_target target)
150195
POST_BUILD
151196
COMMAND
152197
${CMAKE_COMMAND} -E copy ${AST_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR})
198+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
199+
if(AST_SHARED OR BUILD_SHARED_LIBS)
200+
add_custom_command(TARGET
201+
${target}
202+
POST_BUILD
203+
COMMAND
204+
${CMAKE_COMMAND} -E copy ${IMPORT_LIBRARY} ${CMAKE_CURRENT_BINARY_DIR})
205+
endif()
206+
endif()
153207
endif()
154208
endfunction()
155209

@@ -189,6 +243,8 @@ function(get_swift_host_arch result_var_name)
189243
set("${result_var_name}" "itanium" PARENT_SCOPE)
190244
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
191245
set("${result_var_name}" "i686" PARENT_SCOPE)
246+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
247+
set("${result_var_name}" "i686" PARENT_SCOPE)
192248
else()
193249
message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}")
194250
endif()

0 commit comments

Comments
 (0)