Skip to content

Commit 9e3c89d

Browse files
authored
Merge pull request #63978 from al45tair/backtracing/add-libexec-2
[Backtracing] Add support for building target executables into libexec.
2 parents 2108674 + 60ededb commit 9e3c89d

File tree

2 files changed

+274
-16
lines changed

2 files changed

+274
-16
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ set(SWIFTLIB_DIR
4949
set(SWIFTSTATICLIB_DIR
5050
"${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib/swift_static")
5151

52+
# SWIFTLIBEXEC_DIR is the directory in the build tree where Swift auxiliary
53+
# executables should be placed.
54+
set(SWIFTLIBEXEC_DIR
55+
"${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libexec/swift")
56+
5257
function(_compute_lto_flag option out_var)
5358
string(TOLOWER "${option}" lowercase_option)
5459
if (lowercase_option STREQUAL "full")

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 269 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,11 @@ function(_add_target_variant_c_compile_flags)
156156

157157
set(result ${${CFLAGS_RESULT_VAR_NAME}})
158158

159-
list(APPEND result "-DSWIFT_RUNTIME")
159+
list(APPEND result
160+
"-DSWIFT_RUNTIME"
161+
"-DSWIFT_LIB_SUBDIR=\"${SWIFT_SDK_${CFLAGS_SDK}_LIB_SUBDIR}\""
162+
"-DSWIFT_ARCH=\"${CFLAGS_ARCH}\""
163+
)
160164

161165
if ("${CFLAGS_ARCH}" STREQUAL "arm64" OR
162166
"${CFLAGS_ARCH}" STREQUAL "arm64_32")
@@ -2506,11 +2510,16 @@ endfunction()
25062510
#
25072511
# [ARCHITECTURE architecture]
25082512
# Architecture to build for.
2513+
#
2514+
# [INSTALL_IN_COMPONENT component]
2515+
# The Swift installation component that this executable belongs to.
2516+
# Defaults to never_install.
25092517
function(_add_swift_target_executable_single name)
25102518
set(options)
25112519
set(single_parameter_options
25122520
ARCHITECTURE
2513-
SDK)
2521+
SDK
2522+
INSTALL_IN_COMPONENT)
25142523
set(multiple_parameter_options
25152524
COMPILE_FLAGS
25162525
DEPENDS)
@@ -2555,6 +2564,8 @@ function(_add_swift_target_executable_single name)
25552564
LINK_LIBRARIES_VAR_NAME link_libraries
25562565
LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories)
25572566

2567+
string(MAKE_C_IDENTIFIER "${name}" module_name)
2568+
25582569
handle_swift_sources(
25592570
dependency_target
25602571
unused_module_dependency_target
@@ -2564,11 +2575,12 @@ function(_add_swift_target_executable_single name)
25642575
SWIFTEXE_SINGLE_SOURCES SWIFTEXE_SINGLE_EXTERNAL_SOURCES ${name}
25652576
DEPENDS
25662577
${SWIFTEXE_SINGLE_DEPENDS}
2567-
MODULE_NAME ${name}
2578+
MODULE_NAME ${module_name}
25682579
SDK ${SWIFTEXE_SINGLE_SDK}
25692580
ARCHITECTURE ${SWIFTEXE_SINGLE_ARCHITECTURE}
25702581
COMPILE_FLAGS ${SWIFTEXE_SINGLE_COMPILE_FLAGS}
25712582
ENABLE_LTO "${SWIFT_STDLIB_ENABLE_LTO}"
2583+
INSTALL_IN_COMPONENT "${install_in_component}"
25722584
IS_MAIN)
25732585
add_swift_source_group("${SWIFTEXE_SINGLE_EXTERNAL_SOURCES}")
25742586

