Skip to content

Commit

Permalink
Merge pull request #29960 from compnerd/add-swift-host-library-single…
Browse files Browse the repository at this point in the history
…-simplifications

`_add_swift_host_library_single` simplifications
  • Loading branch information
gottesmm committed Feb 21, 2020
2 parents fa2ab3b + 4b2cbd6 commit 79716ef
Showing 1 changed file with 55 additions and 103 deletions.
158 changes: 55 additions & 103 deletions cmake/modules/AddSwift.cmake
Expand Up @@ -673,19 +673,12 @@ endfunction()
# Usage:
# _add_swift_host_library_single(
# target
# name
# [SHARED]
# [STATIC]
# [SDK sdk]
# [ARCHITECTURE architecture]
# [LLVM_LINK_COMPONENTS comp1 ...]
# INSTALL_IN_COMPONENT comp
# source1 [source2 source3 ...])
#
# target
# Name of the target (e.g., swiftParse-IOS-armv7).
#
# name
# Name of the library (e.g., swiftParse).
#
# SHARED
Expand All @@ -694,123 +687,91 @@ endfunction()
# STATIC
# Build a static library.
#
# SDK sdk
# SDK to build for.
#
# ARCHITECTURE
# Architecture to build for.
#
# LLVM_LINK_COMPONENTS
# LLVM components this library depends on.
#
# INSTALL_IN_COMPONENT comp
# The Swift installation component that this library belongs to.
#
# source1 ...
# Sources to add into this library
function(_add_swift_host_library_single target name)
set(SWIFTLIB_SINGLE_options
function(_add_swift_host_library_single target)
set(options
SHARED
STATIC)
set(SWIFTLIB_SINGLE_single_parameter_options
ARCHITECTURE
INSTALL_IN_COMPONENT
SDK)
set(SWIFTLIB_SINGLE_multiple_parameter_options
set(single_parameter_options)
set(multiple_parameter_options
GYB_SOURCES
LLVM_LINK_COMPONENTS)

cmake_parse_arguments(SWIFTLIB_SINGLE
"${SWIFTLIB_SINGLE_options}"
"${SWIFTLIB_SINGLE_single_parameter_options}"
"${SWIFTLIB_SINGLE_multiple_parameter_options}"
cmake_parse_arguments(ASHLS
"${options}"
"${single_parameter_options}"
"${multiple_parameter_options}"
${ARGN})
set(ASHLS_SOURCES ${ASHLS_UNPARSED_ARGUMENTS})

set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_UNPARSED_ARGUMENTS})

translate_flags(SWIFTLIB_SINGLE "${SWIFTLIB_SINGLE_options}")

# Check arguments.
precondition(SWIFTLIB_SINGLE_SDK MESSAGE "Should specify an SDK")
precondition(SWIFTLIB_SINGLE_ARCHITECTURE MESSAGE "Should specify an architecture")
precondition(SWIFTLIB_SINGLE_INSTALL_IN_COMPONENT MESSAGE "INSTALL_IN_COMPONENT is required")
translate_flags(ASHLS "${options}")

if(NOT SWIFTLIB_SINGLE_SHARED AND NOT SWIFTLIB_SINGLE_STATIC)
if(NOT ASHLS_SHARED AND NOT ASHLS_STATIC)
message(FATAL_ERROR "Either SHARED or STATIC must be specified")
endif()

# Determine the subdirectory where this library will be installed.
set(SWIFTLIB_SINGLE_SUBDIR
"${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}/${SWIFTLIB_SINGLE_ARCHITECTURE}")
set(ASHLS_SUBDIR
"${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}/${SWIFT_HOST_VARIANT_ARCH}")

# Include LLVM Bitcode slices for iOS, Watch OS, and Apple TV OS device libraries.
set(embed_bitcode_arg)
if(SWIFT_EMBED_BITCODE_SECTION)
if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "IOS" OR "${SWIFTLIB_SINGLE_SDK}" STREQUAL "TVOS" OR "${SWIFTLIB_SINGLE_SDK}" STREQUAL "WATCHOS")
list(APPEND SWIFTLIB_SINGLE_C_COMPILE_FLAGS "-fembed-bitcode")
if(SWIFT_HOST_VARIANT_SDK MATCHES "(I|TV|WATCH)OS")
list(APPEND ASHLS_C_COMPILE_FLAGS "-fembed-bitcode")
set(embed_bitcode_arg EMBED_BITCODE)
endif()
endif()

