Skip to content

Commit 92377cc

Browse files
committed
[CMake] Move cross-platform dispatch/blocks support to the tools level, in preparation for the syntax parser library
1 parent e4d1841 commit 92377cc

File tree

8 files changed

+129
-107
lines changed

8 files changed

+129
-107
lines changed

CMakeLists.txt

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,23 +399,37 @@ endif()
399399

400400
precondition(CMAKE_SYSTEM_NAME)
401401
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
402+
set(SWIFT_BUILD_SYNTAXPARSERLIB_default TRUE)
402403
set(SWIFT_BUILD_SOURCEKIT_default TRUE)
403404
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
404405
if(EXISTS ${SWIFT_PATH_TO_LIBDISPATCH_SOURCE})
406+
set(SWIFT_BUILD_SYNTAXPARSERLIB_default TRUE)
405407
set(SWIFT_BUILD_SOURCEKIT_default TRUE)
406408
else()
409+
set(SWIFT_BUILD_SYNTAXPARSERLIB_default FALSE)
407410
set(SWIFT_BUILD_SOURCEKIT_default FALSE)
408411
endif()
409412
else()
413+
set(SWIFT_BUILD_SYNTAXPARSERLIB_default FALSE)
410414
set(SWIFT_BUILD_SOURCEKIT_default FALSE)
411415
endif()
416+
option(SWIFT_BUILD_SYNTAXPARSERLIB
417+
"Build the Swift Syntax Parser library"
418+
${SWIFT_BUILD_SYNTAXPARSERLIB_default})
412419
option(SWIFT_BUILD_SOURCEKIT
413420
"Build SourceKit"
414421
${SWIFT_BUILD_SOURCEKIT_default})
415422
option(SWIFT_ENABLE_SOURCEKIT_TESTS
416423
"Enable running SourceKit tests"
417424
${SWIFT_BUILD_SOURCEKIT_default})
418425

426+
if(NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND
427+
(SWIFT_BUILD_SYNTAXPARSERLIB OR SWIFT_BUILD_SOURCEKIT))
428+
set(SWIFT_NEED_EXPLICIT_LIBDISPATCH TRUE)
429+
else()
430+
set(SWIFT_NEED_EXPLICIT_LIBDISPATCH FALSE)
431+
endif()
432+
419433
#
420434
# Assume a new enough ar to generate the index at construction time. This avoids
421435
# having to invoke ranlib as a secondary command.
@@ -880,6 +894,96 @@ if (LLVM_ENABLE_DOXYGEN)
880894
message(STATUS "Doxygen: enabled")
881895
endif()
882896