@@ -2613,7 +2625,7 @@ function(_add_swift_target_executable_single name)
26132625
if(${SWIFTEXE_SINGLE_SDK} IN_LIST SWIFT_DARWIN_PLATFORMS)
26142626
set_target_properties(${name} PROPERTIES
26152627
BUILD_WITH_INSTALL_RPATH YES
2616-
INSTALL_RPATH "@executable_path/../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}")
2628+
INSTALL_RPATH "@executable_path/../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR};@executable_path/../../../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}")
26172629
endif()
26182630
set_output_directory(${name}
26192631
BINARY_DIR ${SWIFT_RUNTIME_OUTPUT_INTDIR}
@@ -2638,11 +2650,37 @@ endfunction()
26382650
#
26392651
# See add_swift_executable for detailed documentation.
26402652
function(add_swift_target_executable name)
2653+
set(SWIFTEXE_options
2654+
EXCLUDE_FROM_ALL
2655+
BUILD_WITH_STDLIB)
2656+
set(SWIFTEXE_single_parameter_options
2657+
INSTALL_IN_COMPONENT)
2658+
set(SWIFTEXE_multiple_parameter_options
2659+
DEPENDS
2660+
LINK_LIBRARIES
2661+
SWIFT_MODULE_DEPENDS
2662+
SWIFT_MODULE_DEPENDS_CYGWIN
2663+
SWIFT_MODULE_DEPENDS_FREEBSD
2664+
SWIFT_MODULE_DEPENDS_FREESTANDING
2665+
SWIFT_MODULE_DEPENDS_OPENBSD
2666+
SWIFT_MODULE_DEPENDS_HAIKU
2667+
SWIFT_MODULE_DEPENDS_IOS
2668+
SWIFT_MODULE_DEPENDS_LINUX
2669+
SWIFT_MODULE_DEPENDS_OSX
2670+
SWIFT_MODULE_DEPENDS_TVOS
2671+
SWIFT_MODULE_DEPENDS_WASI
2672+
SWIFT_MODULE_DEPENDS_WATCHOS
2673+
SWIFT_MODULE_DEPENDS_WINDOWS
2674+
SWIFT_MODULE_DEPENDS_FROM_SDK
2675+
SWIFT_MODULE_DEPENDS_MACCATALYST
2676+
SWIFT_MODULE_DEPENDS_MACCATALYST_UNZIPPERED
2677+
)
2678+
26412679
# Parse the arguments we were given.
26422680
cmake_parse_arguments(SWIFTEXE_TARGET
2643-
"EXCLUDE_FROM_ALL;;BUILD_WITH_STDLIB"
2644-
""
2645-
"DEPENDS;LINK_LIBRARIES"
2681+
"${SWIFTEXE_options}"
2682+
"${SWIFTEXE_single_parameter_options}"
2683+
"${SWIFTEXE_multiple_parameter_options}"
26462684
${ARGN})
26472685

26482686
set(SWIFTEXE_TARGET_SOURCES ${SWIFTEXE_TARGET_UNPARSED_ARGUMENTS})
@@ -2651,39 +2689,158 @@ function(add_swift_target_executable name)
26512689
message(SEND_ERROR "${name} is using EXCLUDE_FROM_ALL which is deprecated.")
26522690
endif()
26532691

2692+
if("${SWIFTEXE_TARGET_INSTALL_IN_COMPONENT}" STREQUAL "")
2693+
set(install_in_component "never_install")
2694+
else()
2695+
set(install_in_component "${SWIFTEXE_TARGET_INSTALL_IN_COMPONENT}")
2696+
endif()
2697+
26542698
# All Swift executables depend on the standard library.
2655-
list(APPEND SWIFTEXE_TARGET_LINK_LIBRARIES swiftCore)
2699+
list(APPEND SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS Core)
26562700
# All Swift executables depend on the swiftSwiftOnoneSupport library.
2657-
list(APPEND SWIFTEXE_TARGET_DEPENDS swiftSwiftOnoneSupport)
2701+
list(APPEND SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS SwiftOnoneSupport)
26582702

26592703
foreach(sdk ${SWIFT_SDKS})
2704+
set(THIN_INPUT_TARGETS)
2705+
2706+
# Collect architecture agnostic SDK module dependencies
2707+
set(swiftexe_module_depends_flattened ${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS})
2708+
if(${sdk} STREQUAL OSX)
2709+
if(DEFINED maccatalyst_build_flavor AND NOT maccatalyst_build_flavor STREQUAL "macos-like")
2710+
list(APPEND swiftexe_module_depends_flattened
2711+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_MACCATALYST})
2712+
list(APPEND swiftexe_module_depends_flattened
2713+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_MACCATALYST_UNZIPPERED})
2714+
else()
2715+
list(APPEND swiftexe_module_depends_flattened
2716+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_OSX})
2717+
endif()
2718+
list(APPEND swiftexe_module_depends_flattened
2719+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_OSX})
2720+
elseif(${sdk} STREQUAL IOS OR ${sdk} STREQUAL IOS_SIMULATOR)
2721+
list(APPEND swiftexe_module_depends_flattened
2722+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_IOS})
2723+
elseif(${sdk} STREQUAL TVOS OR ${sdk} STREQUAL TVOS_SIMULATOR)
2724+
list(APPEND swiftexe_module_depends_flattened
2725+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_TVOS})
2726+
elseif(${sdk} STREQUAL WATCHOS OR ${sdk} STREQUAL WATCHOS_SIMULATOR)
2727+
list(APPEND swiftexe_module_depends_flattened
2728+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_WATCHOS})
2729+
elseif(${sdk} STREQUAL FREESTANDING)
2730+
list(APPEND swiftexe_module_depends_flattened
2731+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_FREESTANDING})
2732+
elseif(${sdk} STREQUAL FREEBSD)
2733+
list(APPEND swiftexe_module_depends_flattened
2734+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_FREEBSD})
2735+
elseif(${sdk} STREQUAL OPENBSD)
2736+
list(APPEND swiftexe_module_depends_flattened
2737+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_OPENBSD})
2738+
elseif(${sdk} STREQUAL LINUX OR ${sdk} STREQUAL ANDROID)
2739+
list(APPEND swiftexe_module_depends_flattened
2740+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX})
2741+
elseif(${sdk} STREQUAL CYGWIN)
2742+
list(APPEND swiftexe_module_depends_flattened
2743+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_CYGWIN})
2744+
elseif(${sdk} STREQUAL HAIKU)
2745+
list(APPEND swiftexe_module_depends_flattened
2746+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_HAIKU})
2747+
elseif(${sdk} STREQUAL WASI)
2748+
list(APPEND swiftexe_module_depends_flattened
2749+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_WASI})
2750+
elseif(${sdk} STREQUAL WINDOWS)
2751+
list(APPEND swiftexe_module_depends_flattened
2752+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_WINDOWS})
2753+
endif()
2754+
26602755
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
26612756
set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
26622757
set(VARIANT_NAME "${name}${VARIANT_SUFFIX}")
2758+
set(MODULE_VARIANT_SUFFIX "-swiftmodule${VARIANT_SUFFIX}")
2759+
set(MODULE_VARIANT_NAME "${name}${MODULE_VARIANT_SUFFIX}")
2760+
2761+
# Configure macCatalyst flavor variables
2762+
if(DEFINED maccatalyst_build_flavor)
2763+
set(maccatalyst_variant_suffix "-${SWIFT_SDK_MACCATALYST_LIB_SUBDIR}-${arch}")
2764+
set(maccatalyst_variant_name "${name}${maccatalyst_variant_suffix}")
26632765

