|
1 | 1 |
|
2 | 2 | include(AddSwift)
|
3 | 3 |
|
| 4 | +# Add an executable compiled for a given variant. |
| 5 | +# |
| 6 | +# Don't use directly, use add_swift_executable and add_swift_target_executable |
| 7 | +# instead. |
| 8 | +# |
| 9 | +# See add_swift_executable for detailed documentation. |
| 10 | +# |
| 11 | +# Additional parameters: |
| 12 | +# [SDK sdk] |
| 13 | +# SDK to build for. |
| 14 | +# |
| 15 | +# [ARCHITECTURE architecture] |
| 16 | +# Architecture to build for. |
| 17 | +function(_add_swift_target_executable_single name) |
| 18 | + set(options) |
| 19 | + set(single_parameter_options |
| 20 | + ARCHITECTURE |
| 21 | + SDK) |
| 22 | + set(multiple_parameter_options |
| 23 | + COMPILE_FLAGS |
| 24 | + DEPENDS |
| 25 | + LLVM_LINK_COMPONENTS) |
| 26 | + cmake_parse_arguments(SWIFTEXE_SINGLE |
| 27 | + "${options}" |
| 28 | + "${single_parameter_options}" |
| 29 | + "${multiple_parameter_options}" |
| 30 | + ${ARGN}) |
| 31 | + |
| 32 | + set(SWIFTEXE_SINGLE_SOURCES ${SWIFTEXE_SINGLE_UNPARSED_ARGUMENTS}) |
| 33 | + |
| 34 | + # Check arguments. |
| 35 | + precondition(SWIFTEXE_SINGLE_SDK MESSAGE "Should specify an SDK") |
| 36 | + precondition(SWIFTEXE_SINGLE_ARCHITECTURE MESSAGE "Should specify an architecture") |
| 37 | + |
| 38 | + # Determine compiler flags. |
| 39 | + set(c_compile_flags) |
| 40 | + set(link_flags) |
| 41 | + |
| 42 | + # Prepare linker search directories. |
| 43 | + set(library_search_directories |
| 44 | + "${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}") |
| 45 | + |
| 46 | + # Add variant-specific flags. |
| 47 | + _add_variant_c_compile_flags( |
| 48 | + SDK "${SWIFTEXE_SINGLE_SDK}" |
| 49 | + ARCH "${SWIFTEXE_SINGLE_ARCHITECTURE}" |
| 50 | + BUILD_TYPE "${CMAKE_BUILD_TYPE}" |
| 51 | + ENABLE_ASSERTIONS "${LLVM_ENABLE_ASSERTIONS}" |
| 52 | + ENABLE_LTO "${SWIFT_TOOLS_ENABLE_LTO}" |
| 53 | + ANALYZE_CODE_COVERAGE "${SWIFT_ANALYZE_CODE_COVERAGE}" |
| 54 | + RESULT_VAR_NAME c_compile_flags) |
| 55 | + _add_variant_link_flags( |
| 56 | + SDK "${SWIFTEXE_SINGLE_SDK}" |
| 57 | + ARCH "${SWIFTEXE_SINGLE_ARCHITECTURE}" |
| 58 | + BUILD_TYPE "${CMAKE_BUILD_TYPE}" |
| 59 | + ENABLE_ASSERTIONS "${LLVM_ENABLE_ASSERTIONS}" |
| 60 | + ENABLE_LTO "${SWIFT_TOOLS_ENABLE_LTO}" |
| 61 | + LTO_OBJECT_NAME "${name}-${SWIFTEXE_SINGLE_SDK}-${SWIFTEXE_SINGLE_ARCHITECTURE}" |
| 62 | + ANALYZE_CODE_COVERAGE "${SWIFT_ANALYZE_CODE_COVERAGE}" |
| 63 | + RESULT_VAR_NAME link_flags |
| 64 | + LINK_LIBRARIES_VAR_NAME link_libraries |
| 65 | + LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories) |
| 66 | + |
| 67 | + handle_swift_sources( |
| 68 | + dependency_target |
| 69 | + unused_module_dependency_target |
| 70 | + unused_sib_dependency_target |
| 71 | + unused_sibopt_dependency_target |
| 72 | + unused_sibgen_dependency_target |
| 73 | + SWIFTEXE_SINGLE_SOURCES SWIFTEXE_SINGLE_EXTERNAL_SOURCES ${name} |
| 74 | + DEPENDS |
| 75 | + ${SWIFTEXE_SINGLE_DEPENDS} |
| 76 | + MODULE_NAME ${name} |
| 77 | + SDK ${SWIFTEXE_SINGLE_SDK} |
| 78 | + ARCHITECTURE ${SWIFTEXE_SINGLE_ARCHITECTURE} |
| 79 | + COMPILE_FLAGS ${SWIFTEXE_SINGLE_COMPILE_FLAGS} |
| 80 | + IS_MAIN) |
| 81 | + add_swift_source_group("${SWIFTEXE_SINGLE_EXTERNAL_SOURCES}") |
| 82 | + |
| 83 | + add_executable(${name} |
| 84 | + ${SWIFTEXE_SINGLE_SOURCES} |
| 85 | + ${SWIFTEXE_SINGLE_EXTERNAL_SOURCES}) |
| 86 | + |
| 87 | + add_dependencies_multiple_targets( |
| 88 | + TARGETS "${name}" |
| 89 | + DEPENDS |
| 90 | + ${dependency_target} |
| 91 | + ${LLVM_COMMON_DEPENDS} |
| 92 | + ${SWIFTEXE_SINGLE_DEPENDS}) |
| 93 | + llvm_update_compile_flags("${name}") |
| 94 | + |
| 95 | + if(SWIFTEXE_SINGLE_SDK STREQUAL WINDOWS) |
| 96 | + swift_windows_include_for_arch(${SWIFTEXE_SINGLE_ARCHITECTURE} |
| 97 | + ${SWIFTEXE_SINGLE_ARCHITECTURE}_INCLUDE) |
| 98 | + target_include_directories(${name} SYSTEM PRIVATE |
| 99 | + ${${SWIFTEXE_SINGLE_ARCHITECTURE}_INCLUDE}) |
| 100 | + |
| 101 | + if(NOT ${CMAKE_C_COMPILER_ID} STREQUAL MSVC) |
| 102 | + # MSVC doesn't support -Xclang. We don't need to manually specify |
| 103 | + # the dependent libraries as `cl` does so. |
| 104 | + target_compile_options(${name} PRIVATE |
| 105 | + "SHELL:-Xclang --dependent-lib=oldnames" |
| 106 | + # TODO(compnerd) handle /MT, /MTd |
| 107 | + "SHELL:-Xclang --dependent-lib=msvcrt$<$<CONFIG:Debug>:d>") |
| 108 | + endif() |
| 109 | + endif() |
| 110 | + target_compile_options(${name} PRIVATE |
| 111 | + ${c_compile_flags}) |
| 112 | + target_link_directories(${name} PRIVATE |
| 113 | + ${library_search_directories}) |
| 114 | + target_link_options(${name} PRIVATE |
| 115 | + ${link_flags}) |
| 116 | + target_link_libraries(${name} PRIVATE |
| 117 | + ${link_libraries}) |
| 118 | + if (SWIFT_PARALLEL_LINK_JOBS) |
| 119 | + set_property(TARGET ${name} PROPERTY JOB_POOL_LINK swift_link_job_pool) |
| 120 | + endif() |
| 121 | + if(${SWIFTEXE_SINGLE_SDK} IN_LIST SWIFT_APPLE_PLATFORMS) |
| 122 | + set_target_properties(${name} PROPERTIES |
| 123 | + BUILD_WITH_INSTALL_RPATH YES |
| 124 | + INSTALL_RPATH "@executable_path/../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}") |
| 125 | + endif() |
| 126 | + set_output_directory(${name} |
| 127 | + BINARY_DIR ${SWIFT_RUNTIME_OUTPUT_INTDIR} |
| 128 | + LIBRARY_DIR ${SWIFT_LIBRARY_OUTPUT_INTDIR}) |
| 129 | + |
| 130 | + swift_common_llvm_config("${name}" ${SWIFTEXE_SINGLE_LLVM_LINK_COMPONENTS}) |
| 131 | + |
| 132 | + # NOTE(compnerd) use the C linker language to invoke `clang` rather than |
| 133 | + # `clang++` as we explicitly link against the C++ runtime. We were previously |
| 134 | + # actually passing `-nostdlib++` to avoid the C++ runtime linkage. |
| 135 | + if(${SWIFTEXE_SINGLE_SDK} STREQUAL ANDROID) |
| 136 | + set_property(TARGET "${name}" PROPERTY |
| 137 | + LINKER_LANGUAGE "C") |
| 138 | + else() |
| 139 | + set_property(TARGET "${name}" PROPERTY |
| 140 | + LINKER_LANGUAGE "CXX") |
| 141 | + endif() |
| 142 | + |
| 143 | + set_target_properties(${name} PROPERTIES FOLDER "Swift executables") |
| 144 | +endfunction() |
| 145 | + |
4 | 146 | # Add an executable for each target variant. Executables are given suffixes
|
5 | 147 | # with the variant SDK and ARCH.
|
6 | 148 | #
|
@@ -39,7 +181,7 @@ function(add_swift_target_executable name)
|
39 | 181 | "${SWIFTEXE_TARGET_DEPENDS}"
|
40 | 182 | "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}"
|
41 | 183 | SWIFTEXE_TARGET_DEPENDS_with_suffix)
|
42 |
| - _add_swift_executable_single( |
| 184 | + _add_swift_target_executable_single( |
43 | 185 | ${VARIANT_NAME}
|
44 | 186 | ${SWIFTEXE_TARGET_SOURCES}
|
45 | 187 | DEPENDS ${SWIFTEXE_TARGET_DEPENDS_with_suffix}
|
|
0 commit comments