Skip to content

Commit a39f9b0

Browse files
committed
build: perform parallel builds of BlocksRuntime
Build both the static and shared variants of the BlocksRuntime. This is needed for proper shared linkage to the BlocksRuntime (e.g. when building SourceKit). Build both variants and install to the appropriate location.
1 parent 6162a1d commit a39f9b0

File tree

2 files changed

+125
-18
lines changed

2 files changed

+125
-18
lines changed

CMakeLists.txt

Lines changed: 74 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,12 @@ if(ENABLE_SWIFT)
7474

7575
set(INSTALL_TARGET_DIR "${INSTALL_LIBDIR}/swift/${SWIFT_OS}" CACHE PATH "Path where the libraries will be installed")
7676
set(INSTALL_DISPATCH_HEADERS_DIR "${INSTALL_LIBDIR}/swift/dispatch" CACHE PATH "Path where the headers will be installed for libdispatch")
77-
set(INSTALL_BLOCK_HEADERS_DIR "${INSTALL_LIBDIR}/swift/Block" CACHE PATH "Path where the headers will be installed for the blocks runtime")
7877
set(INSTALL_OS_HEADERS_DIR "${INSTALL_LIBDIR}/swift/os" CACHE PATH "Path where the os/ headers will be installed")
7978
endif()
8079

8180
if(NOT ENABLE_SWIFT)
8281
set(INSTALL_TARGET_DIR "${INSTALL_LIBDIR}" CACHE PATH "Path where the libraries will be installed")
8382
set(INSTALL_DISPATCH_HEADERS_DIR "include/dispatch" CACHE PATH "Path where the headers will be installed")
84-
set(INSTALL_BLOCK_HEADERS_DIR "include" CACHE PATH "Path where the headers will be installed for the blocks runtime")
8583
set(INSTALL_OS_HEADERS_DIR "include/os" CACHE PATH "Path where the headers will be installed")
8684
endif()
8785

@@ -132,35 +130,93 @@ endif()
132130

133131
option(INSTALL_PRIVATE_HEADERS "installs private headers in the same location as the public ones" OFF)
134132

135-
find_package(BlocksRuntime QUIET)
136-
if(NOT BlocksRuntime_FOUND)
133+
if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin)
137134
set(BlocksRuntime_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/src/BlocksRuntime)
138135

139-
add_library(BlocksRuntime
140-
STATIC
141-
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/data.c
142-
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/runtime.c)
143-
set_target_properties(BlocksRuntime
136+
set(LIBDISPATCH_BLOCKSRUNTIME_CMAKE_ARGS
137+
-DCMAKE_AR=${CMAKE_AR}
138+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
139+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
140+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
141+
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
142+
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
143+
-DCMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH}
144+
-DCMAKE_RANLIB=${CMAKE_RANLIB}
145+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
146+
-DINSTALL_PRIVATE_HEADERS=${INSTALL_PRIVATE_HEADERS})
147+
148+
include(ExternalProject)
149+
ExternalProject_Add(SharedBlocksRuntime
150+
SOURCE_DIR
151+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime
152+
CMAKE_ARGS
153+
${LIBDISPATCH_BLOCKSRUNTIME_CMAKE_ARGS}
154+
-DBUILD_SHARED_LIBS=YES
155+
INSTALL_COMMAND
156+
${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --target install
157+
BUILD_BYPRODUCTS
158+
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
159+
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
160+
BUILD_ALWAYS
161+
1)
162+
ExternalProject_Add(StaticBlocksRuntime
163+
SOURCE_DIR
164+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime
165+
CMAKE_ARGS
166+
${LIBDISPATCH_BLOCKSRUNTIME_CMAKE_ARGS}
167+
-DBUILD_SHARED_LIBS=NO
168+
INSTALL_COMMAND
169+
${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --target install
170+
BUILD_BYPRODUCTS
171+
<INSTALL_DIR>/lib/${CMAKE_STATIC_LIBRARY_PREFIX}BlocksRuntime${CMAKE_STATIC_LIBRARY_SUFFIX}
172+
BUILD_ALWAYS
173+
1)
174+
175+
ExternalProject_Get_Property(SharedBlocksRuntime install_dir)
176+
add_library(BlocksRuntime::BlocksRuntime SHARED IMPORTED)
177+
set_target_properties(BlocksRuntime::BlocksRuntime
144178
PROPERTIES
145-
POSITION_INDEPENDENT_CODE TRUE)
146-
if(HAVE_OBJC AND CMAKE_DL_LIBS)
147-
set_target_properties(BlocksRuntime
148-
PROPERTIES
149-
INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS})
179+
INTERFACE_INCLUDE_DIRECTORIES
180+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime
181+
IMPORTED_LOCATION
182+
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
183+
IMPORTED_IMPLIB
184+
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX})
185+
186+
if(ENABLE_SWIFT)
187+
set(LIBDISPATCH_BLOCKSRUNTIME_HEADER_DIR ${SWIFT_LIBDIR}/swift/Block)
188+
set(LIBDISPATCH_BLOCKSRUNTIME_LIBDIR ${SWIFT_LIBDIR}/swift/${SWIFT_OS}/${SWIFT_HOST_ARCH})
189+
set(LIBDISPATCH_BLOCKSRUNTIME_STATIC_LIBDIR ${SWIFT_LIBDIR}/swift_static/${SWIFT_OS}/${SWIFT_HOST_ARCH})
190+
else()
191+
set(LIBDISPATCH_BLOCKSRUNTIME_HEADER_DIR ${CMAKE_INSTALL_INCLUDEDIR})
192+
set(LIBDISPATCH_BLOCKSRUNTIME_LIBDIR ${CMAKE_INSTALL_LIBDIR})
193+
set(LIBDISPATCH_BLOCKSRUNTIME_STATIC_LIBDIR ${CMAKE_INSTALL_LIBDIR})
150194
endif()
151195

