@@ -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.
25092517function (_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.
26402652function (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 ()
27102963endfunction ()
0 commit comments