897+
if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
898+
if(CMAKE_C_COMPILER_ID STREQUAL Clang AND
899+
CMAKE_C_COMPILER_VERSION VERSION_GREATER 3.8
900+
OR LLVM_USE_SANITIZER)
901+
set(SWIFT_LIBDISPATCH_C_COMPILER ${CMAKE_C_COMPILER})
902+
set(SWIFT_LIBDISPATCH_CXX_COMPILER ${CMAKE_CXX_COMPILER})
903+
elseif(${CMAKE_SYSTEM_NAME} STREQUAL ${CMAKE_HOST_SYSTEM_NAME})
904+
set(SWIFT_LIBDISPATCH_C_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang)
905+
set(SWIFT_LIBDISPATCH_CXX_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang++)
906+
else()
907+
message(SEND_ERROR "libdispatch requires a newer clang compiler (${CMAKE_C_COMPILER_VERSION} < 3.9)")
908+
endif()
909+
910+
include(ExternalProject)
911+
ExternalProject_Add(libdispatch
912+
SOURCE_DIR
913+
"${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}"
914+
CMAKE_ARGS
915+
-DCMAKE_AR=${CMAKE_AR}
916+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
917+
-DCMAKE_C_COMPILER=${SWIFT_LIBDISPATCH_C_COMPILER}
918+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
919+
-DCMAKE_CXX_COMPILER=${SWIFT_LIBDISPATCH_CXX_COMPILER}
920+
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
921+
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
922+
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
923+
-DCMAKE_LINKER=${CMAKE_LINKER}
924+
-DCMAKE_RANLIB=${CMAKE_RANLIB}
925+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
926+
-DENABLE_SWIFT=NO
927+
-DENABLE_TESTING=NO
928+
INSTALL_COMMAND
929+
# NOTE(compnerd) provide a custom install command to
930+
# ensure that we strip out the DESTDIR environment
931+
# from the sub-build
932+
${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --target install
933+
STEP_TARGETS
934+
install
935+
BUILD_BYPRODUCTS
936+
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
937+
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}dispatch${CMAKE_IMPORT_LIBRARY_SUFFIX}
938+
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
939+
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
940+
BUILD_ALWAYS
941+
1)
942+
943+
ExternalProject_Get_Property(libdispatch install_dir)
944+
945+
# CMake does not like the addition of INTERFACE_INCLUDE_DIRECTORIES without
946+
# the directory existing. Just create the location which will be populated
947+
# during the installation.
948+
file(MAKE_DIRECTORY ${install_dir}/include)
949+
950+
add_library(dispatch SHARED IMPORTED)
951+
set_target_properties(dispatch
952+
PROPERTIES
953+
IMPORTED_LOCATION
954+
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
955+
IMPORTED_IMPLIB
956+
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}dispatch${CMAKE_IMPORT_LIBRARY_SUFFIX}
957+
INTERFACE_INCLUDE_DIRECTORIES
958+
${install_dir}/include)
959+
960+
add_library(BlocksRuntime SHARED IMPORTED)
961+
set_target_properties(BlocksRuntime
962+
PROPERTIES
963+
IMPORTED_LOCATION
964+
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
965+
IMPORTED_IMPLIB
966+
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
967+
INTERFACE_INCLUDE_DIRECTORIES
968+
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}/src/BlocksRuntime)
969+
970+
add_dependencies(dispatch libdispatch-install)
971+
add_dependencies(BlocksRuntime libdispatch-install)
972+
973+
swift_install_in_component(sourcekit-inproc
974+
FILES
975+
$<TARGET_FILE:dispatch>
976+
$<TARGET_FILE:BlocksRuntime>
977+
DESTINATION
978+
lib${LLVM_LIBDIR_SUFFIX})
979+
980+
# FIXME(compnerd) this should be taken care of by the
981+
# INTERFACE_INCLUDE_DIRECTORIES above
982+
include_directories(AFTER
983+
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}/src/BlocksRuntime
984+
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE})
985+
endif()
986+
883987
#
884988
# Set up global CMake variables for API notes.
885989
#
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Adds blocks support in a cross platform manner.
2+
function(swift_add_blocks_support target_name)
3+
if(NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
4+
set(c_compile_flags)
5+
# TODO(compnerd) this should really use target_compile_options but the use
6+
# of keyword and non-keyword flags prevents this
7+
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
8+
list(APPEND c_compile_flags -fblocks)
9+
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
10+
if(SWIFT_COMPILER_IS_MSVC_LIKE)
11+
list(APPEND c_compile_flags -Xclang;-fblocks)
12+
else()
13+
list(APPEND c_compile_flags -fblocks)
14+
endif()
15+
endif()
16+
set_property(TARGET ${target_name} APPEND_STRING PROPERTY
17+
COMPILE_FLAGS " ${c_compile_flags}")
18+
endif()
19+
endfunction()

tools/SourceKit/CMakeLists.txt

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -97,97 +97,6 @@ include_directories(BEFORE
9797

9898
if(NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
9999
string(TOUPPER "${CMAKE_SYSTEM_NAME}" SOURCEKIT_DEFAULT_TARGET_SDK)
100-
set(SOURCEKIT_NEED_EXPLICIT_LIBDISPATCH TRUE)
101-
102-
if(SWIFT_BUILD_SOURCEKIT)
103-
if(CMAKE_C_COMPILER_ID STREQUAL Clang AND
104-
CMAKE_C_COMPILER_VERSION VERSION_GREATER 3.8
105-
OR LLVM_USE_SANITIZER)
106-
set(SWIFT_SOURCEKIT_C_COMPILER ${CMAKE_C_COMPILER})
107-
set(SWIFT_SOURCEKIT_CXX_COMPILER ${CMAKE_CXX_COMPILER})
108-
elseif(${CMAKE_SYSTEM_NAME} STREQUAL ${CMAKE_HOST_SYSTEM_NAME})
109-
set(SWIFT_SOURCEKIT_C_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang)
110-
set(SWIFT_SOURCEKIT_CXX_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang++)
111-
else()
112-
message(SEND_ERROR "libdispatch requires a newer clang compiler (${CMAKE_C_COMPILER_VERSION} < 3.9)")
113-
endif()
114-
115-
include(ExternalProject)
116-
ExternalProject_Add(libdispatch
117-
SOURCE_DIR
118-
"${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}"
119-
CMAKE_ARGS
120-
-DCMAKE_AR=${CMAKE_AR}
121-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
122-
-DCMAKE_C_COMPILER=${SWIFT_SOURCEKIT_C_COMPILER}
123-
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
124-
-DCMAKE_CXX_COMPILER=${SWIFT_SOURCEKIT_CXX_COMPILER}
125-
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
126-
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
127-
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
128-
-DCMAKE_LINKER=${CMAKE_LINKER}
129-
-DCMAKE_RANLIB=${CMAKE_RANLIB}
130-
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
131-
-DENABLE_SWIFT=NO
132-
-DENABLE_TESTING=NO
133-
INSTALL_COMMAND
134-
# NOTE(compnerd) provide a custom install command to
135-
# ensure that we strip out the DESTDIR environment
136-
# from the sub-build
137-
${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --target install
138-
STEP_TARGETS
139-
install
140-
BUILD_BYPRODUCTS
141-
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
142-
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}dispatch${CMAKE_IMPORT_LIBRARY_SUFFIX}
143-
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
144-
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
145-
BUILD_ALWAYS
146-
1)
147-
148-
ExternalProject_Get_Property(libdispatch install_dir)
149-
150-
# CMake does not like the addition of INTERFACE_INCLUDE_DIRECTORIES without
151-
# the directory existing. Just create the location which will be populated
152-
# during the installation.
153-
file(MAKE_DIRECTORY ${install_dir}/include)
154-
155-
add_library(dispatch SHARED IMPORTED)
156-
set_target_properties(dispatch
157-
PROPERTIES
158-
IMPORTED_LOCATION
159-
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
160-
IMPORTED_IMPLIB
161-
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}dispatch${CMAKE_IMPORT_LIBRARY_SUFFIX}
162-
INTERFACE_INCLUDE_DIRECTORIES
163-
${install_dir}/include)
164-
165-
add_library(BlocksRuntime SHARED IMPORTED)
166-
set_target_properties(BlocksRuntime
167-
PROPERTIES
168-
IMPORTED_LOCATION
169-
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
170-
IMPORTED_IMPLIB
171-
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
172-
INTERFACE_INCLUDE_DIRECTORIES
173-
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}/src/BlocksRuntime)
174-
175-
add_dependencies(dispatch libdispatch-install)
176-
add_dependencies(BlocksRuntime libdispatch-install)
177-
178-
swift_install_in_component(sourcekit-inproc
179-
FILES
180-
$<TARGET_FILE:dispatch>
181-
$<TARGET_FILE:BlocksRuntime>
182-
DESTINATION
183-
lib${LLVM_LIBDIR_SUFFIX})
184-
185-
# FIXME(compnerd) this should be taken care of by the
186-
# INTERFACE_INCLUDE_DIRECTORIES above
187-
include_directories(AFTER
188-
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}/src/BlocksRuntime
189-
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE})
190-
endif()
191100
endif()
192101