2664-
if(SWIFTEXE_TARGET_BUILD_WITH_STDLIB)
2665-
add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}" ${VARIANT_NAME})
2766+
set(maccatalyst_module_variant_suffix "-swiftmodule${maccatalyst_variant_suffix}")
2767+
set(maccatalyst_module_variant_name "${name}${maccatalyst_module_variant_suffix}")
26662768
endif()
26672769

2770+
# Swift compiles depend on swift modules, while links depend on
2771+
# linked libraries. Find targets for both of these here.
2772+
set(swiftexe_module_dependency_targets)
2773+
set(swiftexe_link_libraries_targets ${SWIFTEXE_TARGET_LINK_LIBRARIES})
2774+
foreach(mod ${swiftexe_module_depends_flattened})
2775+
if(DEFINED maccatalyst_build_flavor)
2776+
if(maccatalyst_build_flavor STREQUAL "zippered")
2777+
# Zippered libraries are dependent on both the macCatalyst and normal macOS
2778+
# modules of their dependencies (which themselves must be zippered).
2779+
list(APPEND swiftexe_module_dependency_targets
2780+
"swift${mod}${maccatalyst_module_variant_suffix}")
2781+
list(APPEND swiftexe_module_dependency_targets
2782+
"swift${mod}${MODULE_VARIANT_SUFFIX}")
2783+
2784+
# Zippered libraries link against their zippered library targets, which
2785+
# live (and are built in) the same location as normal macOS libraries.
2786+
list(APPEND swiftexe_link_libraries_targets
2787+
"swift${mod}${VARIANT_SUFFIX}")
2788+
elseif(maccatalyst_build_flavor STREQUAL "ios-like")
2789+
# iOS-like libraries depend on the macCatalyst modules of their dependencies
2790+
# regardless of whether the target is zippered or macCatalyst only.
2791+
list(APPEND swiftexe_module_dependency_targets
2792+
"swift${mod}${maccatalyst_module_variant_suffix}")
2793+
2794+
# iOS-like libraries can link against either iOS-like library targets
2795+
# or zippered targets.
2796+
if(mod IN_LIST SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_MACCATALYST_UNZIPPERED)
2797+
list(APPEND swiftexe_link_libraries_targets
2798+
"swift${mod}${maccatalyst_variant_suffix}")
2799+
else()
2800+
list(APPEND swiftexe_link_libraries_targets
2801+
"swift${mod}${VARIANT_SUFFIX}")
2802+
endif()
2803+
else()
2804+
list(APPEND swiftexe_module_dependency_targets
2805+
"swift${mod}${MODULE_VARIANT_SUFFIX}")
2806+
2807+
list(APPEND swiftexe_link_libraries_targets
2808+
"swift${mod}${VARIANT_SUFFIX}")
2809+
endif()
2810+
continue()
2811+
endif()
2812+
2813+
list(APPEND swiftexe_module_dependency_targets
2814+
"swift${mod}${MODULE_VARIANT_SUFFIX}")
2815+
2816+
list(APPEND swiftexe_link_libraries_targets
2817+
"swift${mod}${VARIANT_SUFFIX}")
2818+
endforeach()
2819+
26682820
# Don't add the ${arch} to the suffix. We want to link against fat
26692821
# libraries.
26702822
_list_add_string_suffix(
26712823
"${SWIFTEXE_TARGET_DEPENDS}"
26722824
"-${SWIFT_SDK_${sdk}_LIB_SUBDIR}"
26732825
SWIFTEXE_TARGET_DEPENDS_with_suffix)
2826+
26742827
_add_swift_target_executable_single(
26752828
${VARIANT_NAME}
26762829
${SWIFTEXE_TARGET_SOURCES}
2677-
DEPENDS ${SWIFTEXE_TARGET_DEPENDS_with_suffix}
2830+
DEPENDS
2831+
${SWIFTEXE_TARGET_DEPENDS_with_suffix}
2832+
${swiftexe_module_dependency_targets}
26782833
SDK "${sdk}"
2679-
ARCHITECTURE "${arch}")
2834+
ARCHITECTURE "${arch}"
2835+
INSTALL_IN_COMPONENT ${install_in_component})
26802836

