Skip to content

[CMake] Add option to set the target namespace #2659

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

Merged
merged 1 commit into from
Jun 21, 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: 1 addition & 1 deletion Sources/SwiftLibraryPluginProvider/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
add_swift_syntax_library(SwiftLibraryPluginProvider
LibraryPluginProvider.swift
)
target_link_libraries(SwiftLibraryPluginProvider PRIVATE
target_link_swift_syntax_libraries(SwiftLibraryPluginProvider PRIVATE
_SwiftLibraryPluginProviderCShims
)
target_link_swift_syntax_libraries(SwiftLibraryPluginProvider PUBLIC
Expand Down
2 changes: 1 addition & 1 deletion Sources/SwiftSyntaxBuilder/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ add_swift_syntax_library(SwiftSyntaxBuilder

# Don't depend on OSLog when we are building for the compiler.
# In that case we don't want any dependencies on the SDK.
target_compile_options(SwiftSyntaxBuilder PRIVATE
target_compile_options(${SWIFTSYNTAX_TARGET_NAMESPACE}SwiftSyntaxBuilder PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:-D;SWIFTSYNTAX_NO_OSLOG_DEPENDENCY>)

target_link_swift_syntax_libraries(SwiftSyntaxBuilder PUBLIC
Expand Down
6 changes: 3 additions & 3 deletions Sources/VersionMarkerModules/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

# Version Marker Modules.
# See the 'Macro Versioning.md' document for more details.
add_library(SwiftSyntax509 STATIC
add_library(${SWIFTSYNTAX_TARGET_NAMESPACE}SwiftSyntax509 STATIC
SwiftSyntax509/Empty.swift)
add_library(SwiftSyntax510 STATIC
add_library(${SWIFTSYNTAX_TARGET_NAMESPACE}SwiftSyntax510 STATIC
SwiftSyntax509/Empty.swift)
add_library(SwiftSyntax600 STATIC
add_library(${SWIFTSYNTAX_TARGET_NAMESPACE}SwiftSyntax600 STATIC
SwiftSyntax509/Empty.swift)
9 changes: 5 additions & 4 deletions Sources/_SwiftLibraryPluginProviderCShims/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
add_library(_SwiftLibraryPluginProviderCShims STATIC
set(target ${SWIFTSYNTAX_TARGET_NAMESPACE}_SwiftLibraryPluginProviderCShims)
add_library(${target} STATIC
LoadLibrary.c
)
target_include_directories(_SwiftLibraryPluginProviderCShims PUBLIC "include")
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS _SwiftLibraryPluginProviderCShims)
install(TARGETS _SwiftLibraryPluginProviderCShims EXPORT SwiftSyntaxTargets)
target_include_directories(${target} PUBLIC "include")
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${target})
install(TARGETS ${target} EXPORT SwiftSyntaxTargets)
9 changes: 5 additions & 4 deletions Sources/_SwiftSyntaxCShims/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
add_library(_SwiftSyntaxCShims INTERFACE)
target_include_directories(_SwiftSyntaxCShims INTERFACE "include")
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS _SwiftSyntaxCShims)
install(TARGETS _SwiftSyntaxCShims EXPORT SwiftSyntaxTargets)
set(target ${SWIFTSYNTAX_TARGET_NAMESPACE}_SwiftSyntaxCShims)
add_library(${target} INTERFACE)
target_include_directories(${target} INTERFACE "include")
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${target})
install(TARGETS ${target} EXPORT SwiftSyntaxTargets)
146 changes: 83 additions & 63 deletions cmake/modules/AddSwiftHostLibrary.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,33 @@
# See http://swift.org/LICENSE.txt for license information
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors

# cmake generation for Swift adds an order only dependency, which matches how C-family languages
# works. In that case, however, ninja (and presumably other generators) will rebuild on header
# changes. That's not the case for Swift, and thus if A -> B, A is not being rebuilt when the
# ABI/API of B changes.
#
# For now workaround this by touching a file whenever B is rebuilt and then compiling that file as
# part of A. Ideally this file would be generated by each of the targets, but that dependency didn't
# seem to be being tracked.
#
# Remove once rdar://102202478 is fixed.
function(target_link_swift_syntax_libraries TARGET)
target_link_libraries(${TARGET} ${ARGN})

cmake_parse_arguments(ARGS "PUBLIC;PRIVATE;INTERFACE" "" "" ${ARGN})
foreach(DEPENDENCY ${ARGS_UNPARSED_ARGUMENTS})
set(link_type)
if(ARGS_PUBLIC)
set(link_type PUBLIC)
elseif(ARGS_PRIVATE)
set(link_type PRIVATE)
elseif(ARGS_INTERFACE)
set(link_type INTERFACE)
endif()
Comment on lines 10 to +18
Copy link
Contributor

Choose a reason for hiding this comment

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

Should it be an error if you omit the link type?

Copy link
Member Author

Choose a reason for hiding this comment

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

https://cmake.org/cmake/help/latest/command/target_link_libraries.html#libraries-for-both-a-target-and-its-dependents
Since it's optional for target_link_libraries, I'm leaving it as is for now

Copy link
Contributor

Choose a reason for hiding this comment

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

Fair enough, my main concern would be if a new link type was added that wasn't handled here, it may get silently dropped


string(PREPEND TARGET ${SWIFTSYNTAX_TARGET_NAMESPACE})
list(TRANSFORM ARGS_UNPARSED_ARGUMENTS PREPEND "${SWIFTSYNTAX_TARGET_NAMESPACE}" OUTPUT_VARIABLE dependencies)

target_link_libraries(${TARGET} ${link_type} ${dependencies})

# cmake generation for Swift adds an order only dependency, which matches how C-family languages
# works. In that case, however, ninja (and presumably other generators) will rebuild on header
# changes. That's not the case for Swift, and thus if A -> B, A is not being rebuilt when the
# ABI/API of B changes.
#
# For now workaround this by touching a file whenever B is rebuilt and then compiling that file as
# part of A. Ideally this file would be generated by each of the targets, but that dependency didn't
# seem to be being tracked.
#
# Remove once rdar://102202478 is fixed.
foreach(DEPENDENCY ${dependencies})
string(REGEX REPLACE [<>:\"/\\|?*] _ sanitized ${DEPENDENCY})
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/forced-${sanitized}-dep.swift
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/forced-${sanitized}-dep.swift
Expand All @@ -36,103 +48,111 @@ endfunction()
function(add_swift_syntax_library name)
set(ASHL_SOURCES ${ARGN})

# Create the library target.
add_library(${name} ${ASHL_SOURCES})

# Determine where Swift modules will be built and installed.
set(module_dir ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(module_base "${module_dir}/${name}.swiftmodule")
set(module_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.swiftmodule")
set(module_interface_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.swiftinterface")
set(module_private_interface_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.private.swiftinterface")
set(module_sourceinfo_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.swiftsourceinfo")
set(target ${SWIFTSYNTAX_TARGET_NAMESPACE}${name})

# Add a custom target to create the module directory.
add_custom_command(
TARGET ${name}
# Create the library target.
add_library(${target} ${ASHL_SOURCES})

if(NOT DEFINED SWIFTSYNTAX_EMIT_MODULE OR SWIFTSYNTAX_EMIT_MODULE)
# Determine where Swift modules will be built and installed.
set(module_dir ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(module_base "${module_dir}/${name}.swiftmodule")
set(module_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.swiftmodule")
set(module_interface_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.swiftinterface")
set(module_private_interface_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.private.swiftinterface")
set(module_sourceinfo_file "${module_base}/${SWIFT_HOST_MODULE_TRIPLE}.swiftsourceinfo")

# Add a custom target to create the module directory.
add_custom_command(
TARGET ${target}
PRE_BUILD
COMMAND "${CMAKE_COMMAND}" -E make_directory ${module_base}
COMMENT "Generating module directory for ${name}")
COMMENT "Generating module directory for ${target}")

# Configure the emission of the Swift module files.
target_compile_options("${target}" PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:
-DRESILIENT_LIBRARIES;
-enable-library-evolution;
-emit-module-path;${module_file};
-emit-module-source-info-path;${module_sourceinfo_file};
-emit-module-interface-path;${module_interface_file};
-emit-private-module-interface-path;${module_private_interface_file}
>)
else()
set(module_dir ${CMAKE_CURRENT_BINARY_DIR})
set(module_base "${module_dir}/${name}.swiftmodule")
set(module_file "${module_file}")
endif()

# Touch the library and objects to workaround their mtime not being updated
# when there are no real changes (eg. a file was updated with a comment).
# Ideally this should be done in the driver, which could only update the
# files that have changed.
add_custom_command(
TARGET ${name}
POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E touch_nocreate $<TARGET_FILE:${name}> $<TARGET_OBJECTS:${name}> "${module_base}"
COMMAND_EXPAND_LISTS
COMMENT "Update mtime of library outputs workaround")

# Install the Swift module into the appropriate location.
set_target_properties(${name}
PROPERTIES Swift_MODULE_DIRECTORY ${module_dir}
TARGET ${target}
POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E touch_nocreate $<TARGET_FILE:${target}> $<TARGET_OBJECTS:${target}> "${module_base}"
COMMAND_EXPAND_LISTS
COMMENT "Update mtime of library outputs workaround")

set_target_properties(${target} PROPERTIES
Swift_MODULE_NAME ${name}
Swift_MODULE_DIRECTORY ${module_dir}
INTERFACE_INCLUDE_DIRECTORIES ${module_dir}
)

# Configure the emission of the Swift module files.
target_compile_options("${name}" PRIVATE
target_compile_options("${target}" PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:
-DRESILIENT_LIBRARIES;
-module-name;${name};
-enable-library-evolution;
-emit-module-path;${module_file};
-emit-module-source-info-path;${module_sourceinfo_file};
-emit-module-interface-path;${module_interface_file};
-emit-private-module-interface-path;${module_private_interface_file}
"SHELL:-module-name ${name}"
"SHELL:-Xfrontend -module-abi-name -Xfrontend ${SWIFT_MODULE_ABI_NAME_PREFIX}${name}"
>)
if(SWIFT_MODULE_ABI_NAME_PREFIX)
# ABI name prefix. this can be used to avoid name conflicts.
target_compile_options("${name}" PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:
"SHELL:-Xfrontend -module-abi-name -Xfrontend ${SWIFT_MODULE_ABI_NAME_PREFIX}${name}"
>)
endif()

if(CMAKE_VERSION VERSION_LESS 3.26.0 AND SWIFT_SYNTAX_ENABLE_WMO_PRE_3_26)
target_compile_options(${name} PRIVATE
target_compile_options(${target} PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:-wmo>)
endif()

target_compile_options(${name} PRIVATE
target_compile_options(${target} PRIVATE
$<$<COMPILE_LANGUAGE:Swift>:-color-diagnostics>
)

if(LLVM_USE_LINKER)
target_link_options(${name} PRIVATE
target_link_options(${target} PRIVATE
"-use-ld=${LLVM_USE_LINKER}"
)
endif()

# NOTE: workaround for CMake not setting up include flags yet
set_target_properties(${name} PROPERTIES
set_target_properties(${target} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${module_dir}
)

set_target_properties(${name} PROPERTIES
set_target_properties(${target} PROPERTIES
BUILD_WITH_INSTALL_RPATH YES
)

if(SWIFT_HOST_LIBRARIES_RPATH)
# Don't add builder's stdlib RPATH automatically.
target_compile_options(${name} PRIVATE -no-toolchain-stdlib-rpath)
set_property(TARGET ${name}
target_compile_options(${target} PRIVATE -no-toolchain-stdlib-rpath)
set_property(TARGET ${target}
PROPERTY INSTALL_RPATH "${SWIFT_HOST_LIBRARIES_RPATH}"
)
endif()

get_target_property(lib_type ${name} TYPE)
get_target_property(lib_type ${target} TYPE)
if(lib_type STREQUAL SHARED_LIBRARY)
if (CMAKE_SYSTEM_NAME STREQUAL Darwin)
# Allow install_name_tool to update paths (for rdar://109473564)
set_property(TARGET ${name} APPEND_STRING PROPERTY
set_property(TARGET ${target} APPEND_STRING PROPERTY
LINK_FLAGS " -Xlinker -headerpad_max_install_names")
endif()
endif()

if(PROJECT_IS_TOP_LEVEL OR SWIFT_SYNTAX_INSTALL_TARGETS)
# Install this target
install(TARGETS ${name}
install(TARGETS ${target}
EXPORT SwiftSyntaxTargets
ARCHIVE DESTINATION lib/${SWIFT_HOST_LIBRARIES_SUBDIRECTORY}
LIBRARY DESTINATION lib/${SWIFT_HOST_LIBRARIES_SUBDIRECTORY}
Expand All @@ -146,7 +166,7 @@ function(add_swift_syntax_library name)
FILES_MATCHING PATTERN "*.swiftinterface"
)
else()
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${name})
set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${target})
endif()
add_library(SwiftSyntax::${name} ALIAS ${name})
add_library(SwiftSyntax::${target} ALIAS ${target})
endfunction()