Skip to content
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

FoundationMacros: use cross-compilation to build for host #714

Merged
merged 1 commit into from
Aug 12, 2024
Merged
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
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ set(BUILD_TESTING NO)
set(COLLECTIONS_SINGLE_MODULE YES)
set(COLLECTIONS_FOUNDATION_TOOLCHAIN_MODULE YES)

set(SwiftFoundation_MACRO "" CACHE STRING "Path to Foundation macro plugin")

# Make sure our dependencies exists
include(FetchContent)
if (_SwiftFoundationICU_SourceDIR)
Expand Down
6 changes: 0 additions & 6 deletions Sources/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,5 @@
##===----------------------------------------------------------------------===##

add_subdirectory(_FoundationCShims)

# Disable the macro build on Windows until we can correctly build it for the host architecture
if(NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
add_subdirectory(FoundationMacros)
endif()

add_subdirectory(FoundationEssentials)
add_subdirectory(FoundationInternationalization)
7 changes: 3 additions & 4 deletions Sources/FoundationEssentials/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,9 @@ add_subdirectory(String)
add_subdirectory(TimeZone)
add_subdirectory(URL)

if(NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
# Depend on FoundationMacros
add_dependencies(FoundationEssentials FoundationMacros)
target_compile_options(FoundationEssentials PRIVATE -plugin-path ${CMAKE_BINARY_DIR}/lib)
if(SwiftFoundation_MACRO)
target_compile_options(FoundationEssentials PRIVATE
"SHELL:-plugin-path ${SwiftFoundation_MACRO}")
endif()

if(CMAKE_SYSTEM_NAME STREQUAL Linux OR CMAKE_SYSTEM_NAME STREQUAL Android)
Expand Down
53 changes: 35 additions & 18 deletions Sources/FoundationMacros/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,29 +12,45 @@
##
##===----------------------------------------------------------------------===##

cmake_minimum_required(VERSION 3.22)

if(POLICY CMP0156)
# Deduplicate linked libraries where appropriate
cmake_policy(SET CMP0156 NEW)
endif()
if(POLICY CMP0157)
# New Swift build model: improved incremental build performance and LSP support
cmake_policy(SET CMP0157 NEW)
endif()

project(FoundationMacros
LANGUAGES Swift)

# SwiftSyntax Dependency
include(FetchContent)
find_package(SwiftSyntax)
find_package(SwiftSyntax QUIET)
if(NOT SwiftSyntax_FOUND)
include(FetchContent)

# If building at desk, check out and link against the SwiftSyntax repo's targets
FetchContent_Declare(SwiftSyntax
GIT_REPOSITORY https://github.com/swiftlang/swift-syntax.git
GIT_TAG 4c6cc0a3b9e8f14b3ae2307c5ccae4de6167ac2c) # 600.0.0-prerelease-2024-06-12
FetchContent_MakeAvailable(SwiftSyntax)
else()
message(STATUS "Using swift-syntax from ${SwiftSyntax_DIR}")
endif()

add_library(FoundationMacros SHARED
FoundationMacros.swift
PredicateMacro.swift)

target_compile_definitions(FoundationMacros PRIVATE FOUNDATION_MACROS_LIBRARY)

set_target_properties(FoundationMacros
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/lib
)
target_compile_options(FoundationMacros PRIVATE -parse-as-library)
target_compile_options(FoundationMacros PRIVATE
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend AccessLevelOnImport>"
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend StrictConcurrency>"
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-upcoming-feature -Xfrontend InferSendableFromCaptures>")

target_link_libraries(FoundationMacros PUBLIC
SwiftSyntax::SwiftSyntax
Expand All @@ -43,18 +59,19 @@ target_link_libraries(FoundationMacros PUBLIC
SwiftSyntax::SwiftSyntaxBuilder
)

# The macro is installed into lib/swift/host/plugins, but needs to load libraries from lib/swift/host and lib/swift/${SWIFT_SYSTEM_NAME}
set_target_properties(FoundationMacros PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin

INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/lib

# The macro is installed into lib/swift/host/plugins, but needs to load
# libraries from lib/swift/host and lib/swift/${SWIFT_SYSTEM_NAME}
INSTALL_RPATH "$ORIGIN/../../../swift/${SWIFT_SYSTEM_NAME}:$ORIGIN/.."
INSTALL_REMOVE_ENVIRONMENT_RPATH ON)

target_compile_options(FoundationMacros PRIVATE -parse-as-library)
target_compile_options(FoundationMacros PRIVATE
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend AccessLevelOnImport>"
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-experimental-feature -Xfrontend StrictConcurrency>"
"SHELL:$<$<COMPILE_LANGUAGE:Swift>:-Xfrontend -enable-upcoming-feature -Xfrontend InferSendableFromCaptures>")

install(TARGETS FoundationMacros
ARCHIVE DESTINATION lib/swift/host/plugins
LIBRARY DESTINATION lib/swift/host/plugins
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
RUNTIME DESTINATION bin)