Skip to content

Commit 884ece9

Browse files
committed
Fixes and updates for CMake build system
A number of small fixes and updates to enable libdispatch's CMake-based build system to be invoked from Swift's utils/build-script. + removed libpwq support and added internal_workqueue + added dtrace rule to generate provider.h + build shared libraries by default + enable using gold linker by default + fixes for building tests with Swift enabled + symlink src/. to src/.libs for compatibility with autoconf-based builds (avoids need for tightly coupled changes across multiple Swift repositories which expect to find src/.libs/libdispatch.so). + Increase test timeout to 600 seconds to reduce risk of spurious failures when run under Swift CI.
1 parent 56f36b6 commit 884ece9

File tree

5 files changed

+57
-31
lines changed

5 files changed

+57
-31
lines changed

CMakeLists.txt

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,45 +16,32 @@ set(THREADS_PREFER_PTHREAD_FLAG TRUE)
1616
find_package(Threads REQUIRED)
1717

1818
include(GNUInstallDirs)
19-
include(ExternalProject)
2019

2120
set(WITH_BLOCKS_RUNTIME "" CACHE PATH "Path to blocks runtime")
22-
set(WITH_PTHREAD_WORKQUEUES "" CACHE PATH "Path to pthread-workqueues")
2321

2422
include(DispatchAppleOptions)
2523

2624
option(ENABLE_DISPATCH_INIT_CONSTRUCTOR "enable libdispatch_init as a constructor" ON)
2725
set(USE_LIBDISPATCH_INIT_CONSTRUCTOR ${ENABLE_DISPATCH_INIT_CONSTRUCTOR})
2826

29-
# TODO(compnerd) swift options
27+
option(BUILD_SHARED_LIBS "build shared libraries" ON)
28+
29+
option(USE_GOLD_LINKER "use the gold linker" ON)
3030

31-
# TODO(compnerd) consider adding a flag for USE_GOLD_LINKER. Currently, we
32-
# expect the user to specify `-fuse-ld=gold`
31+
# TODO(compnerd) swift options
3332

3433
option(ENABLE_THREAD_LOCAL_STORAGE "enable usage of thread local storage via __thread" ON)
3534
set(DISPATCH_USE_THREAD_LOCAL_STORAGE ${ENABLE_THREAD_LOCAL_STORAGE})
3635

37-
if(EXISTS "${CMAKE_SOURCE_DIR}/libpwq/CMakeLists.txt")
38-
ExternalProject_Add(pwq
39-
SOURCE_DIR
40-
"${CMAKE_SOURCE_DIR}/libpwq"
41-
CMAKE_ARGS
42-
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
43-
-DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
44-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
45-
BUILD_BYPRODUCTS
46-
<INSTALL_DIR>/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}pthread_workqueue${CMAKE_STATIC_LIBRARY_SUFFIX})
47-
ExternalProject_Get_Property(pwq install_dir)
48-
add_library(PTHREAD::workqueue UNKNOWN IMPORTED)
49-
set_target_properties(PTHREAD::workqueue
50-
PROPERTIES
51-
IMPORTED_LOCATION ${install_dir}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}pthread_workqueue${CMAKE_STATIC_LIBRARY_SUFFIX})
52-
set(WITH_PTHREAD_WORKQUEUES "${install_dir}" CACHE PATH "Path to pthread-workqueues" FORCE)
53-
set(HAVE_PTHREAD_WORKQUEUES 1)
36+
# TODO: Real CMake logic for internal workqueues
37+
if(CMAKE_SYSTEM_NAME STREQUAL Linux OR
38+
CMAKE_SYSTEM_NAME STREQUAL Android OR
39+
CMAKE_SYSTEM_NAME STREQUAL Windows)
40+
set(DISPATCH_USE_INTERNAL_WORKQUEUE 1)
41+
set(HAVE_PTHREAD_WORKQUEUES 0)
5442
else()
55-
# TODO(compnerd) support system installed pthread-workqueues
56-
# find_package(pthread_workqueues REQUIRED)
57-
# set(HAVE_PTHREAD_WORKQUEUES 1)
43+
set(DISPATCH_USE_INTERNAL_WORKQUEUE 0)
44+
set(HAVE_PTHREAD_WORKQUEUES 1)
5845
endif()
5946

