Skip to content

Commit 44e975e

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 44e975e

File tree

2 files changed

+121
-24
lines changed

2 files changed

+121
-24
lines changed

CMakeLists.txt

Lines changed: 70 additions & 24 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,34 +130,82 @@ 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+
include(ExternalProject)
137+
ExternalProject_Add(SharedBlocksRuntime
138+
SOURCE_DIR
139+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime
140+
CMAKE_ARGS
141+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
142+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
143+
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
144+
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
145+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
146+
-DBUILD_SHARED_LIBS=YES
147+
BUILD_BYPRODUCTS
148+
<BINARY_DIR>/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
149+
<BINARY_DIR>/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
150+
BUILD_ALWAYS
151+
1)
152+
ExternalProject_Add(StaticBlocksRuntime
153+
SOURCE_DIR
154+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime
155+
CMAKE_ARGS
156+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
157+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
158+
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
159+
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
160+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
161+
-DBUILD_SHARED_LIBS=NO
162+
BUILD_BYPRODUCTS
163+
<BINARY_DIR>/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
164+
<BINARY_DIR>/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
165+
BUILD_ALWAYS
166+
1)
167+
168+
ExternalProject_Get_Property(SharedBlocksRuntime binary_dir)
169+
add_library(BlocksRuntime::BlocksRuntime SHARED IMPORTED)
170+
set_target_properties(BlocksRuntime::BlocksRuntime
144171
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})
150-
endif()
151-
152-
add_library(BlocksRuntime::BlocksRuntime ALIAS BlocksRuntime)
172+
INTERFACE_INCLUDE_DIRECTORIES
173+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime
174+
IMPORTED_LOCATION
175+
${binary_dir}/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
176+
IMPORTED_IMPLIB
177+
${binary_dir}/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX})
153178

154-
install(FILES
155-
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block.h
156-
DESTINATION
157-
"${INSTALL_BLOCK_HEADERS_DIR}")
158-
if(INSTALL_PRIVATE_HEADERS)
179+
if(ENABLE_SWIFT)
180+
install(FILES
181+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block.h
182+
DESTINATION
183+
${SWIFT_LIBDIR}/swift/Block)
184+
if(INSTALL_PRIVATE_HEADERS)
185+
install(FILES
186+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block_private.h
187+
DESTINATION
188+
${SWIFT_LIBDIR}/swift/Block)
189+
endif()
190+
install(TARGETS
191+
BlocksRuntime::BlocksRuntime
192+
DESTINATION
193+
${SWIFT_LIBDIR}/swift/${SWIFT_OS}/${SWIFT_HOST_ARCH})
194+
else()
159195
install(FILES
160-
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block_private.h
196+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block.h
197+
DESTINATION
198+
${CMAKE_INSTALL_INCLUDEDIR})
199+
if(INSTALL_PRIVATE_HEADERS)
200+
install(FILES
201+
${PROJECT_SOURCE_DIR}/src/BlocksRuntime/Block_private.h
202+
DESTINATION
203+
${CMAKE_INSTALL_INCLUDEDIR})
204+
endif()
205+
install(TARGETS
206+
BlocksRuntime::BlocksRuntime
161207
DESTINATION
162-
"${INSTALL_BLOCK_HEADERS_DIR}")
208+
${CMAKE_INSTALL_LIBDIR})
163209
endif()
164210
endif()
165211

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)