diff --git a/.gitignore b/.gitignore index aa26514c9..1bf54ca69 100644 --- a/.gitignore +++ b/.gitignore @@ -29,5 +29,3 @@ config 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/dispatch/CMakeLists.txt b/dispatch/CMakeLists.txt index 7f68ed381..a7f5fc306 100644 --- a/dispatch/CMakeLists.txt +++ b/dispatch/CMakeLists.txt @@ -1,4 +1,15 @@ +if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + set(DISPATCH_MODULE_MAP ${PROJECT_SOURCE_DIR}/dispatch/darwin/module.modulemap) +elseif(BUILD_SHARED_LIBS) + set(DISPATCH_MODULE_MAP ${PROJECT_SOURCE_DIR}/dispatch/generic/module.modulemap) +else() + set(DISPATCH_MODULE_MAP ${PROJECT_SOURCE_DIR}/dispatch/generic_static/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 +27,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/CMakeLists.txt b/src/CMakeLists.txt index ac6a9aa09..811e131e0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,6 +141,7 @@ target_link_libraries(dispatch PUBLIC BlocksRuntime::BlocksRuntime) if(CMAKE_SYSTEM_NAME STREQUAL Windows) target_link_libraries(dispatch PRIVATE + AdvAPI32 ShLwApi WS2_32 WinMM diff --git a/src/shims/lock.c b/src/shims/lock.c index 62fa6f385..88fb8f8b6 100644 --- a/src/shims/lock.c +++ b/src/shims/lock.c @@ -266,6 +266,7 @@ void _dispatch_sema4_init(_dispatch_sema4_t *sema, int policy DISPATCH_UNUSED) // lazily allocate the semaphore port + os_atomic_cmpxchg(sema, *sema, 0, relaxed); while (!dispatch_assume(tmp = CreateSemaphore(NULL, 0, LONG_MAX, NULL))) { _dispatch_temporary_resource_shortage(); } diff --git a/src/swift/CMakeLists.txt b/src/swift/CMakeLists.txt index c26d00d02..c073e136d 100644 --- a/src/swift/CMakeLists.txt +++ b/src/swift/CMakeLists.txt @@ -33,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 @@ -42,7 +44,6 @@ target_link_libraries(swiftDispatch PRIVATE BlocksRuntime::BlocksRuntime) target_link_libraries(swiftDispatch PUBLIC dispatch) -add_dependencies(swiftDispatch module-maps) get_swift_host_arch(swift_arch) install(FILES diff --git a/tests/generic_win_port.c b/tests/generic_win_port.c index ba685a18b..3a4fb2034 100644 --- a/tests/generic_win_port.c +++ b/tests/generic_win_port.c @@ -188,7 +188,7 @@ gettimeofday(struct timeval *tp, void *tzp) typedef void (WINAPI *QueryUnbiasedInterruptTimePreciseT)(PULONGLONG); static QueryUnbiasedInterruptTimePreciseT QueryUnbiasedInterruptTimePrecisePtr; -static BOOL +static BOOL WINAPI mach_absolute_time_init(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContext) { // QueryUnbiasedInterruptTimePrecise() is declared in the Windows headers