6047
if(CMAKE_SYSTEM_NAME STREQUAL Linux OR
@@ -179,12 +166,13 @@ check_symbol_exists(VQ_VERYLOWDISK "sys/mount.h" HAVE_DECL_VQ_VERYLOWDISK)
179166

180167
check_symbol_exists(program_invocation_name "errno.h" HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
181168

182-
find_program(dtrace_EXECUTABLE dtrace)
183-
if(dtrace_EXECUTABLE)
169+
find_program(DTRACE dtrace)
170+
if(DTRACE)
184171
add_definitions(-DDISPATCH_USE_DTRACE=1)
185172
else()
186173
add_definitions(-DDISPATCH_USE_DTRACE=0)
187174
endif()
175+
include(DTrace)
188176

189177
find_program(leaks_EXECUTABLE leaks)
190178
if(leaks_EXECUTABLE)

cmake/config.h.in

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
2-
/* Define if building pthread work queues from source */
3-
#cmakedefine BUILD_OWN_PTHREAD_WORKQUEUES
1+
/* Use libdispatch's own implementation of pthread workqueues */
2+
#cmakedefine01 DISPATCH_USE_INTERNAL_WORKQUEUE
43

54
/* Enable usage of thread local storage via __thread */
65
#cmakedefine01 DISPATCH_USE_THREAD_LOCAL_STORAGE

cmake/modules/DTrace.cmake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
MACRO (DTRACE_HEADER provider header)
2+
if (DTRACE)
3+
ADD_CUSTOM_COMMAND(
4+
OUTPUT ${header}
5+
COMMAND ${DTRACE} -h -s ${provider} -o ${header}
6+
DEPENDS ${provider}
7+
)
8+
ENDIF()
9+
ENDMACRO()
10+

src/CMakeLists.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11

22
include(SwiftSupport)
33

4+
set(dispatch_DTRACE_HEADERS)
5+
if(DTRACE)
6+
list(APPEND dispatch_DTRACE_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/provider.h)
7+
endif()
8+
DTRACE_HEADER(${CMAKE_CURRENT_SOURCE_DIR}/provider.d ${CMAKE_CURRENT_BINARY_DIR}/provider.h)
9+
410
set(dispatch_BLOCK_SOURCES block.cpp)
511
if(HAVE_OBJC)
612
list(APPEND dispatch_BLOCK_SOURCES data.m object.m)
713
endif()
14+
815
set(dispatch_SWIFT_SOURCES)
916
if(CMAKE_SWIFT_COMPILER)
1017
set(swift_optimization_flags)
@@ -39,7 +46,9 @@ if(CMAKE_SWIFT_COMPILER)
3946
list(APPEND dispatch_SWIFT_SOURCES
4047
swift/DispatchStubs.cc;${CMAKE_CURRENT_BINARY_DIR}/swiftDispatch.o)
4148
endif()
49+
4250
add_library(dispatch
51+
${dispatch_DTRACE_HEADERS}
4352
allocator.c
4453
apply.c
4554
benchmark.c
@@ -77,6 +86,8 @@ add_library(dispatch
7786
event/event_epoll.c
7887
event/event_internal.h
7988
event/event_kevent.c
89+
event/workqueue_internal.h
90+
event/workqueue.c
8091
firehose/firehose_internal.h
8192
shims/android_stubs.h
8293
shims/atomic.h
@@ -93,12 +104,24 @@ add_library(dispatch
93104
shims/yield.h
94105
${dispatch_BLOCK_SOURCES}
95106
${dispatch_SWIFT_SOURCES})
107+
# Temporary staging; the various swift projects that depend on libdispatch
108+
# all expect libdispatch.so to be in src/.libs/libdispatch.so
109+
# So make a symlink so we don't have to do a coordinated commit across all the
110+
# swift projects to change this assumption.
111+
add_custom_target(.libs ALL
112+
COMMAND cmake -E create_symlink . .libs)
96113
target_include_directories(dispatch
97114
PRIVATE
98115
${CMAKE_BINARY_DIR}
116+
${CMAKE_CURRENT_BINARY_DIR}
99117
${CMAKE_SOURCE_DIR}
100118
${CMAKE_CURRENT_SOURCE_DIR}
101119
${CMAKE_SOURCE_DIR}/private)
120+
if (USE_GOLD_LINKER)
121+
target_link_libraries(dispatch
122+
PRIVATE
123+
-fuse-ld=gold)
124+
endif()
102125
if(WITH_PTHREAD_WORKQUEUES)
103126
target_include_directories(dispatch
104127
SYSTEM BEFORE PRIVATE

tests/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ if(BSD_OVERLAY_FOUND)
3838
PRIVATE
3939
${BSD_OVERLAY_LDFLAGS})
4040
endif()
41+
if(CMAKE_SWIFT_RUNTIME_LIBDIR)
42+
target_link_libraries(bsdtestharness PRIVATE -L${CMAKE_SWIFT_RUNTIME_LIBDIR} -lswiftCore -lswiftSwiftOnoneSupport -Wl,-rpath -Wl,${CMAKE_SWIFT_RUNTIME_LIBDIR})
43+
endif()
4144

4245
function(add_unit_test name)
4346
set(options DISABLED_TEST)
@@ -86,11 +89,14 @@ function(add_unit_test name)
8689
${BSD_OVERLAY_LDFLAGS})
8790
endif()
8891
target_link_libraries(${name} PRIVATE bsdtests)
92+
if(CMAKE_SWIFT_RUNTIME_LIBDIR)
93+
target_link_libraries(${name} PRIVATE -L${CMAKE_SWIFT_RUNTIME_LIBDIR} -lswiftCore -lswiftSwiftOnoneSupport -Wl,-rpath -Wl,${CMAKE_SWIFT_RUNTIME_LIBDIR})
94+
endif()
8995
add_test(NAME ${name}
9096
COMMAND bsdtestharness $<TARGET_FILE:${name}>)
9197
set_tests_properties(${name}
9298
PROPERTIES
93-
TIMEOUT 30
99+
TIMEOUT 600
94100
DEPENDS bsdtestharness
95101
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
96102
if(NOT leaks_EXECUTABLE)

0 commit comments

Comments
 (0)