blob: 47ff4987591cbcf1ed241280847d42c724418f08 [file] [log] [blame] [edit]
# This file is for macros that are used by multiple projects. If your macro is
# exclusively needed in only one subdirectory of Source (e.g. only needed by
# WebCore), then put it there instead.
macro(WEBKIT_COMPUTE_SOURCES _framework)
set(_derivedSourcesPath ${${_framework}_DERIVED_SOURCES_DIR})
foreach (_sourcesListFile IN LISTS ${_framework}_UNIFIED_SOURCE_LIST_FILES)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${_sourcesListFile}" "${_derivedSourcesPath}/${_sourcesListFile}" COPYONLY)
message(STATUS "Using source list file: ${_sourcesListFile}")
list(APPEND _sourceListFileTruePaths "${CMAKE_CURRENT_SOURCE_DIR}/${_sourcesListFile}")
endforeach ()
set(gusb_args --derived-sources-path ${_derivedSourcesPath} --source-tree-path ${CMAKE_CURRENT_SOURCE_DIR})
# Windows needs a larger bundle size because that helps keep WebCore.lib's size below the 4GB maximum in debug builds.
if (MSVC AND ${_framework} STREQUAL "WebCore" AND ${_framework}_LIBRARY_TYPE STREQUAL "STATIC")
list(APPEND gusb_args --max-bundle-size 16)
endif ()
if (ENABLE_UNIFIED_BUILDS)
execute_process(COMMAND ${RUBY_EXECUTABLE} ${WTF_SCRIPTS_DIR}/generate-unified-source-bundles.rb
${gusb_args}
"--print-bundled-sources"
${_sourceListFileTruePaths}
RESULT_VARIABLE _resultTmp
OUTPUT_VARIABLE _outputTmp)
if (${_resultTmp})
message(FATAL_ERROR "generate-unified-source-bundles.rb exited with non-zero status, exiting")
endif ()
foreach (_sourceFileTmp IN LISTS _outputTmp)
set_source_files_properties(${_sourceFileTmp} PROPERTIES HEADER_FILE_ONLY ON)
list(APPEND ${_framework}_HEADERS ${_sourceFileTmp})
endforeach ()
unset(_sourceFileTmp)
execute_process(COMMAND ${RUBY_EXECUTABLE} ${WTF_SCRIPTS_DIR}/generate-unified-source-bundles.rb
${gusb_args}
${_sourceListFileTruePaths}
RESULT_VARIABLE _resultTmp
OUTPUT_VARIABLE _outputTmp)
if (${_resultTmp})
message(FATAL_ERROR "generate-unified-source-bundles.rb exited with non-zero status, exiting")
endif ()
foreach (_file IN LISTS _outputTmp)
if (_file MATCHES "\\.c$")
list(APPEND ${_framework}_C_SOURCES ${_file})
else ()
list(APPEND ${_framework}_SOURCES ${_file})
endif ()
endforeach ()
unset(_resultTmp)
unset(_outputTmp)
else ()
execute_process(COMMAND ${RUBY_EXECUTABLE} ${WTF_SCRIPTS_DIR}/generate-unified-source-bundles.rb
${gusb_args}
"--print-all-sources"
${_sourceListFileTruePaths}
RESULT_VARIABLE _resultTmp
OUTPUT_VARIABLE _outputTmp)
if (${_resultTmp})
message(FATAL_ERROR "generate-unified-source-bundles.rb exited with non-zero status, exiting")
endif ()
list(APPEND ${_framework}_SOURCES ${_outputTmp})
unset(_resultTmp)
unset(_outputTmp)
endif ()
endmacro()
macro(WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS)
set(_file ${CMAKE_CURRENT_SOURCE_DIR}/Platform${PORT}.cmake)
if (EXISTS ${_file})
message(STATUS "Using platform-specific CMakeLists: ${_file}")
include(${_file})
else ()
message(STATUS "Platform-specific CMakeLists not found: ${_file}")
endif ()
endmacro()
# Append the given dependencies to the source file
macro(WEBKIT_ADD_SOURCE_DEPENDENCIES _source _deps)
set(_tmp)
get_source_file_property(_tmp ${_source} OBJECT_DEPENDS)
if (NOT _tmp)
set(_tmp "")
endif ()
foreach (f ${_deps})
list(APPEND _tmp "${f}")
endforeach ()
set_source_files_properties(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}")
unset(_tmp)
endmacro()
macro(WEBKIT_FRAMEWORK_DECLARE _target)
# add_library() without any source files triggers CMake warning
# Addition of dummy "source" file does not result in any changes in generated build.ninja file
add_library(${_target} ${${_target}_LIBRARY_TYPE} "${CMAKE_BINARY_DIR}/cmakeconfig.h")
endmacro()
macro(WEBKIT_LIBRARY_DECLARE _target)
# add_library() without any source files triggers CMake warning
# Addition of dummy "source" file does not result in any changes in generated build.ninja file
add_library(${_target} ${${_target}_LIBRARY_TYPE} "${CMAKE_BINARY_DIR}/cmakeconfig.h")
if (${_target}_LIBRARY_TYPE STREQUAL "OBJECT")
list(APPEND ${_target}_INTERFACE_LIBRARIES $<TARGET_OBJECTS:${_target}>)
if (TARGET ${_target}_c)
list(APPEND ${_target}_INTERFACE_LIBRARIES $<TARGET_OBJECTS:${_target}_c>)
endif ()
endif ()
endmacro()
macro(WEBKIT_EXECUTABLE_DECLARE _target)
add_executable(${_target} "${CMAKE_BINARY_DIR}/cmakeconfig.h")
endmacro()
# Private macro for setting the properties of a target.
macro(_WEBKIT_TARGET_SETUP _target _logical_name)
target_include_directories(${_target} PUBLIC "$<BUILD_INTERFACE:${${_logical_name}_INCLUDE_DIRECTORIES}>")
target_include_directories(${_target} SYSTEM PRIVATE "$<BUILD_INTERFACE:${${_logical_name}_SYSTEM_INCLUDE_DIRECTORIES}>")
target_include_directories(${_target} PRIVATE "$<BUILD_INTERFACE:${${_logical_name}_PRIVATE_INCLUDE_DIRECTORIES}>")
if (DEVELOPER_MODE_CXX_FLAGS)
target_compile_options(${_target} PRIVATE ${DEVELOPER_MODE_CXX_FLAGS})
endif ()
target_compile_definitions(${_target} PRIVATE "BUILDING_${_logical_name}")
if (${_logical_name}_DEFINITIONS)
target_compile_definitions(${_target} PUBLIC ${${_logical_name}_DEFINITIONS})
endif ()
if (${_logical_name}_PRIVATE_DEFINITIONS)
target_compile_definitions(${_target} PRIVATE ${${_logical_name}_PRIVATE_DEFINITIONS})
endif ()
if (${_logical_name}_COMPILE_OPTIONS)
target_compile_options(${_target} PRIVATE ${${_logical_name}_COMPILE_OPTIONS})
endif ()
if (${_logical_name}_LIBRARIES)
target_link_libraries(${_target} PUBLIC ${${_logical_name}_LIBRARIES})
endif ()
if (${_logical_name}_PRIVATE_LIBRARIES)
target_link_libraries(${_target} PRIVATE ${${_logical_name}_PRIVATE_LIBRARIES})
endif ()
if (${_logical_name}_DEPENDENCIES)
add_dependencies(${_target} ${${_logical_name}_DEPENDENCIES})
endif ()
endmacro()
macro(_WEBKIT_TARGET _target)
if (CMAKE_GENERATOR MATCHES "Visual Studio")
if (${_target}_C_SOURCES)
add_library(${_target}_c OBJECT)
target_sources(${_target}_c PRIVATE ${${_target}_C_SOURCES})
_WEBKIT_TARGET_SETUP(${_target}_c ${_target})
set_target_properties(${_target}_c PROPERTIES C_STANDARD 17)
list(APPEND ${_target}_PRIVATE_LIBRARIES ${_target}_c)
endif ()
target_sources(${_target} PRIVATE
${${_target}_HEADERS}
${${_target}_SOURCES}
)
_WEBKIT_TARGET_SETUP(${_target} ${_target})
else ()
target_sources(${_target} PRIVATE
${${_target}_HEADERS}
${${_target}_SOURCES}
${${_target}_C_SOURCES}
)
_WEBKIT_TARGET_SETUP(${_target} ${_target})
endif ()
endmacro()
macro(_WEBKIT_TARGET_ANALYZE _target)
if (ClangTidy_EXE)
set(_clang_path_and_options
${ClangTidy_EXE}
# Include all non system headers
--header-filter=.*
)
set_target_properties(${_target} PROPERTIES
C_CLANG_TIDY "${_clang_path_and_options}"
CXX_CLANG_TIDY "${_clang_path_and_options}"
)
endif ()
if (IWYU_EXE)
set(_iwyu_path_and_options
${IWYU_EXE}
# Suggests the more concise syntax introduced in C++17
-Xiwyu --cxx17ns
# Tells iwyu to always keep these includes
-Xiwyu --keep=**/config.h
)
if (MSVC)
list(APPEND _iwyu_path_and_options --driver-mode=cl)
endif ()
set_target_properties(${_target} PROPERTIES
CXX_INCLUDE_WHAT_YOU_USE "${_iwyu_path_and_options}"
)
endif ()
endmacro()
function(_WEBKIT_TARGET_LINK_FRAMEWORK_INTO target_name framework _public_frameworks_var _private_frameworks_var)
set_property(GLOBAL PROPERTY ${framework}_LINKED_INTO ${target_name})
get_property(_framework_public_frameworks GLOBAL PROPERTY ${framework}_FRAMEWORKS)
foreach (dependency IN LISTS ${_framework_public_frameworks})
set(${_public_frameworks_var} "${${_public_frameworks_var}};${dependency}" PARENT_SCOPE)
endforeach ()
get_property(_framework_private_frameworks GLOBAL PROPERTY ${framework}_PRIVATE_FRAMEWORKS)
foreach (dependency IN LISTS _framework_private_frameworks)
set(${_private_frameworks_var} "${${_private_frameworks_var}};${dependency}" PARENT_SCOPE)
_WEBKIT_TARGET_LINK_FRAMEWORK_INTO(${target_name} ${dependency} ${_public_frameworks_var} ${_private_frameworks_var})
endforeach ()
endfunction()
macro(_WEBKIT_FRAMEWORK_LINK_FRAMEWORK _target_name)
# Set the public libraries before modifying them when determining visibility.
set_property(GLOBAL PROPERTY ${_target_name}_PUBLIC_LIBRARIES ${${_target_name}_LIBRARIES})
set(_public_frameworks)
set(_private_frameworks)
foreach (framework IN LISTS ${_target_name}_FRAMEWORKS)
get_property(_linked_into GLOBAL PROPERTY ${framework}_LINKED_INTO)
if (_linked_into)
list(APPEND _public_frameworks ${_linked_into})
elseif (${framework}_LIBRARY_TYPE STREQUAL "SHARED")
list(APPEND _public_frameworks ${framework})
else ()
list(APPEND _private_frameworks ${framework})
endif ()
endforeach ()
# Recurse into the dependent frameworks
if (_private_frameworks)
list(REMOVE_DUPLICATES _private_frameworks)
endif ()
if (${_target_name}_LIBRARY_TYPE STREQUAL "SHARED")
set_property(GLOBAL PROPERTY ${_target_name}_LINKED_INTO ${_target_name})
foreach (framework IN LISTS _private_frameworks)
_WEBKIT_TARGET_LINK_FRAMEWORK_INTO(${_target_name} ${framework} _public_frameworks _private_frameworks)
endforeach ()
endif ()
# Add to the ${target_name}_LIBRARIES
if (_public_frameworks)
list(REMOVE_DUPLICATES _public_frameworks)
endif ()
foreach (framework IN LISTS _public_frameworks)
# FIXME: https://bugs.webkit.org/show_bug.cgi?id=231774
if (APPLE)
list(APPEND ${_target_name}_PRIVATE_LIBRARIES WebKit::${framework})
else ()
list(APPEND ${_target_name}_LIBRARIES WebKit::${framework})
endif ()
endforeach ()
# Add to the ${target_name}_PRIVATE_LIBRARIES
if (_private_frameworks)
list(REMOVE_DUPLICATES _private_frameworks)
endif ()
foreach (framework IN LISTS _private_frameworks)
if (${_target_name}_LIBRARY_TYPE STREQUAL "SHARED")
get_property(_linked_libraries GLOBAL PROPERTY ${framework}_PUBLIC_LIBRARIES)
list(APPEND ${_target_name}_INTERFACE_LIBRARIES
${_linked_libraries}
)
list(APPEND ${_target_name}_INTERFACE_INCLUDE_DIRECTORIES
${${framework}_FRAMEWORK_HEADERS_DIR}
${${framework}_PRIVATE_FRAMEWORK_HEADERS_DIR}
)
list(APPEND ${_target_name}_PRIVATE_LIBRARIES WebKit::${framework})
if (${framework}_LIBRARY_TYPE STREQUAL "OBJECT")
list(APPEND ${_target_name}_PRIVATE_LIBRARIES $<TARGET_OBJECTS:${framework}>)
if (TARGET ${framework}_c)
list(APPEND ${_target_name}_PRIVATE_LIBRARIES $<TARGET_OBJECTS:${framework}_c>)
endif ()
endif ()
else ()
list(APPEND ${_target_name}_LIBRARIES WebKit::${framework})
endif ()
endforeach ()
set_property(GLOBAL PROPERTY ${_target_name}_FRAMEWORKS ${_public_frameworks})
set_property(GLOBAL PROPERTY ${_target_name}_PRIVATE_FRAMEWORKS ${_private_frameworks})
endmacro()
macro(_WEBKIT_TARGET_LINK_FRAMEWORK _target)
foreach (framework IN LISTS ${_target}_FRAMEWORKS)
get_property(_linked_into GLOBAL PROPERTY ${framework}_LINKED_INTO)
# See if the target is linking a framework that the specified framework is already linked into
if ((NOT _linked_into) OR (${framework} STREQUAL ${_linked_into}) OR (NOT ${_linked_into} IN_LIST ${_target}_FRAMEWORKS))
list(APPEND ${_target}_PRIVATE_LIBRARIES WebKit::${framework})
# The WebKit:: alias targets do not propagate OBJECT libraries so the
# underyling library's objects are explicitly added to link properly
if (TARGET ${framework} AND ${framework}_LIBRARY_TYPE STREQUAL "OBJECT")
list(APPEND ${_target}_PRIVATE_LIBRARIES $<TARGET_OBJECTS:${framework}>)
if (TARGET ${framework}_c)
list(APPEND ${_target}_PRIVATE_LIBRARIES $<TARGET_OBJECTS:${framework}_c>)
endif ()
endif ()
endif ()
endforeach ()
endmacro()
macro(_WEBKIT_LIBRARY_LINK_FRAMEWORK _target)
# See if the library is SHARED and if so just link frameworks the same as executables
if (${_target}_LIBRARY_TYPE STREQUAL SHARED)
_WEBKIT_TARGET_LINK_FRAMEWORK(${_target})
else ()
# Include the framework headers but don't try and link the frameworks
foreach (framework IN LISTS ${_target}_FRAMEWORKS)
list(APPEND ${_target}_INCLUDE_DIRECTORIES
${${framework}_FRAMEWORK_HEADERS_DIR}
${${framework}_PRIVATE_FRAMEWORK_HEADERS_DIR}
)
endforeach ()
endif ()
endmacro()
macro(_WEBKIT_TARGET_INTERFACE _target)
add_library(${_target}_PostBuild INTERFACE)
target_link_libraries(${_target}_PostBuild INTERFACE ${${_target}_INTERFACE_LIBRARIES})
target_include_directories(${_target}_PostBuild INTERFACE ${${_target}_INTERFACE_INCLUDE_DIRECTORIES})
if (${_target}_INTERFACE_DEPENDENCIES)
add_dependencies(${_target}_PostBuild ${${_target}_INTERFACE_DEPENDENCIES})
endif ()
if (NOT ${_target}_LIBRARY_TYPE STREQUAL "SHARED")
target_compile_definitions(${_target}_PostBuild INTERFACE "STATICALLY_LINKED_WITH_${_target}")
endif ()
add_library(WebKit::${_target} ALIAS ${_target}_PostBuild)
endmacro()
macro(WEBKIT_FRAMEWORK _target)
_WEBKIT_FRAMEWORK_LINK_FRAMEWORK(${_target})
_WEBKIT_TARGET(${_target})
_WEBKIT_TARGET_ANALYZE(${_target})
if (${_target}_OUTPUT_NAME)
set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${${_target}_OUTPUT_NAME})
endif ()
if (${_target}_PRE_BUILD_COMMAND)
add_custom_target(_${_target}_PreBuild COMMAND ${${_target}_PRE_BUILD_COMMAND} VERBATIM)
add_dependencies(${_target} _${_target}_PreBuild)
endif ()
if (${_target}_POST_BUILD_COMMAND)
add_custom_command(TARGET ${_target} POST_BUILD COMMAND ${${_target}_POST_BUILD_COMMAND} VERBATIM)
endif ()
if (APPLE AND NOT PORT STREQUAL "GTK" AND NOT ${${_target}_LIBRARY_TYPE} MATCHES STATIC)
set_target_properties(${_target} PROPERTIES FRAMEWORK TRUE)
install(TARGETS ${_target} FRAMEWORK DESTINATION ${LIB_INSTALL_DIR})
endif ()
_WEBKIT_TARGET_INTERFACE(${_target})
endmacro()
macro(WEBKIT_LIBRARY _target)
_WEBKIT_LIBRARY_LINK_FRAMEWORK(${_target})
_WEBKIT_TARGET(${_target})
_WEBKIT_TARGET_ANALYZE(${_target})
if (${_target}_OUTPUT_NAME)
set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${${_target}_OUTPUT_NAME})
endif ()
_WEBKIT_TARGET_INTERFACE(${_target})
endmacro()
macro(WEBKIT_EXECUTABLE _target)
_WEBKIT_TARGET_LINK_FRAMEWORK(${_target})
_WEBKIT_TARGET(${_target})
_WEBKIT_TARGET_ANALYZE(${_target})
if (${_target}_OUTPUT_NAME)
set_target_properties(${_target} PROPERTIES OUTPUT_NAME ${${_target}_OUTPUT_NAME})
endif ()
endmacro()
function(WEBKIT_COPY_FILES target_name)
set(options FLATTENED)
set(oneValueArgs DESTINATION)
set(multiValueArgs FILES)
cmake_parse_arguments(opt "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(files ${opt_FILES})
set(dst_files)
foreach (file IN LISTS files)
if (IS_ABSOLUTE ${file})
set(src_file ${file})
else ()
set(src_file ${CMAKE_CURRENT_SOURCE_DIR}/${file})
endif ()
if (opt_FLATTENED)
get_filename_component(filename ${file} NAME)
set(dst_file ${opt_DESTINATION}/${filename})
else ()
get_filename_component(file_dir ${file} DIRECTORY)
file(MAKE_DIRECTORY ${opt_DESTINATION}/${file_dir})
set(dst_file ${opt_DESTINATION}/${file})
endif ()
add_custom_command(OUTPUT ${dst_file}
COMMAND ${CMAKE_COMMAND} -E copy ${src_file} ${dst_file}
MAIN_DEPENDENCY ${file}
VERBATIM
)
list(APPEND dst_files ${dst_file})
endforeach ()
add_custom_target(${target_name} ALL DEPENDS ${dst_files})
endfunction()
function(WEBKIT_SYMLINK_FILES target_name)
set(options FLATTENED)
set(oneValueArgs DESTINATION)
set(multiValueArgs FILES)
cmake_parse_arguments(opt "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(files ${opt_FILES})
set(dst_files)
file(MAKE_DIRECTORY ${opt_DESTINATION})
foreach (file IN LISTS files)
if (IS_ABSOLUTE ${file})
set(src_file ${file})
else ()
set(src_file ${CMAKE_CURRENT_SOURCE_DIR}/${file})
endif ()
if (opt_FLATTENED)
get_filename_component(filename ${file} NAME)
set(dst_file ${opt_DESTINATION}/${filename})
else ()
get_filename_component(file_dir ${file} DIRECTORY)
file(MAKE_DIRECTORY ${opt_DESTINATION}/${file_dir})
set(dst_file ${opt_DESTINATION}/${file})
endif ()
add_custom_command(OUTPUT ${dst_file}
COMMAND ${CMAKE_COMMAND} -E create_symlink ${src_file} ${dst_file}
MAIN_DEPENDENCY ${file}
VERBATIM
)
list(APPEND dst_files ${dst_file})
endforeach ()
add_custom_target(${target_name} ALL DEPENDS ${dst_files})
endfunction()
# Helper macros for debugging CMake problems.
macro(WEBKIT_DEBUG_DUMP_COMMANDS)
set(CMAKE_VERBOSE_MAKEFILE ON)
endmacro()
macro(WEBKIT_DEBUG_DUMP_VARIABLES)
set_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "${_variableName}=${${_variableName}}")
endforeach ()
endmacro()
# Append the given flag to the target property.
# Builds on top of get_target_property() and set_target_properties()
macro(WEBKIT_ADD_TARGET_PROPERTIES _target _property _flags)
get_target_property(_tmp ${_target} ${_property})
if (NOT _tmp)
set(_tmp "")
endif (NOT _tmp)
foreach (f ${_flags})
set(_tmp "${_tmp} ${f}")
endforeach (f ${_flags})
set_target_properties(${_target} PROPERTIES ${_property} ${_tmp})
unset(_tmp)
endmacro()
macro(WEBKIT_POPULATE_LIBRARY_VERSION library_name)
if (NOT DEFINED ${library_name}_VERSION_MAJOR)
set(${library_name}_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
endif ()
if (NOT DEFINED ${library_name}_VERSION_MINOR)
set(${library_name}_VERSION_MINOR ${PROJECT_VERSION_MINOR})
endif ()
if (NOT DEFINED ${library_name}_VERSION_MICRO)
set(${library_name}_VERSION_MICRO ${PROJECT_VERSION_MICRO})
endif ()
if (NOT DEFINED ${library_name}_VERSION)
set(${library_name}_VERSION ${PROJECT_VERSION})
endif ()
endmacro()
macro(WEBKIT_CREATE_SYMLINK target src dest)
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ln -sf ${src} ${dest}
DEPENDS ${dest}
COMMENT "Create symlink from ${src} to ${dest}")
endmacro()
macro(WEBKIT_SETUP_SWIFT_AND_GENERATE_SWIFT_CPP_INTEROP_HEADER _target _module_name _interop_module_path _output_header)
if (SWIFT_REQUIRED)
set_target_properties(${_target} PROPERTIES Swift_MODULE_NAME ${_module_name})
# Ask swiftc where to find the header files which support C/C++ builds
# Right now this macro is used only once; if it's used more often then
# we should abstract this so it's executed only once.
execute_process(
COMMAND ${ORIGINAL_Swift_COMPILER} -print-target-info
OUTPUT_VARIABLE _swift_target_info
)
string(JSON _swift_target_paths GET ${_swift_target_info} "paths")
string(JSON _swift_runtime_resource_path GET ${_swift_target_paths} "runtimeResourcePath")
target_include_directories(${_target} SYSTEM AFTER PRIVATE "${_swift_runtime_resource_path}")
# Assemble arguments which need to be passed to swiftc.
# Add WebKit's various feature flags as -D directives to the Swift compiler.
GET_WEBKIT_CONFIG_VARIABLES(_swift_definitions)
list(TRANSFORM _swift_definitions PREPEND "-D")
set(_swift_options ${_swift_definitions})
# Other options needed by Swift for C++ interop, including the location
# of the modulemap and hader for WebKit's internal "APIs" which we
# make available from C++ to Swift.
list(APPEND _swift_options "-cxx-interoperability-mode=default" "-Xcc" "-std=c++2b" "-I${_interop_module_path}")
# We'll use these options both for mainstream cmake invocations of swiftc (here)
# and for our own invocation to output an interoperability .h file (later)
list(TRANSFORM _swift_options PREPEND "$<$<COMPILE_LANGUAGE:Swift>:" OUTPUT_VARIABLE _swift_only_options)
list(TRANSFORM _swift_only_options APPEND ">")
target_compile_options(${_target} PRIVATE ${_swift_only_options})
# cmake's Swift interop does not respect CMAKE_SHARED_LINKER_FLAGS, so let's pass
# on those that we can.
# rdar://155519819
string(REPLACE " " ";" CMAKE_SHARED_LINKER_FLAGS_SPLIT "${CMAKE_SHARED_LINKER_FLAGS}")
foreach (_flag IN ITEMS ${CMAKE_SHARED_LINKER_FLAGS_SPLIT})
# We can only pass on -Wl flags.
string(SUBSTRING ${_flag} 0 4 _prefix)
if (${_prefix} STREQUAL "-Wl,")
string(SUBSTRING ${_flag} 4 -1 _shorter_flag)
# The following unfortunately deduplicates the -Xlinker
# target_compile_options(${_target} PUBLIC "$<$<COMPILE_LANGUAGE:Swift>:-Xlinker>")
target_compile_options(${_target} PUBLIC "$<$<COMPILE_LANGUAGE:Swift>:SHELL:-Xlinker ${_shorter_flag}>")
endif ()
endforeach ()
# Generate the header required for C++ to call into Swift.
set(_swift_sources $<TARGET_PROPERTY:${_target},SOURCES>)
set(_swift_sources $<FILTER:${_swift_sources},INCLUDE,\\.swift$>)
cmake_path(APPEND CMAKE_CURRENT_BINARY_DIR include OUTPUT_VARIABLE _header_base_path)
cmake_path(APPEND _header_base_path ${_output_header} OUTPUT_VARIABLE _header_path)
cmake_path(APPEND CMAKE_CURRENT_BINARY_DIR "${_target}.emit-module.d" OUTPUT_VARIABLE _depfile_path)
add_custom_command(
OUTPUT ${_header_path}
DEPENDS ${_swift_sources}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND
${ORIGINAL_Swift_COMPILER} -typecheck
${_swift_options}
$<LIST:TRANSFORM,$<TARGET_PROPERTY:${_target},INCLUDE_DIRECTORIES>,PREPEND,-I>
${_swift_sources}
-module-name WebKit
-emit-clang-header-path ${_header_path}
-emit-dependencies
DEPFILE ${_depfile_path}
COMMENT
"Generating ${_target} C++ bindings to Swift at '${_header_path}'"
COMMAND_EXPAND_LISTS)
target_include_directories(${_target} PUBLIC ${_header_base_path})
target_sources(${_target} PRIVATE ${_header_path})
endif ()
endmacro()