if(XCODE)
string(REGEX MATCHALL "/[^/]+" split_path ${CMAKE_CURRENT_SOURCE_DIR})
list(GET split_path -1 dir)
file(GLOB_RECURSE SWIFTLIB_SINGLE_HEADERS
file(GLOB_RECURSE ASHLS_HEADERS
${SWIFT_SOURCE_DIR}/include/swift${dir}/*.h
${SWIFT_SOURCE_DIR}/include/swift${dir}/*.def
${CMAKE_CURRENT_SOURCE_DIR}/*.def)

file(GLOB_RECURSE SWIFTLIB_SINGLE_TDS
file(GLOB_RECURSE ASHLS_TDS
${SWIFT_SOURCE_DIR}/include/swift${dir}/*.td)

set_source_files_properties(${SWIFTLIB_SINGLE_HEADERS} ${SWIFTLIB_SINGLE_TDS}
set_source_files_properties(${ASHLS_HEADERS} ${ASHLS_TDS}
PROPERTIES
HEADER_FILE_ONLY true)
source_group("TableGen descriptions" FILES ${SWIFTLIB_SINGLE_TDS})
source_group("TableGen descriptions" FILES ${ASHLS_TDS})

set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_SOURCES} ${SWIFTLIB_SINGLE_HEADERS} ${SWIFTLIB_SINGLE_TDS})
set(ASHLS_SOURCES ${ASHLS_SOURCES} ${ASHLS_HEADERS} ${ASHLS_TDS})
endif()

if(SWIFTLIB_SINGLE_SHARED)
if(ASHLS_SHARED)
set(libkind SHARED)
elseif(SWIFTLIB_SINGLE_STATIC)
elseif(ASHLS_STATIC)
set(libkind STATIC)
endif()

if(SWIFTLIB_SINGLE_GYB_SOURCES)
if(ASHLS_GYB_SOURCES)
handle_gyb_sources(
gyb_dependency_targets
SWIFTLIB_SINGLE_GYB_SOURCES
"${SWIFTLIB_SINGLE_ARCHITECTURE}")
set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_SOURCES}
${SWIFTLIB_SINGLE_GYB_SOURCES})
ASHLS_GYB_SOURCES
"${SWIFT_HOST_VARIANT_ARCH}")
set(ASHLS_SOURCES ${ASHLS_SOURCES} ${ASHLS_GYB_SOURCES})
endif()

add_library("${target}" ${libkind}
${SWIFTLIB_SINGLE_SOURCES})
_set_target_prefix_and_suffix("${target}" "${libkind}" "${SWIFTLIB_SINGLE_SDK}")
add_library("${target}" ${libkind} ${ASHLS_SOURCES})
_set_target_prefix_and_suffix("${target}" "${libkind}" "${SWIFT_HOST_VARIANT_SDK}")

if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "WINDOWS")
swift_windows_include_for_arch(${SWIFTLIB_SINGLE_ARCHITECTURE} SWIFTLIB_INCLUDE)
if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "WINDOWS")
swift_windows_include_for_arch(${SWIFT_HOST_VARIANT_ARCH} SWIFTLIB_INCLUDE)
target_include_directories("${target}" SYSTEM PRIVATE ${SWIFTLIB_INCLUDE})
set_target_properties(${target}
PROPERTIES
CXX_STANDARD 14)
endif()

if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "WINDOWS" AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
if("${libkind}" STREQUAL "SHARED")
# Each dll has an associated .lib (import library); since we may be
# building on a non-DLL platform (not windows), create an imported target
# for the library which created implicitly by the dll.
add_custom_command_target(${target}_IMPORT_LIBRARY
OUTPUT "${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}/${name}.lib"
DEPENDS "${target}")
add_library(${target}_IMPLIB SHARED IMPORTED GLOBAL)
set_property(TARGET "${target}_IMPLIB" PROPERTY
IMPORTED_LOCATION "${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}/${name}.lib")
add_dependencies(${target}_IMPLIB ${${target}_IMPORT_LIBRARY})
endif()
if(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
set_property(TARGET "${target}" PROPERTY NO_SONAME ON)
endif()

Expand All @@ -820,19 +781,19 @@ function(_add_swift_host_library_single target name)
BINARY_DIR ${SWIFT_RUNTIME_OUTPUT_INTDIR}
LIBRARY_DIR ${SWIFT_LIBRARY_OUTPUT_INTDIR})

if(SWIFTLIB_SINGLE_SDK IN_LIST SWIFT_APPLE_PLATFORMS)
if(SWIFT_HOST_VARIANT_SDK IN_LIST SWIFT_APPLE_PLATFORMS)
set_target_properties("${target}"
PROPERTIES
INSTALL_NAME_DIR "@rpath")
elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX")
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
set_target_properties("${target}"
PROPERTIES
INSTALL_RPATH "$ORIGIN:/usr/lib/swift/linux")
elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "CYGWIN")
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "CYGWIN")
set_target_properties("${target}"
PROPERTIES
INSTALL_RPATH "$ORIGIN:/usr/lib/swift/cygwin")
elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "ANDROID")
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "ANDROID")
# Only set the install RPATH if cross-compiling the host tools, in which
# case both the NDK and Sysroot paths must be set.
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "" AND
Expand All @@ -846,11 +807,6 @@ function(_add_swift_host_library_single target name)
set_target_properties("${target}" PROPERTIES BUILD_WITH_INSTALL_RPATH YES)
set_target_properties("${target}" PROPERTIES FOLDER "Swift libraries")

set_target_properties(${target}
PROPERTIES
# Library name (without the variant information)
OUTPUT_NAME ${name})

# Handle linking and dependencies.
add_dependencies_multiple_targets(
TARGETS "${target}"
Expand All @@ -859,18 +815,18 @@ function(_add_swift_host_library_single target name)
${LLVM_COMMON_DEPENDS})

# Call llvm_config() only for libraries that are part of the compiler.
swift_common_llvm_config("${target}" ${SWIFTLIB_SINGLE_LLVM_LINK_COMPONENTS})
swift_common_llvm_config("${target}" ${ASHLS_LLVM_LINK_COMPONENTS})

# Collect compile and link flags for the static and non-static targets.
# Don't set PROPERTY COMPILE_FLAGS or LINK_FLAGS directly.
set(c_compile_flags ${SWIFTLIB_SINGLE_C_COMPILE_FLAGS})
set(c_compile_flags ${ASHLS_C_COMPILE_FLAGS})
set(link_flags)

set(library_search_subdir "${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
set(library_search_subdir "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")
set(library_search_directories
"${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}"
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFTLIB_SINGLE_SUBDIR}"
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}")
"${SWIFTLIB_DIR}/${ASHLS_SUBDIR}"
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${ASHLS_SUBDIR}"
"${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/../lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}")

# In certain cases when building, the environment variable SDKROOT is set to override
# where the sdk root is located in the system. If that environment variable has been
Expand All @@ -881,43 +837,43 @@ function(_add_swift_host_library_single target name)
endif()

_add_variant_c_compile_flags(
SDK "${SWIFTLIB_SINGLE_SDK}"
ARCH "${SWIFTLIB_SINGLE_ARCHITECTURE}"
SDK "${SWIFT_HOST_VARIANT_SDK}"
ARCH "${SWIFT_HOST_VARIANT_ARCH}"
BUILD_TYPE ${CMAKE_BUILD_TYPE}
ENABLE_ASSERTIONS ${LLVM_ENABLE_ASSERTIONS}
ANALYZE_CODE_COVERAGE ${SWIFT_ANALYZE_CODE_COVERAGE}
ENABLE_LTO ${SWIFT_TOOLS_ENABLE_LTO}
RESULT_VAR_NAME c_compile_flags
)

if(SWIFTLIB_SINGLE_SDK STREQUAL WINDOWS)
if(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
if(libkind STREQUAL SHARED)
list(APPEND c_compile_flags -D_WINDLL)
endif()
endif()
_add_variant_link_flags(
SDK "${SWIFTLIB_SINGLE_SDK}"
ARCH "${SWIFTLIB_SINGLE_ARCHITECTURE}"
SDK "${SWIFT_HOST_VARIANT_SDK}"
ARCH "${SWIFT_HOST_VARIANT_ARCH}"
BUILD_TYPE ${CMAKE_BUILD_TYPE}
ENABLE_ASSERTIONS ${LLVM_ENABLE_ASSERTIONS}
ANALYZE_CODE_COVERAGE ${SWIFT_ANALYZE_CODE_COVERAGE}
ENABLE_LTO ${SWIFT_TOOLS_ENABLE_LTO}
LTO_OBJECT_NAME "${target}-${SWIFTLIB_SINGLE_SDK}-${SWIFTLIB_SINGLE_ARCHITECTURE}"
LTO_OBJECT_NAME "${target}-${SWIFT_HOST_VARIANT_SDK}-${SWIFT_HOST_VARIANT_ARCH}"
RESULT_VAR_NAME link_flags
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories
)

# Set compilation and link flags.
if(SWIFTLIB_SINGLE_SDK STREQUAL WINDOWS)
swift_windows_include_for_arch(${SWIFTLIB_SINGLE_ARCHITECTURE}
${SWIFTLIB_SINGLE_ARCHITECTURE}_INCLUDE)
if(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
swift_windows_include_for_arch(${SWIFT_HOST_VARIANT_ARCH}
${SWIFT_HOST_VARIANT_ARCH}_INCLUDE)
target_include_directories(${target} SYSTEM PRIVATE
${${SWIFTLIB_SINGLE_ARCHITECTURE}_INCLUDE})
${${SWIFT_HOST_VARIANT_ARCH}_INCLUDE})

if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
swift_windows_get_sdk_vfs_overlay(SWIFTLIB_SINGLE_VFS_OVERLAY)
swift_windows_get_sdk_vfs_overlay(ASHLS_VFS_OVERLAY)
target_compile_options(${target} PRIVATE
"SHELL:-Xclang -ivfsoverlay -Xclang ${SWIFTLIB_SINGLE_VFS_OVERLAY}")
"SHELL:-Xclang -ivfsoverlay -Xclang ${ASHLS_VFS_OVERLAY}")

# MSVC doesn't support -Xclang. We don't need to manually specify
# the dependent libraries as `cl` does so.
Expand All @@ -932,7 +888,7 @@ function(_add_swift_host_library_single target name)
${c_compile_flags})
target_link_options(${target} PRIVATE
${link_flags})
if(${SWIFTLIB_SINGLE_SDK} IN_LIST SWIFT_APPLE_PLATFORMS)
if(${SWIFT_HOST_VARIANT_SDK} IN_LIST SWIFT_APPLE_PLATFORMS)
target_link_options(${target} PRIVATE
"LINKER:-compatibility_version,1")
if(SWIFT_COMPILER_VERSION)
Expand All @@ -941,7 +897,7 @@ function(_add_swift_host_library_single target name)
endif()
# Include LLVM Bitcode slices for iOS, Watch OS, and Apple TV OS device libraries.
if(SWIFT_EMBED_BITCODE_SECTION)
if(${SWIFTLIB_SINGLE_SDK} MATCHES "(I|TV|WATCH)OS")
if(${SWIFT_HOST_VARIANT_SDK} MATCHES "(I|TV|WATCH)OS")
# The two branches of this if statement accomplish the same end result
# We are simply accounting for the fact that on CMake < 3.16
# using a generator expression to
Expand Down Expand Up @@ -1019,15 +975,11 @@ function(add_swift_host_library name)
endif()

_add_swift_host_library_single(
${name}
${name}
${ASHL_SHARED_keyword}
${ASHL_STATIC_keyword}
${ASHL_SOURCES}
SDK ${SWIFT_HOST_VARIANT_SDK}
ARCHITECTURE ${SWIFT_HOST_VARIANT_ARCH}
LLVM_LINK_COMPONENTS ${ASHL_LLVM_LINK_COMPONENTS}
INSTALL_IN_COMPONENT "dev"
)

add_dependencies(dev ${name})
Expand Down

0 comments on commit 79716ef

Please sign in to comment.