152-
add_library(BlocksRuntime::BlocksRuntime ALIAS BlocksRuntime)
153-
154196
install(FILES
155197
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block.h
156198
DESTINATION
157-
"${INSTALL_BLOCK_HEADERS_DIR}")
199+
${LIBDISPATCH_BLOCKSRUNTIME_HEADER_DIR})
158200
if(INSTALL_PRIVATE_HEADERS)
159201
install(FILES
160202
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block_private.h
161203
DESTINATION
162-
"${INSTALL_BLOCK_HEADERS_DIR}")
204+
${LIBDISPATCH_BLOCKSRUNTIME_HEADER_DIR})
205+
endif()
206+
install(FILES
207+
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
208+
DESTINATION
209+
${LIBDISPATCH_BLOCKSRUNTIME_LIBDIR})
210+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
211+
install(FILES
212+
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
213+
DESTINATION
214+
${LIBDISPATCH_BLOCKSRUNTIME_LIBDIR})
163215
endif()
216+
install(FILES
217+
${install_dir}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}BlocksRuntime${CMAKE_STATIC_LIBRARY_SUFFIX}
218+
DESTINATION
219+
${LIBDISPATCH_BLOCKSRUNTIME_STATIC_LIBDIR})
164220
endif()
165221

166222
check_symbol_exists(__GNU_LIBRARY__ "features.h" _GNU_SOURCE)

src/BlocksRuntime/CMakeLists.txt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
cmake_minimum_required(VERSION 3.4.3)
3+
project(BlocksRuntime
4+
LANGUAGES C)
5+
6+
include(CheckIncludeFiles)
7+
include(GNUInstallDirs)
8+
9+
if(CMAKE_C_SIMULATE_ID STREQUAL MSVC)
10+
# clang-cl interprets paths starting with /U as macro undefines, so we need to
11+
# put a -- before the input file path to force it to be treated as a path.
12+
string(REPLACE "-c <SOURCE>" "-c -- <SOURCE>" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}")
13+
endif()
14+
15+
set(CMAKE_C_STANDARD 11)
16+
set(CMAKE_C_STANDARD_REQUIRED YES)
17+
18+
set(CMAKE_C_VISIBILITY_PRESET hidden)
19+
set(CMAKE_C_VISIBILITY_INLINES_HIDDEN YES)
20+
21+
check_include_files("objc/objc-internal.h" HAVE_OBJC)
22+
23+
option(INSTALL_PRIVATE_HEADERS "install private headers in the same location as the public ones" NO)
24+
25+
add_library(BlocksRuntime
26+
${PROJECT_SOURCE_DIR}/data.c
27+
${PROJECT_SOURCE_DIR}/runtime.c)
28+
set_target_properties(BlocksRuntime
29+
PROPERTIES
30+
POSITION_INDEPENDENT_CODE TRUE)
31+
if(HAVE_OBJC AND CMAKE_DL_LIBS)
32+
target_link_libraries(BlocksRuntime
33+
PUBLIC
34+
${CMAKE_DL_LIBS})
35+
endif()
36+
37+
install(FILES
38+
${PROJECT_SOURCE_DIR}/Block.h
39+
DESTINATION
40+
${CMAKE_INSTALL_INCLUDEDIR})
41+
if(INSTALL_PRIVATE_HEADERS)
42+
install(FILES
43+
${PROJECT_SOURCE_DIR}/Block_private.h
44+
DESTINATION
45+
${CMAKE_INSTALL_INCLUDEDIR})
46+
endif()
47+
install(TARGETS
48+
BlocksRuntime
49+
DESTINATION
50+
${CMAKE_INSTALL_LIBDIR})
51+

0 commit comments

Comments
 (0)