Skip to content

[Cmake] Add Synchronization #80841

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Runtimes/Resync.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ endforeach()
message(STATUS "plist[${StdlibSources}/Info.plist.in] -> Core/Info.plist.in")
copy_files("" "Core" FILES "Info.plist.in")

message(STATUS "plist[${StdlibSources}/Info.plist.in] -> Supplemental/Synchronization/Info.plist.in")
copy_files("" "Supplemental/Synchronization" FILES "Info.plist.in")

# Platform Overlays

# Copy magic linker symbols
Expand Down Expand Up @@ -153,6 +156,7 @@ copy_files(public/Platform Overlay/Windows/CRT
# libraries, and test support libraries.

# Supplemental Libraries
copy_library_sources("Synchronization" "public" "Supplemental")

# Copy StringProcessing, RegexParser, RegexBuilder
if(NOT DEFINED StringProcessing_ROOT_DIR)
Expand Down
50 changes: 50 additions & 0 deletions Runtimes/Supplemental/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

cmake_minimum_required(VERSION 3.29)

project(SwiftRuntime LANGUAGES Swift C CXX)

include(ExternalProject)
include(GNUInstallDirs)

set(SwiftRuntime_SWIFTC_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../")

foreach(lib ${Swift_ENABLE_RUNTIMES})
string(TOLOWER ${lib} name)
set(SwiftRuntime_ENABLE_${name} YES)
endforeach()

if(SwiftCore_DIR)
set(SwiftCore_DIR_FLAG "-DSwiftCore_DIR=${SwiftCore_DIR}")
endif()

if(CMAKE_MAKE_PROGRAM)
set(MAKE_PROGRAM_FLAG "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
endif()

set(COMMON_OPTIONS
-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
-DCMAKE_INSTALL_NAME_DIR=${CMAKE_INSTALL_NAME_DIR}
-DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=${CMAKE_BUILD_WITH_INSTALL_NAME_DIR}
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_COLOR_DIAGNOSTICS=${CMAKE_COLOR_DIAGNOSTICS}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_Swift_COMPILER=${CMAKE_Swift_COMPILER}
-DCMAKE_C_COMPILER_TARGET=${CMAKE_C_COMPILER_TARGET}
-DCMAKE_CXX_COMPILER_TARGET=${CMAKE_CXX_COMPILER_TARGET}
-DCMAKE_Swift_COMPILER_TARGET=${CMAKE_Swift_COMPILER_TARGET}
${SwiftCore_DIR_FLAG}
${MAKE_PROGRAM_FLAG})

# Synchronization
if(SwiftRuntime_ENABLE_synchronization)
ExternalProject_Add(Synchronization
PREFIX "Synchronization"
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Synchronization"
INSTALL_DIR "${CMAKE_INSTALL_PREFIX}"
INSTALL_COMMAND ""
CMAKE_ARGS
${COMMON_OPTIONS})
endif()
121 changes: 121 additions & 0 deletions Runtimes/Supplemental/Synchronization/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
cmake_minimum_required(VERSION 3.29)

set(CMAKE_POSITION_INDEPENDENT_CODE YES)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../cmake/modules")

if($ENV{BUILD_NUMBER})
math(EXPR BUILD_NUMBER "$ENV{BUILD_NUMBER} % 65535")
set(BUILD_NUMBER ".${BUILD_NUMBER}")
endif()
project(SwiftSynchronization
LANGUAGES Swift
VERSION 6.1.0${BUILD_NUMBER})

set(CMAKE_Swift_LANGUAGE_VERSION 5)

include(GNUInstallDirs)

if(NOT PROJECT_IS_TOP_LEVEL)
message(SEND_ERROR "Swift Synchronization must build as a standalone project")
endif()

set(${PROJECT_NAME}_SWIFTC_SOURCE_DIR
"${PROJECT_SOURCE_DIR}/../../../"
CACHE FILEPATH "Path to the root source directory of the Swift compiler")
Comment on lines +23 to +25
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you reference anything from there? I think that we should just drop this if possible. The supplemental libraries don't tend to reach into the sources of the core libraries AFAIK.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

*gyb enters chat*

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Though, for the purposes of the supplemental libraries, the gyb module should probably reach up into the compiler bits so that each of the supplemental projects don't need to explicitly.


set(${PROJECT_NAME}_VENDOR_MODULE_DIR "${CMAKE_SOURCE_DIR}/../cmake/modules/vendor"
CACHE FILEPATH "Location for private build system extension")

find_package(SwiftCore)
include(gyb)
include(ResourceEmbedding)
include(AvailabilityMacros)
include(PlatformInfo)

include("${${PROJECT_NAME}_VENDOR_MODULE_DIR}/Settings.cmake" OPTIONAL)

option(${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION "Generate ABI resilient runtime libraries"
${SwiftCore_ENABLE_LIBRARY_EVOLUTION})

option(${PROJECT_NAME}_ENABLE_PRESPECIALIZATION "Enable generic metadata prespecialization"
${SwiftCore_ENABLE_PRESPECIALIZATION})

option(${PROJECT_NAME}_ARCH_SUBDIR "Architecture used for setting the architecture subdirectory"
${SwiftCore_ARCH_SUBDIR})

option(${PROJECT_NAME}_INSTALL_NESTED_SUBDIR "Install libraries under a platform and architecture subdirectory"
${SwiftCore_INSTALL_NESTED_SUBDIR})

option(${PROJECT_NAME}_PLATFORM_SUBDIR "Platform name used for installed swift{doc,module,interface} files"
${SwiftCore_PLATFORM_SUBDIR})

option(${PROJECT_NAME}_COMPILER_VARIANT_TARGET "Compiler variant target to use when emiting modules"
${SwiftCore_COMPILER_VARIANT_TARGET})

include(CatalystSupport)
include(EmitSwiftInterface)

add_compile_options(
"$<$<COMPILE_LANGUAGE:Swift>:-nostdlibimport>"
"$<$<AND:$<BOOL:${${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION}>,$<COMPILE_LANGUAGE:Swift>>:-enable-library-evolution>"
"$<$<AND:$<BOOL:${${PROJECT_NAME}_ENABLE_PRESPECIALIZATION}>,$<COMPILE_LANGUAGE:Swift>>:SHELL:-Xfrontend -prespecialize-generic-metadata>"
$<$<COMPILE_LANGUAGE:Swift>:-explicit-module-build>
$<$<COMPILE_LANGUAGE:Swift>:-enable-builtin-module>
$<$<COMPILE_LANGUAGE:Swift>:-strict-memory-safety>
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-enable-experimental-feature RawLayout>"
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-enable-experimental-feature StaticExclusiveOnly>"
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-enable-experimental-feature Extern>")

gyb_expand(Atomics/AtomicIntegers.swift.gyb Atomics/AtomicIntegers.swift)
gyb_expand(Atomics/AtomicStorage.swift.gyb Atomics/AtomicStorage.swift)

add_library(swiftSynchronization
Atomics/Atomic.swift
Atomics/AtomicBool.swift
Atomics/AtomicFloats.swift
Atomics/AtomicLazyReference.swift
Atomics/AtomicMemoryOrderings.swift
Atomics/AtomicOptional.swift
Atomics/AtomicPointers.swift
Atomics/AtomicRepresentable.swift
Atomics/WordPair.swift
Atomics/AtomicStorage.swift
Atomics/AtomicIntegers.swift
Cell.swift
Mutex/Mutex.swift
$<$<PLATFORM_ID:Darwin>:Mutex/DarwinImpl.swift>
$<$<PLATFORM_ID:Linux>:Mutex/LinuxImpl.swift>
$<$<PLATFORM_ID:WASI>:Mutex/SpinLoopHint.swift>
$<$<PLATFORM_ID:WINDOWS>:Mutex/WindowsImpl.swift>)

set_target_properties(swiftSynchronization PROPERTIES
Swift_MODULE_NAME Synchronization
Swift_COMPILATION_MODE wholemodule)

if(APPLE AND BUILD_SHARED_LIBS)
target_link_options(swiftSynchronization PRIVATE "SHELL:-Xlinker -headerpad_max_install_names")
endif()

target_link_libraries(swiftSynchronization
PRIVATE
swiftCore
$<$<PLATFORM_ID:Darwin>:swiftDarwin>)

set(${PROJECT_NAME}_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/swift$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:_static>$<$<BOOL:${Supplemental_INSTALL_NESTED_SUBDIR}>:/${Supplemental_PLATFORM_SUBDIR}/${Supplemental_ARCH_SUBDIR}>" CACHE STRING "")
set(${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR "${CMAKE_INSTALL_LIBDIR}/swift$<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:_static>$<$<BOOL:${Supplemental_INSTALL_NESTED_SUBDIR}>:/${Supplemental_PLATFORM_SUBDIR}>" CACHE STRING "")

install(TARGETS swiftSynchronization
EXPORT SwiftSupplementalTargets
COMPONENT SwiftCore_runtime
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems a remnant from the reference code in SwiftCore -- maybe we can use the project name directly

Suggested change
COMPONENT SwiftCore_runtime
COMPONENT ${PROJECT_NAME}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Namespacing the component with the project name is good. Let's keep the _runtime suffix since this is only installing the runtime library. This will make it easier to split up the install story for different use cases.

ARCHIVE DESTINATION "${${PROJECT_NAME}_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${${PROJECT_NAME}_INSTALL_LIBDIR}"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
emit_swift_interface(swiftSynchronization)
install_swift_interface(swiftSynchronization)

# Configure plist creation for Darwin platforms.
generate_plist("${CMAKE_PROJECT_NAME}" "${CMAKE_PROJECT_VERSION}" swiftSynchronization)
embed_manifest(swiftSynchronization)

include("${${PROJECT_NAME}_VENDOR_MODULE_DIR}/swiftSynchronization.cmake" OPTIONAL)
38 changes: 38 additions & 0 deletions Runtimes/Supplemental/cmake/modules/CatalystSupport.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Add flags for generating the zippered target variant in the build

# Initialize `${PROJECT_NAME}_VARIANT_MODULE_TRIPLE` if the driver is able to emit
# modules for the target variant.

if(${PROJECT_NAME}_COMPILER_VARIANT_TARGET)
add_compile_options(
"$<$<COMPILE_LANGUAGE:C,CXX>:SHELL:-darwin-target-variant ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET}>"
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-target-variant ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET}>"

# TODO: Remove me once we have a driver with
# https://github.com/swiftlang/swift-driver/pull/1803
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-Xclang-linker -darwin-target-variant -Xclang-linker ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET}>")

add_link_options(
"$<$<LINK_LANGUAGE:C,CXX>:SHELL:-darwin-target-variant ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET}>"
"$<$<LINK_LANGUAGE:Swift>:SHELL:-target-variant ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET}>"

# TODO: Remove me once we have a driver with
# https://github.com/swiftlang/swift-driver/pull/1803
"$<$<LINK_LANGUAGE:Swift>:SHELL:-Xclang-linker -darwin-target-variant -Xclang-linker ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET}>")

# TODO: Once we are guaranteed to have a driver with the variant module path
# support everywhere, we should integrate this into PlatformInfo.cmake
check_compiler_flag(Swift "-emit-variant-module-path ${CMAKE_CURRENT_BINARY_DIR}/CompilerID/variant.swiftmodule" HAVE_Swift_VARIANT_MODULE_PATH_FLAG)
if(HAVE_Swift_VARIANT_MODULE_PATH_FLAG)
# Get variant module triple
set(module_triple_command "${CMAKE_Swift_COMPILER}" -print-target-info -target ${${PROJECT_NAME}_COMPILER_VARIANT_TARGET})
execute_process(COMMAND ${module_triple_command} OUTPUT_VARIABLE target_info_json)
message(CONFIGURE_LOG "Swift target variant info: ${target_info_json}")


string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple")
set(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE "${module_triple}" CACHE STRING "Triple used for installed swift{module,interface} files for the target variant")
mark_as_advanced(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
message(CONFIGURE_LOG "Swift target variant module triple: ${module_triple}")
endif()
endif()
73 changes: 73 additions & 0 deletions Runtimes/Supplemental/cmake/modules/EmitSwiftInterface.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Generate and install swift interface files

# TODO: CMake should learn how to model library evolution and generate this
# stuff automatically.


# Generate a swift interface file for the target if library evolution is enabled
function(emit_swift_interface target)
# Generate the target-variant binary swift module when performing zippered
# build
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
set(variant_module_tmp_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}")
file(MAKE_DIRECTORY "${variant_module_tmp_dir}")
target_compile_options(${target} PRIVATE
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-path ${variant_module_tmp_dir}/${target}.swiftmodule>")
endif()

# Generate textual swift interfaces is library-evolution is enabled
if(${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION)
target_compile_options(${target} PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:-emit-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface>
$<$<COMPILE_LANGUAGE:Swift>:-emit-private-module-interface-path$<SEMICOLON>${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface>
$<$<COMPILE_LANGUAGE:Swift>:-library-level$<SEMICOLON>api>
$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend$<SEMICOLON>-require-explicit-availability=ignore>)

# Emit catalyst swiftmodules and interfaces
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
target_compile_options(${target} PRIVATE
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-module-interface-path ${variant_module_tmp_dir}/${target}.swiftinterface>"
"$<$<COMPILE_LANGUAGE:Swift>:SHELL:-emit-variant-private-module-interface-path ${variant_module_tmp_dir}/${target}.private.swiftinterface>")
endif()
endif()
endfunction()

# Install the generated swift interface file for the target if library evolution
# is enabled.
function(install_swift_interface target)
# Install binary swift modules
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.swiftmodule"
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
COMPONENT ${PROJECT_NAME}_development)
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.swiftmodule"
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftmodule"
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
COMPONENT ${PROJECT_NAME}_development)
endif()

# Install Swift interfaces if library-evolution is enabled
if(${PROJECT_NAME}_ENABLE_LIBRARY_EVOLUTION)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftinterface"
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.swiftinterface"
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
COMPONENT ${PROJECT_NAME}_development)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.private.swiftinterface"
RENAME "${${PROJECT_NAME}_MODULE_TRIPLE}.private.swiftinterface"
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
COMPONENT ${PROJECT_NAME}_development)

# Install catalyst interface files
if(${PROJECT_NAME}_VARIANT_MODULE_TRIPLE)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.swiftinterface"
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.swiftinterface"
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
COMPONENT ${PROJECT_NAME}_development)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}-${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}/${target}.private.swiftinterface"
RENAME "${${PROJECT_NAME}_VARIANT_MODULE_TRIPLE}.private.swiftinterface"
DESTINATION "${${PROJECT_NAME}_INSTALL_SWIFTMODULEDIR}/$<TARGET_PROPERTY:${target},Swift_MODULE_NAME>.swiftmodule"
COMPONENT ${PROJECT_NAME}_development)
endif()
endif()
endfunction()
38 changes: 38 additions & 0 deletions Runtimes/Supplemental/cmake/modules/PlatformInfo.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
if(NOT ${PROJECT_NAME}_SIZEOF_POINTER)
set(${PROJECT_NAME}_SIZEOF_POINTER "${CMAKE_SIZEOF_VOID_P}" CACHE STRING "Size of a pointer in bytes")
message(CONFIGURE_LOG "Stdlib Pointer size: ${CMAKE_SIZEOF_VOID_P}")
mark_as_advanced(${PROJECT_NAME}_SIZEOF_POINTER)
endif()

# TODO: This logic should migrate to CMake once CMake supports installing swiftmodules
set(module_triple_command "${CMAKE_Swift_COMPILER}" -print-target-info)
if(CMAKE_Swift_COMPILER_TARGET)
list(APPEND module_triple_command -target ${CMAKE_Swift_COMPILER_TARGET})
endif()
execute_process(COMMAND ${module_triple_command} OUTPUT_VARIABLE target_info_json)
message(CONFIGURE_LOG "Swift target info: ${module_triple_command}\n"
"${target_info_json}")

if(NOT ${PROJECT_NAME}_MODULE_TRIPLE)
string(JSON module_triple GET "${target_info_json}" "target" "moduleTriple")
set(${PROJECT_NAME}_MODULE_TRIPLE "${module_triple}" CACHE STRING "Triple used for installed swift{doc,module,interface} files")
mark_as_advanced(${PROJECT_NAME}_MODULE_TRIPLE)

message(CONFIGURE_LOG "Swift module triple: ${module_triple}")
endif()

if(NOT ${PROJECT_NAME}_PLATFORM_SUBDIR)
string(JSON platform GET "${target_info_json}" "target" "platform")
set(${PROJECT_NAME}_PLATFORM_SUBDIR "${platform}" CACHE STRING "Platform name used for installed swift{doc,module,interface} files")
mark_as_advanced(${PROJECT_NAME}_PLATFORM_SUBDIR)

message(CONFIGURE_LOG "Swift platform: ${platform}")
endif()

if(NOT ${PROJECT_NAME}_ARCH_SUBDIR)
string(JSON arch GET "${target_info_json}" "target" "arch")
set(${PROJECT_NAME}_ARCH_SUBDIR "${arch}" CACHE STRING "Architecture used for setting the architecture subdirectory")
mark_as_advanced(${PROJECT_NAME}_ARCH_SUBDIR)

message(CONFIGURE_LOG "Swift Arch: ${arch}")
endif()
Loading