include(macCatalystUtils) include(SwiftUtils) function(_compute_lto_swift_flag option out_var) string(TOLOWER "${option}" lowercase_option) if (lowercase_option STREQUAL "full") set(${out_var} "-lto=llvm-full" PARENT_SCOPE) elseif (lowercase_option STREQUAL "thin") set(${out_var} "-lto=llvm-thin" PARENT_SCOPE) endif() endfunction() # Compute the library subdirectory to use for the given sdk and # architecture, placing the result in 'result_var_name'. function(compute_library_subdir result_var_name sdk arch) set("${result_var_name}" "${SWIFT_SDK_${sdk}_LIB_SUBDIR}" PARENT_SCOPE) endfunction() # Return a swiftc flag (e.g. -O or -Onone) to control optimization level based # on the build type. function(swift_optimize_flag_for_build_type build_type result_var_name) if("${build_type}" STREQUAL "Debug") set("${result_var_name}" "-Onone" PARENT_SCOPE) elseif("${build_type}" STREQUAL "RelWithDebInfo" OR "${build_type}" STREQUAL "Release") set("${result_var_name}" "-O" PARENT_SCOPE) elseif("${build_type}" STREQUAL "MinSizeRel") set("${result_var_name}" "-Osize" PARENT_SCOPE) else() message(FATAL_ERROR "Unknown build type: ${build_type}") endif() endfunction() # Process the sources within the given variable, pulling out any Swift # sources to be compiled with 'swift' directly. This updates # ${sourcesvar} in place with the resulting list and ${externalvar} with the # list of externally-build sources. # # Usage: # handle_swift_sources(sourcesvar externalvar) # # MACCATALYST_BUILD_FLAVOR # Possible values are 'ios-like', 'macos-like', 'zippered', 'unzippered-twin' function(handle_swift_sources dependency_target_out_var_name dependency_module_target_out_var_name dependency_sib_target_out_var_name dependency_sibopt_target_out_var_name dependency_sibgen_target_out_var_name sourcesvar externalvar name) cmake_parse_arguments(SWIFTSOURCES "IS_MAIN;IS_STDLIB;IS_STDLIB_CORE;IS_SDK_OVERLAY;EMBED_BITCODE;STATIC;NO_LINK_NAME;IS_FRAGILE;ONLY_SWIFTMODULE;NO_SWIFTMODULE" "SDK;ARCHITECTURE;ARCHITECTURE_SUBDIR_NAME;INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_OSX;DEPLOYMENT_VERSION_IOS;DEPLOYMENT_VERSION_TVOS;DEPLOYMENT_VERSION_WATCHOS;MACCATALYST_BUILD_FLAVOR;BOOTSTRAPPING;INSTALL_BINARY_SWIFTMODULE" "DEPENDS;COMPILE_FLAGS;MODULE_NAME;MODULE_DIR;ENABLE_LTO" ${ARGN}) translate_flag(${SWIFTSOURCES_IS_MAIN} "IS_MAIN" IS_MAIN_arg) translate_flag(${SWIFTSOURCES_IS_STDLIB} "IS_STDLIB" IS_STDLIB_arg) translate_flag(${SWIFTSOURCES_IS_STDLIB_CORE} "IS_STDLIB_CORE" IS_STDLIB_CORE_arg) translate_flag(${SWIFTSOURCES_IS_SDK_OVERLAY} "IS_SDK_OVERLAY" IS_SDK_OVERLAY_arg) translate_flag(${SWIFTSOURCES_EMBED_BITCODE} "EMBED_BITCODE" EMBED_BITCODE_arg) translate_flag(${SWIFTSOURCES_STATIC} "STATIC" STATIC_arg) translate_flag(${SWIFTSOURCES_NO_LINK_NAME} "NO_LINK_NAME" NO_LINK_NAME_arg) translate_flag(${SWIFTSOURCES_IS_FRAGILE} "IS_FRAGILE" IS_FRAGILE_arg) translate_flag(${SWIFTSOURCES_ONLY_SWIFTMODULE} "ONLY_SWIFTMODULE" ONLY_SWIFTMODULE_arg) translate_flag(${SWIFTSOURCES_NO_SWIFTMODULE} "NO_SWIFTMODULE" NO_SWIFTMODULE_arg) if(DEFINED SWIFTSOURCES_BOOTSTRAPPING) set(BOOTSTRAPPING_arg "BOOTSTRAPPING" ${SWIFTSOURCES_BOOTSTRAPPING}) endif() if(SWIFTSOURCES_IS_MAIN) set(SWIFTSOURCES_INSTALL_IN_COMPONENT never_install) endif() if(NOT DEFINED SWIFTSOURCES_INSTALL_BINARY_SWIFTMODULE) set(SWIFTSOURCES_INSTALL_BINARY_SWIFTMODULE TRUE) endif() # Check arguments. precondition(SWIFTSOURCES_SDK "Should specify an SDK") precondition(SWIFTSOURCES_ARCHITECTURE "Should specify an architecture") precondition(SWIFTSOURCES_INSTALL_IN_COMPONENT "INSTALL_IN_COMPONENT is required") if (NOT SWIFTSOURCES_ARCHITECTURE_SUBDIR_NAME) set(SWIFTSOURCES_ARCHITECTURE_SUBDIR_NAME "${SWIFTSOURCES_ARCHITECTURE}") endif() # Clear the result variable. set("${dependency_target_out_var_name}" "" PARENT_SCOPE) set("${dependency_module_target_out_var_name}" "" PARENT_SCOPE) set("${dependency_sib_target_out_var_name}" "" PARENT_SCOPE) set("${dependency_sibopt_target_out_var_name}" "" PARENT_SCOPE) set("${dependency_sibgen_target_out_var_name}" "" PARENT_SCOPE) set(result) set(swift_sources) foreach(src ${${sourcesvar}}) get_filename_component(extension ${src} EXT) if(extension STREQUAL ".swift") list(APPEND swift_sources ${src}) else() list(APPEND result ${src}) endif() endforeach() set(swift_compile_flags ${SWIFTSOURCES_COMPILE_FLAGS}) if (NOT SWIFTSOURCES_IS_MAIN AND NOT SWIFTSOURCES_NO_LINK_NAME) list(APPEND swift_compile_flags "-module-link-name" "${name}") endif() if(swift_sources) set(objsubdir "/${SWIFTSOURCES_SDK}/${SWIFTSOURCES_ARCHITECTURE_SUBDIR_NAME}") get_maccatalyst_build_flavor(maccatalyst_build_flavor "${SWIFTSOURCES_SDK}" "${SWIFTSOURCES_MACCATALYST_BUILD_FLAVOR}") if(maccatalyst_build_flavor STREQUAL "ios-like") set(objsubdir "/MACCATALYST/${SWIFTSOURCES_ARCHITECTURE_SUBDIR_NAME}") endif() get_bootstrapping_path(lib_dir ${SWIFTLIB_DIR} "${SWIFTSOURCES_BOOTSTRAPPING}") get_bootstrapping_path(obj_dir "${CMAKE_CURRENT_BINARY_DIR}/${objsubdir}" "${SWIFTSOURCES_BOOTSTRAPPING}") file(MAKE_DIRECTORY ${obj_dir}) set(swift_obj "${obj_dir}/${SWIFTSOURCES_MODULE_NAME}${CMAKE_C_OUTPUT_EXTENSION}") # FIXME: We shouldn't /have/ to build things in a single process. # list(APPEND swift_compile_flags "-whole-module-optimization") if(sdk IN_LIST SWIFT_DARWIN_PLATFORMS OR sdk STREQUAL "MACCATALYST") list(APPEND swift_compile_flags "-save-optimization-record=bitstream") endif() if (SWIFTSOURCES_ENABLE_LTO) _compute_lto_swift_flag("${SWIFTSOURCES_ENABLE_LTO}" _lto_flag_out) if (_lto_flag_out) list(APPEND swift_compile_flags "${_lto_flag_out}") endif() endif() list(APPEND swift_compile_flags "-color-diagnostics") _compile_swift_files( dependency_target module_dependency_target sib_dependency_target sibopt_dependency_target sibgen_dependency_target OUTPUT ${swift_obj} SOURCES ${swift_sources} DEPENDS ${SWIFTSOURCES_DEPENDS} FLAGS ${swift_compile_flags} SDK ${SWIFTSOURCES_SDK} ARCHITECTURE ${SWIFTSOURCES_ARCHITECTURE} MODULE_NAME ${SWIFTSOURCES_MODULE_NAME} MODULE_DIR ${SWIFTSOURCES_MODULE_DIR} ${IS_MAIN_arg} ${IS_STDLIB_arg} ${IS_STDLIB_CORE_arg} ${IS_SDK_OVERLAY_arg} ${EMBED_BITCODE_arg} ${STATIC_arg} ${BOOTSTRAPPING_arg} ${IS_FRAGILE_arg} ${ONLY_SWIFTMODULE_arg} ${NO_SWIFTMODULE_arg} INSTALL_BINARY_SWIFTMODULE ${SWIFTSOURCES_INSTALL_BINARY_SWIFTMODULE} INSTALL_IN_COMPONENT "${SWIFTSOURCES_INSTALL_IN_COMPONENT}" DEPLOYMENT_VERSION_OSX ${SWIFTSOURCES_DEPLOYMENT_VERSION_OSX} DEPLOYMENT_VERSION_IOS ${SWIFTSOURCES_DEPLOYMENT_VERSION_IOS} DEPLOYMENT_VERSION_TVOS ${SWIFTSOURCES_DEPLOYMENT_VERSION_TVOS} DEPLOYMENT_VERSION_WATCHOS ${SWIFTSOURCES_DEPLOYMENT_VERSION_WATCHOS} MACCATALYST_BUILD_FLAVOR "${SWIFTSOURCES_MACCATALYST_BUILD_FLAVOR}") set("${dependency_target_out_var_name}" "${dependency_target}" PARENT_SCOPE) set("${dependency_module_target_out_var_name}" "${module_dependency_target}" PARENT_SCOPE) set("${dependency_sib_target_out_var_name}" "${sib_dependency_target}" PARENT_SCOPE) set("${dependency_sibopt_target_out_var_name}" "${sibopt_dependency_target}" PARENT_SCOPE) set("${dependency_sibgen_target_out_var_name}" "${sibgen_dependency_target}" PARENT_SCOPE) list(APPEND result ${swift_obj}) endif() llvm_process_sources(result ${result}) set(${sourcesvar} "${result}" PARENT_SCOPE) set(${externalvar} ${swift_sources} PARENT_SCOPE) endfunction() # Add Swift source files to the (Xcode) project. # # Usage: # add_swift_source_group(sources) function(add_swift_source_group sources) source_group("Swift Sources" FILES ${sources}) # Mark the source files as HEADER_FILE_ONLY, so that Xcode doesn't try # to build them itself. set_source_files_properties(${sources} PROPERTIES HEADER_FILE_ONLY true) endfunction() # Look up extra flags for a module that matches a regexp. function(_add_extra_swift_flags_for_module module_name result_var_name) set(result_list) list(LENGTH SWIFT_EXPERIMENTAL_EXTRA_REGEXP_FLAGS listlen) if (${listlen} GREATER 0) math(EXPR listlen "${listlen}-1") foreach(i RANGE 0 ${listlen} 2) list(GET SWIFT_EXPERIMENTAL_EXTRA_REGEXP_FLAGS ${i} regex) if (module_name MATCHES "${regex}") math(EXPR ip1 "${i}+1") list(GET SWIFT_EXPERIMENTAL_EXTRA_REGEXP_FLAGS ${ip1} flags) list(APPEND result_list ${flags}) message(STATUS "Matched '${regex}' to module '${module_name}'. Compiling ${module_name} with special flags: ${flags}") endif() endforeach() endif() list(LENGTH SWIFT_EXPERIMENTAL_EXTRA_NEGATIVE_REGEXP_FLAGS listlen) if (${listlen} GREATER 0) math(EXPR listlen "${listlen}-1") foreach(i RANGE 0 ${listlen} 2) list(GET SWIFT_EXPERIMENTAL_EXTRA_NEGATIVE_REGEXP_FLAGS ${i} regex) if (NOT module_name MATCHES "${regex}") math(EXPR ip1 "${i}+1") list(GET SWIFT_EXPERIMENTAL_EXTRA_NEGATIVE_REGEXP_FLAGS ${ip1} flags) list(APPEND result_list ${flags}) message(STATUS "Matched NEGATIVE '${regex}' to module '${module_name}'. Compiling ${module_name} with special flags: ${flags}") endif() endforeach() endif() set("${result_var_name}" ${result_list} PARENT_SCOPE) endfunction() function(_add_target_variant_swift_compile_flags sdk arch build_type enable_assertions result_var_name) set(result ${${result_var_name}}) cmake_parse_arguments( VARIANT # prefix "" # options "MACCATALYST_BUILD_FLAVOR;DEPLOYMENT_VERSION_OSX;DEPLOYMENT_VERSION_IOS;DEPLOYMENT_VERSION_TVOS;DEPLOYMENT_VERSION_WATCHOS" # single-value args "" # multi-value args ${ARGN}) # On Windows, we don't set SWIFT_SDK_WINDOWS_PATH_ARCH_{ARCH}_PATH, so don't include it. if ((NOT "${sdk}" STREQUAL "WINDOWS") AND NOT ("${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}" STREQUAL "")) list(APPEND result "-sdk" "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}") endif() if("${sdk}" IN_LIST SWIFT_DARWIN_PLATFORMS) set(sdk_deployment_version "${SWIFT_SDK_${sdk}_DEPLOYMENT_VERSION}") if("${sdk}" STREQUAL "OSX" AND DEFINED VARIANT_DEPLOYMENT_VERSION_OSX) set(sdk_deployment_version ${VARIANT_DEPLOYMENT_VERSION_OSX}) endif() if(("${sdk}" STREQUAL "IOS" OR "${sdk}" STREQUAL "IOS_SIMULATOR") AND DEFINED VARIANT_DEPLOYMENT_VERSION_IOS) set(sdk_deployment_version ${VARIANT_DEPLOYMENT_VERSION_IOS}) endif() if(("${sdk}" STREQUAL "TVOS" OR "${sdk}" STREQUAL "TVOS_SIMULATOR") AND DEFINED VARIANT_DEPLOYMENT_VERSION_TVOS) set(sdk_deployment_version ${VARIANT_DEPLOYMENT_VERSION_TVOS}) endif() if(("${sdk}" STREQUAL "WATCHOS" OR "${sdk}" STREQUAL "WATCHOS_SIMULATOR") AND DEFINED VARIANT_DEPLOYMENT_VERSION_WATCHOS) set(sdk_deployment_version ${VARIANT_DEPLOYMENT_VERSION_WATCHOS}) endif() get_target_triple(target target_variant "${sdk}" "${arch}" MACCATALYST_BUILD_FLAVOR "${VARIANT_MACCATALYST_BUILD_FLAVOR}" DEPLOYMENT_VERSION "${sdk_deployment_version}") list(APPEND result "-target" "${target}") if(target_variant) list(APPEND result "-target-variant" "${target_variant}") endif() else() list(APPEND result "-target" "${SWIFT_SDK_${sdk}_ARCH_${arch}_TRIPLE}") endif() if(NOT BUILD_STANDALONE) list(APPEND result "-resource-dir" "${SWIFTLIB_DIR}") endif() if("${sdk}" IN_LIST SWIFT_DARWIN_PLATFORMS) # We collate -F with the framework path to avoid unwanted deduplication # of options by target_compile_options -- this way no undesired # side effects are introduced should a new search path be added. list(APPEND result "-F${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}/../../../Developer/Library/Frameworks") endif() swift_optimize_flag_for_build_type("${build_type}" optimize_flag) list(APPEND result "${optimize_flag}") is_build_type_with_debuginfo("${build_type}" debuginfo) if(debuginfo) list(APPEND result "-g") elseif("${build_type}" STREQUAL "MinSizeRel") # MinSizeRel builds of stdlib (but not the compiler) should get debug info list(APPEND result "-g") endif() if(enable_assertions) list(APPEND result "-D" "INTERNAL_CHECKS_ENABLED") endif() if(SWIFT_STDLIB_COMPACT_ABSOLUTE_FUNCTION_POINTER) list(APPEND result "-D" "SWIFT_COMPACT_ABSOLUTE_FUNCTION_POINTER") endif() if(SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY) list(APPEND result "-D" "SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY") endif() if(SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED) list(APPEND result "-D" "SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED") endif() if(SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS) list(APPEND result "-D" "SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS") endif() if(SWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING) list(APPEND result "-D" "SWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING") endif() if(SWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING) list(APPEND result "-D" "SWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING") endif() if(SWIFT_ENABLE_EXPERIMENTAL_OBSERVATION) list(APPEND result "-D" "SWIFT_ENABLE_EXPERIMENTAL_OBSERVATION") endif() if(SWIFT_ENABLE_SYNCHRONIZATION) list(APPEND result "-D" "SWIFT_ENABLE_SYNCHRONIZATION") endif() if(SWIFT_ENABLE_VOLATILE) list(APPEND result "-D" "SWIFT_ENABLE_VOLATILE") endif() if(SWIFT_STDLIB_OS_VERSIONING) list(APPEND result "-D" "SWIFT_RUNTIME_OS_VERSIONING") endif() if(SWIFT_STDLIB_STATIC_PRINT) list(APPEND result "-D" "SWIFT_STDLIB_STATIC_PRINT") endif() if(SWIFT_STDLIB_ENABLE_UNICODE_DATA) list(APPEND result "-D" "SWIFT_STDLIB_ENABLE_UNICODE_DATA") endif() if(SWIFT_STDLIB_ENABLE_VECTOR_TYPES) list(APPEND result "-D" "SWIFT_STDLIB_ENABLE_VECTOR_TYPES") endif() if(SWIFT_STDLIB_HAS_COMMANDLINE) list(APPEND result "-D" "SWIFT_STDLIB_HAS_COMMANDLINE") endif() if(SWIFT_STDLIB_HAS_STDIN) list(APPEND result "-D" "SWIFT_STDLIB_HAS_STDIN") endif() if(SWIFT_STDLIB_HAS_ENVIRON) list(APPEND result "-D" "SWIFT_STDLIB_HAS_ENVIRON") list(APPEND result "-Xcc" "-DSWIFT_STDLIB_HAS_ENVIRON") endif() if(SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY) list(APPEND result "-D" "SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY") endif() if(SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY) list(APPEND result "-D" "SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY") endif() if (SWIFT_CONCURRENCY_USES_DISPATCH) list(APPEND result "-D" "SWIFT_CONCURRENCY_USES_DISPATCH") endif() if(SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE) list(APPEND result "-D" "SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE") endif() string(TOUPPER "${SWIFT_SDK_${sdk}_THREADING_PACKAGE}" _threading_package) list(APPEND result "-D" "SWIFT_THREADING_${_threading_package}") set("${result_var_name}" "${result}" PARENT_SCOPE) endfunction() # Compile a swift file into an object file (as a library). # # Usage: # _compile_swift_files( # dependency_target_out_var_name # dependency_module_target_out_var_name # dependency_sib_target_out_var_name # -Onone sib target # dependency_sibopt_target_out_var_name # -O sib target # dependency_sibgen_target_out_var_name # -sibgen target # OUTPUT objfile # Name of the resulting object file # SOURCES swift_src [swift_src...] # Swift source files to compile # FLAGS -module-name foo # Flags to add to the compilation # MACCATALYST_BUILD_FLAVOR flavor # macCatalyst flavor # [SDK sdk] # SDK to build for # [ARCHITECTURE architecture] # Architecture to build for # [DEPENDS cmake_target...] # CMake targets on which the object # # file depends. # [IS_MAIN] # This is an executable, not a library # [IS_STDLIB] # [IS_STDLIB_CORE] # This is the core standard library # [ONLY_SWIFTMODULE] # Emit swiftmodule only, no binary # [NO_SWIFTMODULE] # Emit binary only, no swiftmodule # [OPT_FLAGS] # Optimization flags (overrides SWIFT_OPTIMIZE) # [MODULE_DIR] # Put .swiftmodule, .swiftdoc., and .o # # into this directory. # [MODULE_NAME] # The module name. # [INSTALL_IN_COMPONENT] # Install produced files. # [EMBED_BITCODE] # Embed LLVM bitcode into the .o files # [STATIC] # Also write .swiftmodule etc. to static # # resource folder # ) function(_compile_swift_files dependency_target_out_var_name dependency_module_target_out_var_name dependency_sib_target_out_var_name dependency_sibopt_target_out_var_name dependency_sibgen_target_out_var_name) cmake_parse_arguments(SWIFTFILE "IS_MAIN;IS_STDLIB;IS_STDLIB_CORE;IS_SDK_OVERLAY;EMBED_BITCODE;STATIC;IS_FRAGILE;ONLY_SWIFTMODULE;NO_SWIFTMODULE" "OUTPUT;MODULE_NAME;INSTALL_IN_COMPONENT;DEPLOYMENT_VERSION_OSX;DEPLOYMENT_VERSION_IOS;DEPLOYMENT_VERSION_TVOS;DEPLOYMENT_VERSION_WATCHOS;MACCATALYST_BUILD_FLAVOR;BOOTSTRAPPING;INSTALL_BINARY_SWIFTMODULE" "SOURCES;FLAGS;DEPENDS;SDK;ARCHITECTURE;OPT_FLAGS;MODULE_DIR" ${ARGN}) if(NOT DEFINED SWIFTFILE_INSTALL_BINARY_SWIFTMODULE) set(SWIFTFILE_INSTALL_BINARY_SWIFTMODULE TRUE) endif() # Check arguments. list(LENGTH SWIFTFILE_OUTPUT num_outputs) list(GET SWIFTFILE_OUTPUT 0 first_output) precondition(num_outputs MESSAGE "OUTPUT must not be empty") foreach(output ${SWIFTFILE_OUTPUT}) if (NOT IS_ABSOLUTE "${output}") message(FATAL_ERROR "OUTPUT should be an absolute path") endif() endforeach() if(SWIFTFILE_IS_MAIN AND SWIFTFILE_IS_STDLIB) message(FATAL_ERROR "Cannot set both IS_MAIN and IS_STDLIB") endif() precondition(SWIFTFILE_SDK MESSAGE "Should specify an SDK") precondition(SWIFTFILE_ARCHITECTURE MESSAGE "Should specify an architecture") precondition(SWIFTFILE_INSTALL_IN_COMPONENT MESSAGE "INSTALL_IN_COMPONENT is required") # Determine if/what macCatalyst build variant we are get_maccatalyst_build_flavor(maccatalyst_build_flavor "${SWIFTFILE_SDK}" "${SWIFTFILE_MACCATALYST_BUILD_FLAVOR}") # Determine target triples get_target_triple(target_triple ignored_target_variant_triple "${SWIFTFILE_SDK}" "${SWIFTFILE_ARCHITECTURE}" DEPLOYMENT_VERSION "${SWIFT_SDK_${SWIFTFILE_SDK}_DEPLOYMENT_VERSION}") get_target_triple(maccatalyst_target_triple ignored_target_variant_triple "${SWIFTFILE_SDK}" "${SWIFTFILE_ARCHITECTURE}" DEPLOYMENT_VERSION "${SWIFT_SDK_${SWIFTFILE_SDK}_DEPLOYMENT_VERSION}" MACCATALYST_BUILD_FLAVOR "${maccatalyst_build_flavor}") # macCatalyst ios-like target triple if(maccatalyst_build_flavor STREQUAL "ios-like") set(target_triple "${maccatalyst_target_triple}") endif() if ("${SWIFTFILE_MODULE_NAME}" STREQUAL "") get_filename_component(SWIFTFILE_MODULE_NAME "${first_output}" NAME_WE) message(SEND_ERROR "No module name specified; did you mean to use MODULE_NAME " "${SWIFTFILE_MODULE_NAME}?") endif() set(source_files) foreach(file ${SWIFTFILE_SOURCES}) # Determine where this file is. get_filename_component(file_path ${file} PATH) if(IS_ABSOLUTE "${file_path}") list(APPEND source_files "${file}") else() list(APPEND source_files "${CMAKE_CURRENT_SOURCE_DIR}/${file}") endif() endforeach() # Compute flags for the Swift compiler. set(swift_flags) set(swift_module_flags) _add_target_variant_swift_compile_flags( "${SWIFTFILE_SDK}" "${SWIFTFILE_ARCHITECTURE}" "${SWIFT_STDLIB_BUILD_TYPE}" "${SWIFT_STDLIB_ASSERTIONS}" swift_flags DEPLOYMENT_VERSION_OSX ${SWIFTFILE_DEPLOYMENT_VERSION_OSX} DEPLOYMENT_VERSION_IOS ${SWIFTFILE_DEPLOYMENT_VERSION_IOS} DEPLOYMENT_VERSION_TVOS ${SWIFTFILE_DEPLOYMENT_VERSION_TVOS} DEPLOYMENT_VERSION_WATCHOS ${SWIFTFILE_DEPLOYMENT_VERSION_WATCHOS} MACCATALYST_BUILD_FLAVOR "${maccatalyst_build_flavor}" ) if(SWIFTFILE_STATIC) list(APPEND swift_flags -static) endif() # Determine the subdirectory where the binary should be placed. set(library_subdir_sdk "${SWIFTFILE_SDK}") if(maccatalyst_build_flavor STREQUAL "ios-like") set(library_subdir_sdk "MACCATALYST") endif() compute_library_subdir(library_subdir "${library_subdir_sdk}" "${SWIFTFILE_ARCHITECTURE}") if(NOT "${SWIFT_NATIVE_CLANG_TOOLS_PATH}" STREQUAL "") list(APPEND swift_flags "-tools-directory" "${SWIFT_NATIVE_CLANG_TOOLS_PATH}") endif() # If we have a custom module cache path, use it. if (SWIFT_MODULE_CACHE_PATH) list(APPEND swift_flags "-module-cache-path" "${SWIFT_MODULE_CACHE_PATH}") endif() # Don't include libarclite in any build products by default. list(APPEND swift_flags "-no-link-objc-runtime") if(SWIFT_SIL_VERIFY_ALL) list(APPEND swift_flags "-Xfrontend" "-sil-verify-all") endif() if(SWIFT_SIL_VERIFY_ALL_MACOS_ONLY) # Only add if we have a macOS build triple if ("${SWIFTFILE_SDK}" STREQUAL "OSX" AND "${SWIFTFILE_ARCHITECTURE}" STREQUAL "x86_64") list(APPEND swift_flags "-Xfrontend" "-sil-verify-all") endif() endif() # The standard library and overlays are built resiliently when SWIFT_STDLIB_STABLE_ABI=On. if(SWIFTFILE_IS_STDLIB AND NOT SWIFTFILE_IS_FRAGILE AND SWIFT_STDLIB_STABLE_ABI) list(APPEND swift_flags "-enable-library-evolution") list(APPEND swift_flags "-library-level" "api") list(APPEND swift_flags "-Xfrontend" "-require-explicit-availability=ignore") endif() if("${SWIFT_SDK_${SWIFTFILE_SDK}_THREADING_PACKAGE}" STREQUAL "none") list(APPEND swift_flags "-Xfrontend" "-assume-single-threaded") endif() if(NOT SWIFT_ENABLE_STDLIBCORE_EXCLUSIVITY_CHECKING AND SWIFTFILE_IS_STDLIB) list(APPEND swift_flags "-Xfrontend" "-enforce-exclusivity=unchecked") endif() if(SWIFT_EMIT_SORTED_SIL_OUTPUT) list(APPEND swift_flags "-Xfrontend" "-emit-sorted-sil") endif() if(SWIFT_ENABLE_REFLECTION) list(APPEND swift_flags "-D" "SWIFT_ENABLE_REFLECTION") endif() if("${SWIFT_STDLIB_REFLECTION_METADATA}" STREQUAL "enabled") # do nothing, emitting reflection metadata is the default in swiftc elseif("${SWIFT_STDLIB_REFLECTION_METADATA}" STREQUAL "debugger-only") list(APPEND swift_flags "-Xfrontend" "-reflection-metadata-for-debugger-only") elseif("${SWIFT_STDLIB_REFLECTION_METADATA}" STREQUAL "disabled") list(APPEND swift_flags "-Xfrontend" "-disable-reflection-metadata") else() message(FATAL_ERROR "Invalid SWIFT_STDLIB_REFLECTION_METADATA value: ${SWIFT_STDLIB_REFLECTION_METADATA}") endif() if(NOT "${SWIFT_STDLIB_TRAP_FUNCTION}" STREQUAL "") list(APPEND swift_flags "-Xfrontend" "-trap-function" "-Xfrontend" "${SWIFT_STDLIB_TRAP_FUNCTION}") endif() # FIXME: Cleaner way to do this? if(SWIFTFILE_IS_STDLIB_CORE) list(APPEND swift_flags "-nostdimport" "-parse-stdlib" "-module-name" "Swift") list(APPEND swift_flags "-Xfrontend" "-group-info-path" "-Xfrontend" "${GROUP_INFO_JSON_FILE}") else() list(APPEND swift_flags "-module-name" "${SWIFTFILE_MODULE_NAME}") endif() # Force swift 5 mode for Standard Library and overlays. if (SWIFTFILE_IS_STDLIB) list(APPEND swift_flags "-swift-version" "5") endif() if (SWIFTFILE_IS_SDK_OVERLAY) list(APPEND swift_flags "-swift-version" "5") endif() # Avoiding emitting ABI descriptor files while building stdlib. if (SWIFTFILE_IS_STDLIB) list(APPEND swift_flags "-Xfrontend" "-empty-abi-descriptor") endif() if(SWIFTFILE_IS_SDK_OVERLAY) list(APPEND swift_flags "-autolink-force-load") endif() # Don't need to link runtime compatibility libraries for older runtimes # into the new runtime. if (SWIFTFILE_IS_STDLIB OR SWIFTFILE_IS_SDK_OVERLAY) list(APPEND swift_flags "-runtime-compatibility-version" "none") list(APPEND swift_flags "-disable-autolinking-runtime-compatibility-dynamic-replacements") list(APPEND swift_flags "-Xfrontend" "-disable-autolinking-runtime-compatibility-concurrency") endif() if(NOT SWIFT_STDLIB_SHORT_MANGLING_LOOKUPS) list(APPEND swift_flags "-Xfrontend" "-disable-standard-substitutions-in-reflection-mangling") endif() if(NOT SWIFT_STDLIB_ENABLE_OBJC_INTEROP) list(APPEND swift_flags "-Xfrontend" "-disable-objc-interop") endif() if(SWIFT_STDLIB_EXPERIMENTAL_HERMETIC_SEAL_AT_LINK) list(APPEND swift_flags "-experimental-hermetic-seal-at-link") endif() list(APPEND swift_flags "-enable-experimental-feature" "NoncopyableGenerics2") list(APPEND swift_flags "-enable-experimental-feature" "SuppressedAssociatedTypes") list(APPEND swift_flags "-enable-experimental-feature" "SE427NoInferenceOnExtension") list(APPEND swift_flags "-enable-experimental-feature" "NonescapableTypes") list(APPEND swift_flags "-enable-experimental-feature" "LifetimeDependence") list(APPEND swift_flags "-enable-experimental-feature" "InoutLifetimeDependence") list(APPEND swift_flags "-enable-experimental-feature" "LifetimeDependenceMutableAccessors") list(APPEND swift_flags "-enable-upcoming-feature" "MemberImportVisibility") if (SWIFT_STDLIB_ENABLE_STRICT_CONCURRENCY_COMPLETE) list(APPEND swift_flags "-strict-concurrency=complete") endif() if (SWIFT_STDLIB_USE_RELATIVE_PROTOCOL_WITNESS_TABLES) list(APPEND swift_flags "-Xfrontend" "-enable-relative-protocol-witness-tables") list(APPEND swift_flags "-Xfrontend" "-swift-async-frame-pointer=never") endif() if (SWIFT_STDLIB_USE_FRAGILE_RESILIENT_PROTOCOL_WITNESS_TABLES) list(APPEND swift_flags "-Xfrontend" "-enable-fragile-relative-protocol-tables") endif() if(SWIFT_STDLIB_DISABLE_INSTANTIATION_CACHES) list(APPEND swift_flags "-Xfrontend" "-disable-preallocated-instantiation-caches") endif() list(APPEND swift_flags ${SWIFT_STDLIB_EXTRA_SWIFT_COMPILE_FLAGS}) list(APPEND swift_flags ${SWIFT_EXPERIMENTAL_EXTRA_FLAGS}) if(SWIFTFILE_OPT_FLAGS) list(APPEND swift_flags ${SWIFTFILE_OPT_FLAGS}) endif() list(APPEND swift_flags ${SWIFTFILE_FLAGS}) set(dirs_to_create) foreach(output ${SWIFTFILE_OUTPUT}) get_filename_component(objdir "${output}" PATH) list(APPEND dirs_to_create "${objdir}") endforeach() set(module_file) set(module_file_static) set(module_doc_file) set(module_doc_file_static) set(interface_file) set(interface_file_static) get_bootstrapping_path(lib_dir ${SWIFTLIB_DIR} "${SWIFTFILE_BOOTSTRAPPING}") if(NOT SWIFTFILE_IS_MAIN) list(APPEND swift_flags "-parse-as-library") endif() if(NOT SWIFTFILE_IS_MAIN AND NOT SWIFTFILE_NO_SWIFTMODULE) # Determine the directory where the module file should be placed. if(SWIFTFILE_MODULE_DIR) set(module_dir "${SWIFTFILE_MODULE_DIR}") elseif(SWIFTFILE_IS_STDLIB) set(module_dir "${lib_dir}/${library_subdir}") else() message(FATAL_ERROR "Don't know where to put the module files") endif() set(module_base "${module_dir}/${SWIFTFILE_MODULE_NAME}") set(module_dir_static "${SWIFTSTATICLIB_DIR}/${library_subdir}") set(module_base_static "${module_dir_static}/${SWIFTFILE_MODULE_NAME}") set(module_triple ${SWIFT_SDK_${library_subdir_sdk}_ARCH_${SWIFTFILE_ARCHITECTURE}_MODULE}) set(specific_module_dir "${module_base}.swiftmodule") set(module_base "${module_base}.swiftmodule/${module_triple}") set(specific_module_dir_static "${module_base_static}.swiftmodule") set(module_base_static "${module_base_static}.swiftmodule/${module_triple}") set(module_file "${module_base}.swiftmodule") set(module_doc_file "${module_base}.swiftdoc") set(module_file_static "${module_base_static}.swiftmodule") set(module_doc_file_static "${module_base_static}.swiftdoc") # FIXME: These don't really belong inside the swiftmodule, but there's not # an obvious alternate place to put them. set(sib_file "${module_base}.Onone.sib") set(sibopt_file "${module_base}.O.sib") set(sibgen_file "${module_base}.sibgen") if(SWIFT_ENABLE_MODULE_INTERFACES AND NOT SWIFTFILE_IS_FRAGILE) set(interface_file "${module_base}.swiftinterface") set(interface_file_static "${module_base_static}.swiftinterface") set(private_interface_file "${module_base}.private.swiftinterface") set(private_interface_file_static "${module_base_static}.private.swiftinterface") list(APPEND swift_module_flags "-emit-module-interface-path" "${interface_file}" "-emit-private-module-interface-path" "${private_interface_file}") endif() if(SWIFT_STDLIB_EMIT_API_DESCRIPTORS AND NOT SWIFTFILE_IS_FRAGILE) set(api_descriptor_file "${module_base}.api.json") list(APPEND swift_module_flags "-emit-api-descriptor-path" "${api_descriptor_file}") endif() if (NOT SWIFTFILE_IS_STDLIB_CORE) list(APPEND swift_module_flags "-Xfrontend" "-experimental-skip-non-inlinable-function-bodies") endif() set(module_outputs "${module_file}" "${module_doc_file}") if(interface_file) list(APPEND module_outputs "${interface_file}" "${private_interface_file}") endif() set(exclude_binary_swiftmodule_installation_args "") if(NOT SWIFTFILE_INSTALL_BINARY_SWIFTMODULE OR (SWIFTFILE_INSTALL_BINARY_SWIFTMODULE STREQUAL "NON_DARWIN_ONLY" AND SWIFTFILE_SDK IN_LIST SWIFT_DARWIN_PLATFORMS)) list(APPEND exclude_binary_swiftmodule_installation_args "REGEX" "${SWIFTFILE_MODULE_NAME}.swiftmodule/[^/]*\\.swiftmodule$" EXCLUDE) endif() # macCatalyst zippered module setup if(maccatalyst_build_flavor STREQUAL "zippered") compute_library_subdir(maccatalyst_library_subdir "MACCATALYST" "${SWIFTFILE_ARCHITECTURE}") if(SWIFTFILE_MODULE_DIR) set(maccatalyst_module_dir "${SWIFTFILE_MODULE_DIR}") elseif(SWIFTFILE_IS_STDLIB) set(maccatalyst_module_dir "${lib_dir}/${maccatalyst_library_subdir}") else() message(FATAL_ERROR "Don't know where to put the module files") endif() set(maccatalyst_module_base "${maccatalyst_module_dir}/${SWIFTFILE_MODULE_NAME}") set(maccatalyst_module_dir_static "${SWIFTSTATICLIB_DIR}/${maccatalyst_library_subdir}") set(maccatalyst_module_base_static "${maccatalyst_module_dir_static}/${SWIFTFILE_MODULE_NAME}") set(maccatalyst_module_triple ${SWIFT_SDK_MACCATALYST_ARCH_${SWIFTFILE_ARCHITECTURE}_MODULE}) set(maccatalyst_specific_module_dir "${maccatalyst_module_base}.swiftmodule") set(maccatalyst_module_base "${maccatalyst_module_base}.swiftmodule/${maccatalyst_module_triple}") set(maccatalyst_specific_module_dir_static "${maccatalyst_module_base_static}.swiftmodule") set(maccatalyst_module_base_static "${maccatalyst_module_base_static}.swiftmodule/${maccatalyst_module_triple}") set(maccatalyst_module_file "${maccatalyst_module_base}.swiftmodule") set(maccatalyst_module_doc_file "${maccatalyst_module_base}.swiftdoc") set(maccatalyst_module_file_static "${maccatalyst_module_base_static}.swiftmodule") set(maccatalyst_module_doc_file_static "${maccatalyst_module_base_static}.swiftdoc") set(maccatalyst_module_outputs "${maccatalyst_module_file}" "${maccatalyst_module_doc_file}") set(maccatalyst_module_outputs_static "${maccatalyst_module_file_static}" "${maccatalyst_module_doc_file_static}") if(SWIFT_ENABLE_MODULE_INTERFACES AND NOT SWIFTFILE_IS_FRAGILE) set(maccatalyst_interface_file "${maccatalyst_module_base}.swiftinterface") set(maccatalyst_interface_file_static "${maccatalyst_module_base_static}.swiftinterface") set(maccatalyst_private_interface_file "${maccatalyst_module_base}.private.swiftinterface") set(maccatalyst_private_interface_file_static "${maccatalyst_module_base_static}.private.swiftinterface") list(APPEND maccatalyst_module_outputs "${maccatalyst_interface_file}" "${maccatalyst_private_interface_file}") list(APPEND maccatalyst_module_outputs_static "${maccatalyst_interface_file_static}" "${maccatalyst_private_interface_file_static}") else() set(maccatalyst_interface_file) set(maccatalyst_private_interface_file) set(maccatalyst_interface_file_static) set(maccatalyst_private_interface_file_static) endif() if(SWIFT_STDLIB_EMIT_API_DESCRIPTORS AND NOT SWIFTFILE_IS_FRAGILE) set(maccatalyst_api_descriptor_file "${maccatalyst_module_base}.api.json") list(APPEND maccatalyst_module_outputs "${maccatalyst_api_descriptor_file}") else() set(maccatalyst_api_descriptor_file) endif() swift_install_in_component(DIRECTORY ${maccatalyst_specific_module_dir} DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift/${maccatalyst_library_subdir}" COMPONENT "${SWIFTFILE_INSTALL_IN_COMPONENT}" OPTIONAL PATTERN "Project" EXCLUDE ${exclude_binary_swiftmodule_installation_args}) if(SWIFTFILE_STATIC) swift_install_in_component(DIRECTORY ${maccatalyst_specific_module_dir_static} DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${maccatalyst_library_subdir}" COMPONENT "${SWIFTFILE_INSTALL_IN_COMPONENT}" OPTIONAL PATTERN "Project" EXCLUDE ${exclude_binary_swiftmodule_installation_args}) endif() endif() # If we have extra regexp flags, check if we match any of the regexps. If so # add the relevant flags to our swift_flags. if (SWIFT_EXPERIMENTAL_EXTRA_REGEXP_FLAGS OR SWIFT_EXPERIMENTAL_EXTRA_NEGATIVE_REGEXP_FLAGS) set(extra_swift_flags_for_module) _add_extra_swift_flags_for_module("${SWIFTFILE_MODULE_NAME}" extra_swift_flags_for_module) if (extra_swift_flags_for_module) list(APPEND swift_flags ${extra_swift_flags_for_module}) endif() endif() endif() set(module_outputs "${module_file}" "${module_doc_file}") set(module_outputs_static "${module_file_static}" "${module_doc_file_static}") if(interface_file) list(APPEND module_outputs "${interface_file}" "${private_interface_file}") list(APPEND module_outputs_static "${interface_file_static}" "${private_interface_file_static}") endif() if(api_descriptor_file) list(APPEND module_outputs "${api_descriptor_file}") endif() swift_install_in_component(DIRECTORY "${specific_module_dir}" DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift/${library_subdir}" COMPONENT "${SWIFTFILE_INSTALL_IN_COMPONENT}" OPTIONAL PATTERN "Project" EXCLUDE ${exclude_binary_swiftmodule_installation_args}) if(SWIFTFILE_STATIC) swift_install_in_component(DIRECTORY "${specific_module_dir_static}" DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${library_subdir}" COMPONENT "${SWIFTFILE_INSTALL_IN_COMPONENT}" OPTIONAL PATTERN "Project" EXCLUDE ${exclude_binary_swiftmodule_installation_args}) endif() set(line_directive_tool "${SWIFT_SOURCE_DIR}/utils/line-directive") if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") set(HOST_EXECUTABLE_SUFFIX .exe) endif() if(NOT SWIFT_ENABLE_SWIFT_IN_SWIFT) # This is only for bootstrapping purposes. The just-built Swift is very # limited and only built for the builder to build the next stages with # hosttools. set(swift_compiler_tool "${Swift_BINARY_DIR}/bin/swiftc") elseif(SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER) if(SWIFT_PREBUILT_SWIFT) set(swift_compiler_tool "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/swiftc${HOST_EXECUTABLE_SUFFIX}") elseif(CMAKE_Swift_COMPILER) set(swift_compiler_tool "${CMAKE_Swift_COMPILER}") else() message(ERROR "Must pass in prebuilt tools using SWIFT_NATIVE_SWIFT_TOOLS_PATH or set CMAKE_Swift_COMPILER") endif() else() set(swift_compiler_tool "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/swiftc${HOST_EXECUTABLE_SUFFIX}") get_bootstrapping_path(swift_compiler_tool "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/swiftc${HOST_EXECUTABLE_SUFFIX}" "${SWIFTFILE_BOOTSTRAPPING}") if(NOT "${SWIFTFILE_BOOTSTRAPPING}" STREQUAL "") set(target_suffix "-bootstrapping${SWIFTFILE_BOOTSTRAPPING}") endif() if(NOT BUILD_STANDALONE) list(APPEND swift_flags "-resource-dir" "${lib_dir}") endif() endif() set(swift_compiler_tool_dep) if(SWIFT_INCLUDE_TOOLS AND NOT BOOTSTRAPPING_MODE STREQUAL "CROSSCOMPILE") # Depend on the binary itself, in addition to the symlink, unless # cross-compiling the compiler. list(APPEND swift_compiler_tool_dep "swift-frontend${target_suffix}") if(SWIFT_ENABLE_SWIFT_IN_SWIFT) # If we aren't cross compiling, also depend on SwiftMacros. list(APPEND swift_compiler_tool_dep SwiftMacros) endif() endif() # If there are more than one output files, we assume that they are specified # otherwise e.g. with an output file map. set(output_option) if (${num_outputs} EQUAL 1) set(output_option "-o" ${first_output}) endif() set(embed_bitcode_option) if (SWIFTFILE_EMBED_BITCODE) set(embed_bitcode_option "-embed-bitcode") endif() set(main_command "-c") if (SWIFT_CHECK_INCREMENTAL_COMPILATION) set(swift_compiler_tool "${SWIFT_SOURCE_DIR}/utils/check-incremental" "${swift_compiler_tool}") endif() set(custom_env "PYTHONIOENCODING=UTF8") if(SWIFT_INCLUDE_TOOLS AND (SWIFTFILE_IS_STDLIB OR # Linux "hosttools" build require builder's runtime before building the runtime. (BOOTSTRAPPING_MODE STREQUAL "HOSTTOOLS" AND SWIFT_HOST_VARIANT_SDK MATCHES "LINUX|ANDROID|OPENBSD|FREEBSD")) ) get_bootstrapping_swift_lib_dir(bs_lib_dir "${SWIFTFILE_BOOTSTRAPPING}") if(bs_lib_dir) # When building the stdlib with bootstrapping, the compiler needs # to pick up the stdlib from the previous bootstrapping stage, because the # stdlib in the current stage is not built yet. if(SWIFT_HOST_VARIANT_SDK IN_LIST SWIFT_APPLE_PLATFORMS) list(APPEND custom_env "DYLD_LIBRARY_PATH=${bs_lib_dir}") elseif(SWIFT_HOST_VARIANT_SDK MATCHES "LINUX|ANDROID|OPENBSD|FREEBSD") list(APPEND custom_env "LD_LIBRARY_PATH=${bs_lib_dir}") endif() endif() endif() set(set_environment_args "${CMAKE_COMMAND}" "-E" "env" "${custom_env}") if (SWIFT_REPORT_STATISTICS) list(GET dirs_to_create 0 first_obj_dir) list(APPEND swift_flags "-stats-output-dir" ${first_obj_dir}) endif() set(standard_outputs ${SWIFTFILE_OUTPUT}) set(sib_outputs "${sib_file}") set(sibopt_outputs "${sibopt_file}") set(sibgen_outputs "${sibgen_file}") # macCatalyst zippered swiftmodule if(maccatalyst_build_flavor STREQUAL "zippered") set(maccatalyst_swift_flags "${swift_flags}") list(APPEND maccatalyst_swift_flags "-I" "${lib_dir}/${maccatalyst_library_subdir}") set(maccatalyst_swift_module_flags ${swift_module_flags}) # Remove original interface file list(FIND maccatalyst_swift_module_flags "${interface_file}" interface_file_index) if(NOT interface_file_index EQUAL -1) list(INSERT maccatalyst_swift_module_flags ${interface_file_index} "${maccatalyst_interface_file}") math(EXPR old_interface_file_index "${interface_file_index} + 1") list(REMOVE_AT maccatalyst_swift_module_flags ${old_interface_file_index}) endif() # Remove original private interface list(FIND maccatalyst_swift_module_flags "${private_interface_file}" private_interface_file_index) if(NOT private_interface_file_index EQUAL -1) list(INSERT maccatalyst_swift_module_flags ${private_interface_file_index} "${maccatalyst_private_interface_file}") math(EXPR old_interface_file_index "${private_interface_file_index} + 1") list(REMOVE_AT maccatalyst_swift_module_flags ${old_interface_file_index}) endif() # Remove original api descriptor list(FIND maccatalyst_swift_module_flags "${api_descriptor_file}" api_descriptor_file_index) if(NOT api_descriptor_file_index EQUAL -1) list(INSERT maccatalyst_swift_module_flags ${api_descriptor_file_index} "${maccatalyst_api_descriptor_file}") math(EXPR old_api_descriptor_file_index "${api_descriptor_file_index} + 1") list(REMOVE_AT maccatalyst_swift_module_flags ${old_api_descriptor_file_index}) endif() # We still need to change the main swift flags # so we can use the correct modules # when building for macOS list(APPEND swift_flags "-I" "${lib_dir}/${library_subdir}") elseif(maccatalyst_build_flavor STREQUAL "ios-like") compute_library_subdir(maccatalyst_library_subdir "MACCATALYST" "${SWIFTFILE_ARCHITECTURE}") list(APPEND swift_flags "-I" "${lib_dir}/${maccatalyst_library_subdir}") else() # Allow import of other Swift modules we just built. list(APPEND swift_flags "-I" "${lib_dir}/${library_subdir}") # FIXME: should we use '-resource-dir' here? Seems like it has no advantage # over '-I' in this case. endif() list(REMOVE_DUPLICATES dirs_to_create) # Then we can compile both the object files and the swiftmodule files # in parallel in this target for the object file, and ... # Windows doesn't support long command line paths, of 8191 chars or over. We # need to work around this by avoiding long command line arguments. This can # be achieved by writing the list of file paths to a file, then reading that # list in the Python script. string(REPLACE ";" "\n" source_files_quoted "${source_files}") string(SHA1 file_name "${source_files_quoted}") set(file_path_target "filelist-${file_name}") set(file_path "${CMAKE_CURRENT_BINARY_DIR}/${file_name}.txt") if (NOT TARGET ${file_path_target}) file(WRITE "${file_path}.tmp" "${source_files_quoted}") add_custom_command_target(unused_var COMMAND ${CMAKE_COMMAND} -E copy_if_different "${file_path}.tmp" "${file_path}" CUSTOM_TARGET_NAME ${file_path_target} OUTPUT "${file_path}" DEPENDS "${file_path}.tmp") endif() # If this platform/architecture combo supports backward deployment to old # Objective-C runtimes, we need to copy a YAML file with legacy type layout # information to the build directory so that the compiler can find it. # # See stdlib/CMakeLists.txt and TypeConverter::TypeConverter() in # lib/IRGen/GenType.cpp. if(SWIFTFILE_IS_STDLIB_CORE AND SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT) set(SWIFTFILE_PLATFORM "${SWIFT_SDK_${SWIFTFILE_SDK}_LIB_SUBDIR}") set(copy_legacy_layouts_dep "copy-legacy-layouts-${SWIFTFILE_PLATFORM}-${SWIFTFILE_ARCHITECTURE}${target_suffix}") else() set(copy_legacy_layouts_dep) endif() if(NOT SWIFTFILE_ONLY_SWIFTMODULE) add_custom_command_target( dependency_target COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND ${set_environment_args} "$" "${line_directive_tool}" "@${file_path}" -- "${swift_compiler_tool}" "${main_command}" ${swift_flags} ${output_option} ${embed_bitcode_option} "@${file_path}" ${command_touch_standard_outputs} OUTPUT ${standard_outputs} DEPENDS "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${swift_ide_test_dependency} ${copy_legacy_layouts_dep} COMMENT "Compiling ${first_output}") set("${dependency_target_out_var_name}" "${dependency_target}" PARENT_SCOPE) endif() # This is the target to generate: # # 1. *.swiftmodule # 2. *.swiftdoc # 3. *.swiftinterface # 4. *.Onone.sib # 5. *.O.sib # 6. *.sibgen # # Only 1,2,3 are built by default. 4,5,6 are utility targets for use by # engineers and thus even though the targets are generated, the targets are # not built by default. # # We only build these when we are not producing a main file. We could do this # with sib/sibgen, but it is useful for looking at the stdlib. if (NOT SWIFTFILE_IS_MAIN AND NOT SWIFTFILE_NO_SWIFTMODULE) add_custom_command_target( module_dependency_target COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND "${CMAKE_COMMAND}" "-E" "remove" "-f" ${module_outputs} COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir} ${specific_module_dir} COMMAND ${set_environment_args} "$" "${line_directive_tool}" "@${file_path}" -- "${swift_compiler_tool}" "-emit-module" "-o" "${module_file}" "-avoid-emit-module-source-info" ${swift_flags} ${swift_module_flags} "@${file_path}" ${command_touch_module_outputs} OUTPUT ${module_outputs} DEPENDS "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${swift_ide_test_dependency} ${copy_legacy_layouts_dep} COMMENT "Generating ${module_file}") if(SWIFTFILE_STATIC) set(command_copy_interface_file) if(interface_file) set(command_copy_interface_file COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${interface_file} ${interface_file_static} COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${private_interface_file} ${private_interface_file_static}) endif() add_custom_command_target( module_dependency_target_static COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static} ${specific_module_dir_static} COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${module_file} ${module_file_static} COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${module_doc_file} ${module_doc_file_static} ${command_copy_interface_file} OUTPUT ${module_outputs_static} DEPENDS "${module_dependency_target}" "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${swift_ide_test_dependency} ${copy_legacy_layouts_dep} COMMENT "Generating ${module_file}") set("${dependency_module_target_out_var_name}" "${module_dependency_target_static}" PARENT_SCOPE) else() set("${dependency_module_target_out_var_name}" "${module_dependency_target}" PARENT_SCOPE) endif() # macCatalyst zippered swiftmodule if(maccatalyst_build_flavor STREQUAL "zippered") get_target_triple(ios_like_target_triple ignored_target_variant "${SWIFTFILE_SDK}" "${SWIFTFILE_ARCHITECTURE}" MACCATALYST_BUILD_FLAVOR "ios-like") # Remove previous -target and -target-variant flags from # the zippered Swift flags and add an ios-like target. remove_given_flag(maccatalyst_swift_flags "target") remove_given_flag(maccatalyst_swift_flags "target-variant") list(APPEND maccatalyst_swift_flags "-target" "${ios_like_target_triple}") add_custom_command_target( maccatalyst_module_dependency_target COMMAND "${CMAKE_COMMAND}" "-E" "remove" "-f" ${maccatalyst_module_outputs} COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" ${maccatalyst_module_dir} ${maccatalyst_specific_module_dir} COMMAND ${set_environment_args} "$" "${line_directive_tool}" "@${file_path}" -- "${swift_compiler_tool}" "-emit-module" "-o" "${maccatalyst_module_file}" ${maccatalyst_swift_flags} ${maccatalyst_swift_module_flags} "@${file_path}" ${command_touch_maccatalyst_module_outputs} OUTPUT ${maccatalyst_module_outputs} DEPENDS "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${swift_ide_test_dependency} ${obj_dirs_dependency_target} ${copy_legacy_layouts_dep} COMMENT "Generating ${maccatalyst_module_file}") if(SWIFTFILE_STATIC) set(maccatalyst_command_copy_interface_file) if(maccatalyst_interface_file) set(maccatalyst_command_copy_interface_file COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${maccatalyst_interface_file} ${maccatalyst_interface_file_static} COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${maccatalyst_private_interface_file} ${maccatalyst_private_interface_file_static}) endif() add_custom_command_target( maccatalyst_module_dependency_target_static COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" ${maccatalyst_module_dir_static} ${maccatalyst_specific_module_dir_static} COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${maccatalyst_module_file} ${maccatalyst_module_file_static} COMMAND "${CMAKE_COMMAND}" "-E" "copy" ${maccatalyst_module_doc_file} ${maccatalyst_module_doc_file_static} ${maccatalyst_command_copy_interface_file} OUTPUT ${maccatalyst_module_outputs_static} DEPENDS "${maccatalyst_module_dependency_target}" "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${swift_ide_test_dependency} ${copy_legacy_layouts_dep} COMMENT "Generating ${maccatalyst_module_file_static}") set("${dependency_module_target_out_var_name}" "${module_dependency_target_static}" "${maccatalyst_module_dependency_target_static}" PARENT_SCOPE) else() set("${dependency_module_target_out_var_name}" "${module_dependency_target}" "${maccatalyst_module_dependency_target}" PARENT_SCOPE) endif() endif() # This is the target to generate the .sib files. It is not built by default. add_custom_command_target( sib_dependency_target COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND ${set_environment_args} "$" "${line_directive_tool}" "@${file_path}" -- "${swift_compiler_tool}" "-emit-sib" "-o" "${sib_file}" ${swift_flags} -Onone "@${file_path}" ${command_touch_sib_outputs} OUTPUT ${sib_outputs} DEPENDS "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${copy_legacy_layouts_dep} COMMENT "Generating ${sib_file}" EXCLUDE_FROM_ALL) set("${dependency_sib_target_out_var_name}" "${sib_dependency_target}" PARENT_SCOPE) add_custom_command_target( sibopt_dependency_target COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND ${set_environment_args} "$" "${line_directive_tool}" "@${file_path}" -- "${swift_compiler_tool}" "-emit-sib" "-o" "${sibopt_file}" ${swift_flags} -O "@${file_path}" ${command_touch_sibopt_outputs} OUTPUT ${sibopt_outputs} DEPENDS "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${copy_legacy_layouts_dep} COMMENT "Generating ${sibopt_file}" EXCLUDE_FROM_ALL) set("${dependency_sibopt_target_out_var_name}" "${sibopt_dependency_target}" PARENT_SCOPE) # This is the target to generate the .sibgen files. It is not built by default. add_custom_command_target( sibgen_dependency_target COMMAND "${CMAKE_COMMAND}" -E make_directory ${dirs_to_create} COMMAND ${set_environment_args} "$" "${line_directive_tool}" "@${file_path}" -- "${swift_compiler_tool}" "-emit-sibgen" "-o" "${sibgen_file}" ${swift_flags} "@${file_path}" ${command_touch_sibgen_outputs} OUTPUT ${sibgen_outputs} DEPENDS "${line_directive_tool}" "${file_path_target}" ${swift_compiler_tool_dep} ${source_files} ${SWIFTFILE_DEPENDS} ${copy_legacy_layouts_dep} COMMENT "Generating ${sibgen_file}" EXCLUDE_FROM_ALL) set("${dependency_sibgen_target_out_var_name}" "${sibgen_dependency_target}" PARENT_SCOPE) endif() # Make sure the build system knows the file is a generated object file. set_source_files_properties(${SWIFTFILE_OUTPUT} PROPERTIES GENERATED true EXTERNAL_OBJECT true LANGUAGE C OBJECT_DEPENDS "${source_files}") endfunction()