193102
add_subdirectory(include)

tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
include(AddSwiftBlocksSupport)
12

23
function(add_sourcekit_symbol_exports target_name export_file)
34
# Makefile.rules contains special cases for different platforms.
@@ -68,18 +69,6 @@ function(add_sourcekit_default_compiler_flags target)
6869
ANALYZE_CODE_COVERAGE "${analyze_code_coverage}"
6970
RESULT_VAR_NAME link_flags)
7071

71-
# TODO(compnerd) this should really use target_compile_options but the use
72-
# of keyword and non-keyword flags prevents this
73-
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
74-
list(APPEND c_compile_flags -fblocks)
75-
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
76-
if(SWIFT_COMPILER_IS_MSVC_LIKE)
77-
list(APPEND c_compile_flags -Xclang;-fblocks)
78-
else()
79-
list(APPEND c_compile_flags -fblocks)
80-
endif()
81-
endif()
82-
8372
# Convert variables to space-separated strings.
8473
_list_escape_for_shell("${c_compile_flags}" c_compile_flags)
8574
_list_escape_for_shell("${link_flags}" link_flags)
@@ -89,6 +78,7 @@ function(add_sourcekit_default_compiler_flags target)
8978
COMPILE_FLAGS " ${c_compile_flags}")
9079
set_property(TARGET "${target}" APPEND_STRING PROPERTY
9180
LINK_FLAGS " ${link_flags}")
81+
swift_add_blocks_support("${target}")
9282
endfunction()
9383

9484
# Add a new SourceKit library.

tools/SourceKit/lib/Support/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ add_sourcekit_library(SourceKitSupport
1212
${SourceKitSupport_sources}
1313
LINK_LIBS swiftBasic swiftSyntax clangBasic clangRewrite
1414
)
15-
if(SOURCEKIT_NEED_EXPLICIT_LIBDISPATCH)
15+
if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
1616
target_link_libraries(SourceKitSupport INTERFACE dispatch BlocksRuntime)
1717
endif()
1818

tools/SourceKit/tools/complete-test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ add_sourcekit_executable(complete-test
99
LINK_LIBS ${SOURCEKITD_TEST_LINK_LIBS}
1010
LLVM_COMPONENT_DEPENDS support option coverage lto
1111
)
12-
if(SOURCEKIT_NEED_EXPLICIT_LIBDISPATCH)
12+
if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
1313
target_link_libraries(complete-test PRIVATE dispatch BlocksRuntime)
1414
endif()
1515

tools/SourceKit/tools/sourcekitd-repl/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ if(HAVE_UNICODE_LIBEDIT)
1313
LINK_LIBS ${SOURCEKITD_REPL_LINK_LIBS} edit
1414
LLVM_COMPONENT_DEPENDS support coverage lto
1515
)
16-
if(SOURCEKIT_NEED_EXPLICIT_LIBDISPATCH)
16+
if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
1717
target_link_libraries(sourcekitd-repl PRIVATE dispatch BlocksRuntime)
1818
endif()
1919

tools/SourceKit/tools/sourcekitd-test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ add_sourcekit_executable(sourcekitd-test
1515
clangRewrite clangLex clangBasic
1616
LLVM_COMPONENT_DEPENDS core support option coverage lto
1717
)
18-
if(SOURCEKIT_NEED_EXPLICIT_LIBDISPATCH)
18+
if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
1919
target_link_libraries(sourcekitd-test PRIVATE dispatch BlocksRuntime)
2020
endif()
2121

0 commit comments

Comments
 (0)