From 1848afe3064b686e042b4873e0ac13f431654180 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Fri, 31 Mar 2023 09:10:46 -0700 Subject: [PATCH 1/2] build: slightly improve the build for libdispatch Avoid polluting the build directory a small amount given that we can use `-fmodule-map-file=` for the C/C++ build of libdispatch. Unfortunately, for the Swift build, we need to have the file copied over due to the umbrella header resolution. Hopefully this reduces some of the race conditions that we have seen in the build. Thanks to @dgregor for reminding me of the flag! --- .gitignore | 1 - CMakeLists.txt | 22 ++++------------------ src/swift/CMakeLists.txt | 14 +++++++++++++- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index aa26514c9..e0873a153 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,3 @@ configure libtool .dirstamp /dispatch/module.modulemap -/private/module.modulemap diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bef26395..57a37d3b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,26 +261,12 @@ endif() if(CMAKE_SYSTEM_NAME STREQUAL Darwin) - add_custom_command(OUTPUT - "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" - "${PROJECT_SOURCE_DIR}/private/module.modulemap" - COMMAND - ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_SOURCE_DIR}/dispatch/darwin/module.modulemap" "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" - COMMAND - ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_SOURCE_DIR}/private/darwin/module.modulemap" "${PROJECT_SOURCE_DIR}/private/module.modulemap") + add_compile_options($<$,$>:-fmodule-map-file=${PROJECT_SOURCE_DIR}/dispatch/darwin/module.modulemap> + $<$,$>:-fmodule-map-file=${PROJECT_SOURCE_DIR}/private/darwin/module.modulemap>) else() - add_custom_command(OUTPUT - "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" - "${PROJECT_SOURCE_DIR}/private/module.modulemap" - COMMAND - ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_SOURCE_DIR}/dispatch/generic/module.modulemap" "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" - COMMAND - ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_SOURCE_DIR}/private/generic/module.modulemap" "${PROJECT_SOURCE_DIR}/private/module.modulemap") + add_compile_options($<$,$>:-fmodule-map-file=${PROJECT_SOURCE_DIR}/dispatch/generic/module.modulemap> + $<$,$>:-fmodule-map-file=${PROJECT_SOURCE_DIR}/private/generic/module.modulemap>) endif() -add_custom_target(module-maps ALL - DEPENDS - "${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" - "${PROJECT_SOURCE_DIR}/private/module.modulemap") configure_file("${PROJECT_SOURCE_DIR}/cmake/config.h.in" "${PROJECT_BINARY_DIR}/config/config_ac.h") diff --git a/src/swift/CMakeLists.txt b/src/swift/CMakeLists.txt index c26d00d02..317faed2a 100644 --- a/src/swift/CMakeLists.txt +++ b/src/swift/CMakeLists.txt @@ -18,6 +18,18 @@ target_include_directories(DispatchStubs PRIVATE set_target_properties(DispatchStubs PROPERTIES POSITION_INDEPENDENT_CODE YES) + +if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/dispatch/darwin/module.modulemap ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap) +else() + add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/dispatch/generic/module.modulemap ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap) +endif() +add_custom_target(module-map ALL + DEPENDS ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap) + + add_library(swiftDispatch Block.swift Data.swift @@ -42,7 +54,7 @@ target_link_libraries(swiftDispatch PRIVATE BlocksRuntime::BlocksRuntime) target_link_libraries(swiftDispatch PUBLIC dispatch) -add_dependencies(swiftDispatch module-maps) +add_dependencies(swiftDispatch module-map) get_swift_host_arch(swift_arch) install(FILES From ed909bb3a015d151cd8a800fc1a05581c7faaa29 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Fri, 31 Mar 2023 10:57:37 -0700 Subject: [PATCH 2/2] dispatch: attempt to use a VFS overlay Use a VFS overlay to avoid polluting the source tree. --- .gitignore | 1 - dispatch/CMakeLists.txt | 22 ++++++++++------------ dispatch/dispatch-vfs.yaml.in | 11 +++++++++++ src/swift/CMakeLists.txt | 15 ++------------- 4 files changed, 23 insertions(+), 26 deletions(-) create mode 100644 dispatch/dispatch-vfs.yaml.in diff --git a/.gitignore b/.gitignore index e0873a153..1bf54ca69 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,3 @@ config configure libtool .dirstamp -/dispatch/module.modulemap diff --git a/dispatch/CMakeLists.txt b/dispatch/CMakeLists.txt index 7f68ed381..352915d91 100644 --- a/dispatch/CMakeLists.txt +++ b/dispatch/CMakeLists.txt @@ -1,4 +1,13 @@ +if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + set(DISPATCH_MODULE_MAP ${PROJECT_SOURCE_DIR}/dispatch/darwin/module.modulemap) +else() + set(DISPATCH_MODULE_MAP ${PROJECT_SOURCE_DIR}/dispatch/generic/module.modulemap) +endif() +configure_file(dispatch-vfs.yaml.in + ${CMAKE_BINARY_DIR}/dispatch-vfs-overlay.yaml + @ONLY) + install(FILES base.h block.h @@ -16,19 +25,8 @@ install(FILES DESTINATION "${INSTALL_DISPATCH_HEADERS_DIR}") if(ENABLE_SWIFT) - set(base_dir "${CMAKE_CURRENT_SOURCE_DIR}") - if(NOT BUILD_SHARED_LIBS) - set(base_dir "${CMAKE_CURRENT_SOURCE_DIR}/generic_static") - endif() - - get_filename_component( - MODULE_MAP - module.modulemap - REALPATH - BASE_DIR "${base_dir}") - install(FILES - ${MODULE_MAP} + ${DISPATCH_MODULE_MAP} DESTINATION "${INSTALL_DISPATCH_HEADERS_DIR}") endif() diff --git a/dispatch/dispatch-vfs.yaml.in b/dispatch/dispatch-vfs.yaml.in new file mode 100644 index 000000000..9416dda81 --- /dev/null +++ b/dispatch/dispatch-vfs.yaml.in @@ -0,0 +1,11 @@ +--- +version: 0 +case-sensitive: false +use-external-names: false +roots: + - name: "@CMAKE_CURRENT_SOURCE_DIR@" + type: directory + contents: + - name: module.modulemap + type: file + external-contents: "@DISPATCH_MODULE_MAP@" diff --git a/src/swift/CMakeLists.txt b/src/swift/CMakeLists.txt index 317faed2a..c073e136d 100644 --- a/src/swift/CMakeLists.txt +++ b/src/swift/CMakeLists.txt @@ -18,18 +18,6 @@ target_include_directories(DispatchStubs PRIVATE set_target_properties(DispatchStubs PROPERTIES POSITION_INDEPENDENT_CODE YES) - -if(CMAKE_SYSTEM_NAME STREQUAL Darwin) - add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/dispatch/darwin/module.modulemap ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap) -else() - add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/dispatch/generic/module.modulemap ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap) -endif() -add_custom_target(module-map ALL - DEPENDS ${PROJECT_SOURCE_DIR}/dispatch/module.modulemap) - - add_library(swiftDispatch Block.swift Data.swift @@ -45,6 +33,8 @@ target_compile_options(swiftDispatch PRIVATE "SHELL:-Xcc -fmodule-map-file=${PROJECT_SOURCE_DIR}/dispatch/module.modulemap" "SHELL:-Xcc -I${PROJECT_SOURCE_DIR}" "SHELL:-Xcc -I${PROJECT_SOURCE_DIR}/src/swift/shims") +target_compile_options(swiftDispatch PUBLIC + "SHELL:-vfsoverlay ${CMAKE_BINARY_DIR}/dispatch-vfs-overlay.yaml") set_target_properties(swiftDispatch PROPERTIES Swift_MODULE_NAME Dispatch Swift_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/swift @@ -54,7 +44,6 @@ target_link_libraries(swiftDispatch PRIVATE BlocksRuntime::BlocksRuntime) target_link_libraries(swiftDispatch PUBLIC dispatch) -add_dependencies(swiftDispatch module-map) get_swift_host_arch(swift_arch) install(FILES