26812837
_list_add_string_suffix(
26822838
"${SWIFTEXE_TARGET_LINK_LIBRARIES}"
26832839
"-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}"
26842840
SWIFTEXE_TARGET_LINK_LIBRARIES_TARGETS)
26852841
target_link_libraries(${VARIANT_NAME} PRIVATE
2686-
${SWIFTEXE_TARGET_LINK_LIBRARIES_TARGETS})
2842+
${SWIFTEXE_TARGET_LINK_LIBRARIES_TARGETS}
2843+
${swiftexe_link_libraries_targets})
26872844

26882845
if(NOT "${VARIANT_SUFFIX}" STREQUAL "${SWIFT_PRIMARY_VARIANT_SUFFIX}")
26892846
# By default, don't build executables for target SDKs to avoid building
@@ -2703,8 +2860,104 @@ function(add_swift_target_executable name)
27032860

27042861
add_custom_command(TARGET ${VARIANT_NAME}
27052862
POST_BUILD
2706-
COMMAND "codesign" "-f" "-s" "-" "${SWIFT_RUNTIME_OUTPUT_INTDIR}/${VARIANT_NAME}")
2707-
endif()
2863+
COMMAND "codesign" "-f" "-s" "-" "${SWIFT_RUNTIME_OUTPUT_INTDIR}/${VARIANT_NAME}")
2864+
endif()
2865+
2866+
list(APPEND THIN_INPUT_TARGETS ${VARIANT_NAME})
27082867
endforeach()
2868+
2869+
set(library_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
2870+
if(maccatalyst_build_flavor STREQUAL "ios-like")
2871+
set(library_subdir "${SWIFT_SDK_MACCATALYST_LIB_SUBDIR}")
2872+
endif()
2873+
2874+
if("${sdk}" STREQUAL "WINDOWS")
2875+
set(UNIVERSAL_NAME "${SWIFTLIBEXEC_DIR}/${library_subdir}/${name}.exe")
2876+
else()
2877+
set(UNIVERSAL_NAME "${SWIFTLIBEXEC_DIR}/${library_subdir}/${name}")
2878+
endif()
2879+
2880+
set(lipo_target "${name}-${sdk}")
2881+
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
2882+
set(codesign_arg CODESIGN)
2883+
endif()
2884+
precondition(THIN_INPUT_TARGETS)
2885+
_add_swift_lipo_target(SDK
2886+
${sdk}
2887+
TARGET
2888+
${lipo_target}
2889+
OUTPUT
2890+
${UNIVERSAL_NAME}
2891+
${codesign_arg}
2892+
${THIN_INPUT_TARGETS})
2893+
2894+
# Determine the subdirectory where this executable will be installed
2895+
set(resource_dir_sdk_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}")
2896+
if(maccatalyst_build_flavor STREQUAL "ios-like")
2897+
set(resource_dir_sdk_subdir "${SWIFT_SDK_MACCATALYST_LIB_SUBDIR}")
2898+
endif()
2899+
2900+
precondition(resource_dir_sdk_subdir)
2901+
2902+
if(sdk STREQUAL WINDOWS AND CMAKE_SYSTEM_NAME STREQUAL Windows)
2903+
add_dependencies(${install_in_component} ${name}-windows-${SWIFT_PRIMARY_VARIANT_ARCH})
2904+
swift_install_in_component(TARGETS ${name}-windows-${SWIFT_PRIMARY_VARIANT_ARCH}
2905+
RUNTIME
2906+
DESTINATION "bin"
2907+
COMPONENT "${install_in_component}"
2908+
LIBRARY
2909+
DESTINATION "libexec${LLVM_LIBDIR_SUFFIX}/swift/${resource_dir_sdk_subdir}/${SWIFT_PRIMARY_VARIANT_ARCH}"
2910+
COMPONENT "${install_in_component}"
2911+
ARCHIVE
2912+
DESTINATION "libexec${LLVM_LIBDIR_SUFFIX}/swift/${resource_dir_sdk_subdir}/${SWIFT_PRIMARY_VARIANT_ARCH}"
2913+
COMPONENT "${install_in_component}"
2914+
PERMISSIONS
2915+
OWNER_READ OWNER_WRITE OWNER_EXECUTE
2916+
GROUP_READ GROUP_EXECUTE
2917+
WORLD_READ WORLD_EXECUTE)
2918+
else()
2919+
add_dependencies(${install_in_component} ${lipo_target})
2920+
2921+
set(install_dest "libexec${LLVM_LIBDIR_SUFFIX}/swift/${resource_dir_sdk_subdir}")
2922+
swift_install_in_component(FILES "${UNIVERSAL_LIBRARY_NAME}"
2923+
DESTINATION ${install_dest}
2924+
COMPONENT "${install_in_component}"
2925+
PERMISSIONS
2926+
OWNER_READ OWNER_WRITE OWNER_EXECUTE
2927+
GROUP_READ GROUP_EXECUTE
2928+
WORLD_READ WORLD_EXECUTE
2929+
"${optional_arg}")
2930+
endif()
2931+
2932+
swift_is_installing_component(
2933+
"${install_in_component}"
2934+
is_installing)
2935+
2936+
# Add the arch-specific executable targets to the global exports
2937+
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
2938+
set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
2939+
set(VARIANT_NAME "${name}${VARIANT_SUFFIX}")
2940+
2941+
if(is_installing)
2942+
set_property(GLOBAL APPEND
2943+
PROPERTY SWIFT_EXPORTS ${VARIANT_NAME})
2944+
else()
2945+
set_property(GLOBAL APPEND
2946+
PROPERTY SWIFT_BUILDTREE_EXPORTS ${VARIANT_NAME})
2947+
endif()
2948+
endforeach()
2949+
2950+
# Add the lipo target to the top-level convenience targets
2951+
if(SWIFTEXE_TARGET_BUILD_WITH_STDLIB)
2952+
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
2953+
set(variant "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
2954+
if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND
2955+
TARGET "swift-test-stdlib${VARIANT_SUFFIX}")
2956+
add_dependencies("swift-stdlib${variant}" ${lipo_target})
2957+
add_dependencies("swift-test-stdlib${variant}" ${lipo_target})
2958+
endif()
2959+
endforeach()
2960+
endif()
2961+
27092962
endforeach()
27102963
endfunction()

0 commit comments

Comments
 (0)