include(SwiftList) include(SwiftXcodeSupport) include(SwiftWindowsSupport) # SWIFTLIB_DIR is the directory in the build tree where Swift resource files # should be placed. Note that $CMAKE_CFG_INTDIR expands to "." for # single-configuration builds. set(SWIFTLIB_DIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib/swift") set(SWIFTSTATICLIB_DIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib/swift_static") function(add_dependencies_multiple_targets) cmake_parse_arguments( ADMT # prefix "" # options "" # single-value args "TARGETS;DEPENDS" # multi-value args ${ARGN}) precondition(ADMT_UNPARSED_ARGUMENTS NEGATE MESSAGE "unrecognized arguments: ${ADMT_UNPARSED_ARGUMENTS}") if(NOT "${ADMT_DEPENDS}" STREQUAL "") foreach(target ${ADMT_TARGETS}) add_dependencies("${target}" ${ADMT_DEPENDS}) endforeach() 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}/${arch}" PARENT_SCOPE) endfunction() function(_compute_lto_flag option out_var) string(TOLOWER "${option}" lowercase_option) if (lowercase_option STREQUAL "full") set(${out_var} "-flto=full" PARENT_SCOPE) elseif (lowercase_option STREQUAL "thin") set(${out_var} "-flto=thin" PARENT_SCOPE) endif() endfunction() function(_set_target_prefix_and_suffix target kind sdk) precondition(target MESSAGE "target is required") precondition(kind MESSAGE "kind is required") precondition(sdk MESSAGE "sdk is required") if(${sdk} STREQUAL ANDROID) if(${kind} STREQUAL STATIC) set_target_properties(${target} PROPERTIES PREFIX "lib" SUFFIX ".a") elseif(${kind} STREQUAL SHARED) set_target_properties(${target} PROPERTIES PREFIX "lib" SUFFIX ".so") endif() elseif(${sdk} STREQUAL WINDOWS) if(${kind} STREQUAL STATIC) set_target_properties(${target} PROPERTIES PREFIX "" SUFFIX ".lib") elseif(${kind} STREQUAL SHARED) set_target_properties(${target} PROPERTIES PREFIX "" SUFFIX ".dll") endif() endif() endfunction() function(is_darwin_based_sdk sdk_name out_var) if ("${sdk_name}" STREQUAL "OSX" OR "${sdk_name}" STREQUAL "IOS" OR "${sdk_name}" STREQUAL "IOS_SIMULATOR" OR "${sdk_name}" STREQUAL "TVOS" OR "${sdk_name}" STREQUAL "TVOS_SIMULATOR" OR "${sdk_name}" STREQUAL "WATCHOS" OR "${sdk_name}" STREQUAL "WATCHOS_SIMULATOR") set(${out_var} TRUE PARENT_SCOPE) else() set(${out_var} FALSE PARENT_SCOPE) endif() endfunction() # Usage: # _add_variant_c_compile_link_flags( # SDK sdk # ARCH arch # BUILD_TYPE build_type # ENABLE_LTO enable_lto # ANALYZE_CODE_COVERAGE analyze_code_coverage # RESULT_VAR_NAME result_var_name # DEPLOYMENT_VERSION_OSX version # If provided, overrides the default value of the OSX deployment target set by the Swift project for this compilation only. # DEPLOYMENT_VERSION_IOS version # DEPLOYMENT_VERSION_TVOS version # DEPLOYMENT_VERSION_WATCHOS version # # ) function(_add_variant_c_compile_link_flags) set(oneValueArgs SDK ARCH BUILD_TYPE RESULT_VAR_NAME ENABLE_LTO ANALYZE_CODE_COVERAGE DEPLOYMENT_VERSION_OSX DEPLOYMENT_VERSION_IOS DEPLOYMENT_VERSION_TVOS DEPLOYMENT_VERSION_WATCHOS) cmake_parse_arguments(CFLAGS "" "${oneValueArgs}" "" ${ARGN}) set(result ${${CFLAGS_RESULT_VAR_NAME}}) is_darwin_based_sdk("${CFLAGS_SDK}" IS_DARWIN) if(IS_DARWIN) # Check if there's a specific OS deployment version needed for this invocation if("${CFLAGS_SDK}" STREQUAL "OSX") set(DEPLOYMENT_VERSION ${CFLAGS_DEPLOYMENT_VERSION_OSX}) elseif("${CFLAGS_SDK}" STREQUAL "IOS" OR "${CFLAGS_SDK}" STREQUAL "IOS_SIMULATOR") set(DEPLOYMENT_VERSION ${CFLAGS_DEPLOYMENT_VERSION_IOS}) elseif("${CFLAGS_SDK}" STREQUAL "TVOS" OR "${CFLAGS_SDK}" STREQUAL "TVOS_SIMULATOR") set(DEPLOYMENT_VERSION ${CFLAGS_DEPLOYMENT_VERSION_TVOS}) elseif("${CFLAGS_SDK}" STREQUAL "WATCHOS" OR "${CFLAGS_SDK}" STREQUAL "WATCHOS_SIMULATOR") set(DEPLOYMENT_VERSION ${CFLAGS_DEPLOYMENT_VERSION_WATCHOS}) endif() if("${DEPLOYMENT_VERSION}" STREQUAL "") set(DEPLOYMENT_VERSION "${SWIFT_SDK_${CFLAGS_SDK}_DEPLOYMENT_VERSION}") endif() endif() # MSVC and clang-cl don't understand -target. if (NOT SWIFT_COMPILER_IS_MSVC_LIKE) list(APPEND result "-target" "${SWIFT_SDK_${CFLAGS_SDK}_ARCH_${CFLAGS_ARCH}_TRIPLE}${DEPLOYMENT_VERSION}") endif() set(_sysroot "${SWIFT_SDK_${CFLAGS_SDK}_ARCH_${CFLAGS_ARCH}_PATH}") if(IS_DARWIN) list(APPEND result "-isysroot" "${_sysroot}") elseif(NOT SWIFT_COMPILER_IS_MSVC_LIKE AND NOT "${_sysroot}" STREQUAL "/") list(APPEND result "--sysroot=${_sysroot}") endif() if("${CFLAGS_SDK}" STREQUAL "ANDROID") list(APPEND result "--sysroot=${SWIFT_ANDROID_SDK_PATH}" # Use the linker included in the Android NDK. "-B" "${SWIFT_ANDROID_PREBUILT_PATH}/arm-linux-androideabi/bin/") endif() if(IS_DARWIN) list(APPEND result "-arch" "${CFLAGS_ARCH}" "-F" "${SWIFT_SDK_${CFLAGS_SDK}_PATH}/../../../Developer/Library/Frameworks" "-m${SWIFT_SDK_${CFLAGS_SDK}_VERSION_MIN_NAME}-version-min=${DEPLOYMENT_VERSION}") endif() if(CFLAGS_ANALYZE_CODE_COVERAGE) list(APPEND result "-fprofile-instr-generate" "-fcoverage-mapping") endif() _compute_lto_flag("${CFLAGS_ENABLE_LTO}" _lto_flag_out) if (_lto_flag_out) list(APPEND result "${_lto_flag_out}") endif() set("${CFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE) endfunction() function(_add_variant_c_compile_flags) set(oneValueArgs SDK ARCH BUILD_TYPE ENABLE_ASSERTIONS ANALYZE_CODE_COVERAGE DEPLOYMENT_VERSION_OSX DEPLOYMENT_VERSION_IOS DEPLOYMENT_VERSION_TVOS DEPLOYMENT_VERSION_WATCHOS RESULT_VAR_NAME ENABLE_LTO) cmake_parse_arguments(CFLAGS "FORCE_BUILD_OPTIMIZED" "${oneValueArgs}" "" ${ARGN}) set(result ${${CFLAGS_RESULT_VAR_NAME}}) _add_variant_c_compile_link_flags( SDK "${CFLAGS_SDK}" ARCH "${CFLAGS_ARCH}" BUILD_TYPE "${CFLAGS_BUILD_TYPE}" ENABLE_ASSERTIONS "${CFLAGS_ENABLE_ASSERTIONS}" ENABLE_LTO "${CFLAGS_ENABLE_LTO}" ANALYZE_CODE_COVERAGE FALSE DEPLOYMENT_VERSION_OSX "${CFLAGS_DEPLOYMENT_VERSION_OSX}" DEPLOYMENT_VERSION_IOS "${CFLAGS_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_TVOS "${CFLAGS_DEPLOYMENT_VERSION_TVOS}" DEPLOYMENT_VERSION_WATCHOS "${CFLAGS_DEPLOYMENT_VERSION_WATCHOS}" RESULT_VAR_NAME result) is_build_type_optimized("${CFLAGS_BUILD_TYPE}" optimized) if(optimized OR CFLAGS_FORCE_BUILD_OPTIMIZED) list(APPEND result "-O2") # Omit leaf frame pointers on x86 production builds (optimized, no debug # info, and no asserts). is_build_type_with_debuginfo("${CFLAGS_BUILD_TYPE}" debug) if(NOT debug AND NOT CFLAGS_ENABLE_ASSERTIONS) if("${CFLAGS_ARCH}" STREQUAL "i386" OR "${CFLAGS_ARCH}" STREQUAL "i686") if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) list(APPEND result "-momit-leaf-frame-pointer") else() list(APPEND result "/Oy") endif() endif() endif() else() if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) list(APPEND result "-O0") else() list(APPEND result "/Od") endif() endif() # CMake automatically adds the flags for debug info if we use MSVC/clang-cl. if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) is_build_type_with_debuginfo("${CFLAGS_BUILD_TYPE}" debuginfo) if(debuginfo) _compute_lto_flag("${CFLAGS_ENABLE_LTO}" _lto_flag_out) if(_lto_flag_out) list(APPEND result "-gline-tables-only") else() list(APPEND result "-g") endif() else() list(APPEND result "-g0") endif() endif() if("${CFLAGS_SDK}" STREQUAL "WINDOWS") # MSVC doesn't support -Xclang. We don't need to manually specify # -D_MD or D_MDd either, as CMake does this automatically. if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") list(APPEND result -Xclang;--dependent-lib=oldnames) # TODO(compnerd) handle /MT, /MTd, /MD, /MDd if("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") list(APPEND result "-D_MDd") list(APPEND result -Xclang;--dependent-lib=msvcrtd) else() list(APPEND result "-D_MD") list(APPEND result -Xclang;--dependent-lib=msvcrt) endif() endif() # MSVC/clang-cl don't support -fno-pic or -fms-compatibility-version. if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) list(APPEND result -fno-pic) list(APPEND result "-fms-compatibility-version=1900") endif() list(APPEND result "-DLLVM_ON_WIN32") list(APPEND result "-D_CRT_SECURE_NO_WARNINGS") list(APPEND result "-D_CRT_NONSTDC_NO_WARNINGS") list(APPEND result "-D_CRT_USE_BUILTIN_OFFSETOF") # TODO(compnerd) permit building for different families list(APPEND result "-D_CRT_USE_WINAPI_FAMILY_DESKTOP_APP") if("${CFLAGS_ARCH}" MATCHES arm) list(APPEND result "-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE") endif() # TODO(compnerd) handle /MT list(APPEND result "-D_DLL") # NOTE: We assume that we are using VS 2015 U2+ list(APPEND result "-D_ENABLE_ATOMIC_ALIGNMENT_FIX") # msvcprt's std::function requires RTTI, but we do not want RTTI data. # Emulate /GR-. # TODO(compnerd) when moving up to VS 2017 15.3 and newer, we can disable # RTTI again if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) list(APPEND result -frtti) list(APPEND result -Xclang;-fno-rtti-data) endif() # NOTE: VS 2017 15.3 introduced this to disable the static components of # RTTI as well. This requires a newer SDK though and we do not have # guarantees on the SDK version currently. list(APPEND result "-D_HAS_STATIC_RTTI=0") endif() if(CFLAGS_ENABLE_ASSERTIONS) list(APPEND result "-UNDEBUG") else() list(APPEND result "-DNDEBUG") endif() if(SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS) list(APPEND result "-DSWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS") endif() if(CFLAGS_ANALYZE_CODE_COVERAGE) list(APPEND result "-fprofile-instr-generate" "-fcoverage-mapping") endif() if("${CFLAGS_SDK}" STREQUAL "ANDROID") # FIXME: Instead of hardcoding paths in the Android NDK, these paths should # be passed in via ENV, as with the Windows build. list(APPEND result "-I${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/include" "-I${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++abi/include" "-I${SWIFT_ANDROID_NDK_PATH}/sources/android/support/include") endif() set("${CFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE) endfunction() function(_add_variant_swift_compile_flags sdk arch build_type enable_assertions result_var_name) set(result ${${result_var_name}}) # On Windows, we don't set SWIFT_SDK_WINDOWS_PATH_ARCH_{ARCH}_PATH, so don't include it. if (NOT "${sdk}" STREQUAL "WINDOWS") list(APPEND result "-sdk" "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}") endif() is_darwin_based_sdk("${sdk}" IS_DARWIN) if(IS_DARWIN) list(APPEND result "-target" "${SWIFT_SDK_${sdk}_ARCH_${arch}_TRIPLE}${SWIFT_SDK_${sdk}_DEPLOYMENT_VERSION}") 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(IS_DARWIN) list(APPEND result "-F" "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}/../../../Developer/Library/Frameworks") endif() is_build_type_optimized("${build_type}" optimized) if(optimized) list(APPEND result "-O") else() list(APPEND result "-Onone") endif() is_build_type_with_debuginfo("${build_type}" debuginfo) if(debuginfo) list(APPEND result "-g") endif() if(enable_assertions) list(APPEND result "-D" "INTERNAL_CHECKS_ENABLED") endif() if (NOT SWIFT_ENABLE_GUARANTEED_NORMAL_ARGUMENTS) list(APPEND result "-Xfrontend" "-disable-guaranteed-normal-arguments") endif() if(SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS) list(APPEND result "-D" "SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS") endif() set("${result_var_name}" "${result}" PARENT_SCOPE) endfunction() function(_add_variant_link_flags) set(oneValueArgs SDK ARCH BUILD_TYPE ENABLE_ASSERTIONS ANALYZE_CODE_COVERAGE DEPLOYMENT_VERSION_OSX DEPLOYMENT_VERSION_IOS DEPLOYMENT_VERSION_TVOS DEPLOYMENT_VERSION_WATCHOS RESULT_VAR_NAME ENABLE_LTO LTO_OBJECT_NAME LIBRARY_SEARCH_DIRECTORIES_VAR_NAME) cmake_parse_arguments(LFLAGS "" "${oneValueArgs}" "" ${ARGN}) precondition(LFLAGS_SDK MESSAGE "Should specify an SDK") precondition(LFLAGS_ARCH MESSAGE "Should specify an architecture") set(result ${${LFLAGS_RESULT_VAR_NAME}}) set(library_search_directories ${${LFLAGS_LIBRARY_SEARCH_DIRECTORIES_VAR_NAME}}) _add_variant_c_compile_link_flags( SDK "${LFLAGS_SDK}" ARCH "${LFLAGS_ARCH}" BUILD_TYPE "${LFLAGS_BUILD_TYPE}" ENABLE_ASSERTIONS "${LFLAGS_ENABLE_ASSERTIONS}" ENABLE_LTO "${LFLAGS_ENABLE_LTO}" ANALYZE_CODE_COVERAGE "${LFLAGS_ANALYZE_CODE_COVERAGE}" DEPLOYMENT_VERSION_OSX "${LFLAGS_DEPLOYMENT_VERSION_OSX}" DEPLOYMENT_VERSION_IOS "${LFLAGS_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_TVOS "${LFLAGS_DEPLOYMENT_VERSION_TVOS}" DEPLOYMENT_VERSION_WATCHOS "${LFLAGS_DEPLOYMENT_VERSION_WATCHOS}" RESULT_VAR_NAME result) if("${LFLAGS_SDK}" STREQUAL "LINUX") list(APPEND result "-lpthread" "-latomic" "-ldl") elseif("${LFLAGS_SDK}" STREQUAL "FREEBSD") list(APPEND result "-lpthread") elseif("${LFLAGS_SDK}" STREQUAL "CYGWIN") # No extra libraries required. elseif("${LFLAGS_SDK}" STREQUAL "WINDOWS") # We don't need to add -nostdlib using MSVC or clang-cl, as MSVC and clang-cl rely on auto-linking entirely. if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) # NOTE: we do not use "/MD" or "/MDd" and select the runtime via linker # options. This causes conflicts. list(APPEND result "-nostdlib") endif() swift_windows_lib_for_arch(${LFLAGS_ARCH} ${LFLAGS_ARCH}_LIB) list(APPEND library_search_directories ${${LFLAGS_ARCH}_LIB}) elseif("${LFLAGS_SDK}" STREQUAL "HAIKU") list(APPEND result "-lbsd" "-latomic" "-Wl,-Bsymbolic") elseif("${LFLAGS_SDK}" STREQUAL "ANDROID") list(APPEND result "-ldl" "-llog" "-latomic" "-licudataswift" "-licui18nswift" "-licuucswift" "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so") list(APPEND library_search_directories "${SWIFT_ANDROID_PREBUILT_PATH}/arm-linux-androideabi/lib/armv7-a" "${SWIFT_ANDROID_PREBUILT_PATH}/lib/gcc/arm-linux-androideabi/${SWIFT_ANDROID_NDK_GCC_VERSION}.x") else() # If lto is enabled, we need to add the object path flag so that the LTO code # generator leaves the intermediate object file in a place where it will not # be touched. The reason why this must be done is that on OS X, debug info is # left in object files. So if the object file is removed when we go to # generate a dsym, the debug info is gone. if (LFLAGS_ENABLE_LTO) precondition(LFLAGS_LTO_OBJECT_NAME MESSAGE "Should specify a unique name for the lto object") set(lto_object_dir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) set(lto_object ${lto_object_dir}/${LFLAGS_LTO_OBJECT_NAME}-lto.o) list(APPEND result "-Wl,-object_path_lto,${lto_object}") endif() endif() if(NOT "${SWIFT_${LFLAGS_SDK}_${LFLAGS_ARCH}_ICU_UC}" STREQUAL "") get_filename_component(SWIFT_${sdk}_${arch}_ICU_UC_LIBDIR "${SWIFT_${sdk}_${arch}_ICU_UC}" DIRECTORY) list(APPEND library_search_directories "${SWIFT_${sdk}_${arch}_ICU_UC_LIBDIR}") endif() if(NOT "${SWIFT_${LFLAGS_SDK}_${LFLAGS_ARCH}_ICU_I18N}" STREQUAL "") get_filename_component(SWIFT_${sdk}_${arch}_ICU_I18N_LIBDIR "${SWIFT_${sdk}_${arch}_ICU_I18N}" DIRECTORY) list(APPEND library_search_directories "${SWIFT_${sdk}_${arch}_ICU_I18N_LIBDIR}") endif() if(NOT SWIFT_COMPILER_IS_MSVC_LIKE) find_program(LDLLD_PATH "ld.lld") # Strangely, macOS finds lld and then can't find it when using -fuse-ld= if((SWIFT_ENABLE_LLD_LINKER AND LDLLD_PATH AND NOT APPLE) OR ("${LFLAGS_SDK}" STREQUAL "WINDOWS" AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WINDOWS")) list(APPEND result "-fuse-ld=lld") elseif(SWIFT_ENABLE_GOLD_LINKER AND "${SWIFT_SDK_${LFLAGS_SDK}_OBJECT_FORMAT}" STREQUAL "ELF") list(APPEND result "-fuse-ld=gold") endif() endif() set("${LFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE) set("${LFLAGS_LIBRARY_SEARCH_DIRECTORIES_VAR_NAME}" "${library_search_directories}" PARENT_SCOPE) 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() # Add a universal binary target created from the output of the given # set of targets by running 'lipo'. # # Usage: # _add_swift_lipo_target( # sdk # The name of the SDK the target was created for. # # Examples include "OSX", "IOS", "ANDROID", etc. # target # The name of the target to create # output # The file to be created by this target # source_targets... # The source targets whose outputs will be # # lipo'd into the output. # ) function(_add_swift_lipo_target) cmake_parse_arguments( LIPO # prefix "CODESIGN" # options "SDK;TARGET;OUTPUT" # single-value args "" # multi-value args ${ARGN}) precondition(LIPO_SDK MESSAGE "sdk is required") precondition(LIPO_TARGET MESSAGE "target is required") precondition(LIPO_OUTPUT MESSAGE "output is required") precondition(LIPO_UNPARSED_ARGUMENTS MESSAGE "one or more inputs are required") set(source_targets ${LIPO_UNPARSED_ARGUMENTS}) # Gather the source binaries. set(source_binaries) foreach(source_target ${source_targets}) list(APPEND source_binaries $) endforeach() is_darwin_based_sdk("${LIPO_SDK}" IS_DARWIN) if(IS_DARWIN) if(LIPO_CODESIGN) set(codesign_command COMMAND "codesign" "-f" "-s" "-" "${LIPO_OUTPUT}") endif() # Use lipo to create the final binary. add_custom_command_target(unused_var COMMAND "${LIPO}" "-create" "-output" "${LIPO_OUTPUT}" ${source_binaries} ${codesign_command} CUSTOM_TARGET_NAME "${LIPO_TARGET}" OUTPUT "${LIPO_OUTPUT}" DEPENDS ${source_targets}) else() # We don't know how to create fat binaries for other platforms. add_custom_command_target(unused_var COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${source_binaries}" "${LIPO_OUTPUT}" CUSTOM_TARGET_NAME "${LIPO_TARGET}" OUTPUT "${LIPO_OUTPUT}" DEPENDS ${source_targets}) endif() endfunction() function(swift_target_link_search_directories target directories) set(STLD_FLAGS "") foreach(directory ${directories}) set(STLD_FLAGS "${STLD_FLAGS} \"${CMAKE_LIBRARY_PATH_FLAG}${directory}\"") endforeach() set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS ${STLD_FLAGS}) endfunction() # Add a single variant of a new Swift library. # # Usage: # _add_swift_library_single( # target # name # [MODULE_TARGET] # [SHARED] # [STATIC] # [SDK sdk] # [ARCHITECTURE architecture] # [DEPENDS dep1 ...] # [LINK_LIBRARIES dep1 ...] # [FRAMEWORK_DEPENDS dep1 ...] # [FRAMEWORK_DEPENDS_WEAK dep1 ...] # [LLVM_COMPONENT_DEPENDS comp1 ...] # [C_COMPILE_FLAGS flag1...] # [SWIFT_COMPILE_FLAGS flag1...] # [LINK_FLAGS flag1...] # [API_NOTES_NON_OVERLAY] # [FILE_DEPENDS target1 ...] # [DONT_EMBED_BITCODE] # [IS_STDLIB] # [FORCE_BUILD_OPTIMIZED] # [IS_STDLIB_CORE] # [IS_SDK_OVERLAY] # [FORCE_BUILD_FOR_HOST_SDK] # 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). # # MODULE_TARGET # Name of the module target (e.g., swiftParse-swiftmodule-IOS-armv7). # # SHARED # Build a shared library. # # STATIC # Build a static library. # # SDK sdk # SDK to build for. # # ARCHITECTURE # Architecture to build for. # # DEPENDS # Targets that this library depends on. # # LINK_LIBRARIES # Libraries this library depends on. # # FRAMEWORK_DEPENDS # System frameworks this library depends on. # # FRAMEWORK_DEPENDS_WEAK # System frameworks this library depends on that should be weakly-linked. # # LLVM_COMPONENT_DEPENDS # LLVM components this library depends on. # # C_COMPILE_FLAGS # Extra compile flags (C, C++, ObjC). # # SWIFT_COMPILE_FLAGS # Extra compile flags (Swift). # # LINK_FLAGS # Extra linker flags. # # API_NOTES_NON_OVERLAY # Generate API notes for non-overlayed modules with this target. # # FILE_DEPENDS # Additional files this library depends on. # # DONT_EMBED_BITCODE # Don't embed LLVM bitcode in this target, even if it is enabled globally. # # IS_STDLIB # Install library dylib and swift module files to lib/swift. # # IS_STDLIB_CORE # Compile as the standard library core. # # IS_SDK_OVERLAY # Treat the library as a part of the Swift SDK overlay. # # INSTALL_IN_COMPONENT comp # The Swift installation component that this library belongs to. # # FORCE_BUILD_FOR_HOST_SDK # Regardless of the defaults, also build this library for the host SDK. # # source1 ... # Sources to add into this library function(_add_swift_library_single target name) set(SWIFTLIB_SINGLE_options API_NOTES_NON_OVERLAY DONT_EMBED_BITCODE FORCE_BUILD_FOR_HOST_SDK FORCE_BUILD_OPTIMIZED IS_SDK_OVERLAY IS_STDLIB IS_STDLIB_CORE NOSWIFTRT OBJECT_LIBRARY SHARED STATIC TARGET_LIBRARY) set(SWIFTLIB_SINGLE_single_parameter_options ARCHITECTURE DEPLOYMENT_VERSION_IOS DEPLOYMENT_VERSION_OSX DEPLOYMENT_VERSION_TVOS DEPLOYMENT_VERSION_WATCHOS INSTALL_IN_COMPONENT MODULE_TARGET SDK) set(SWIFTLIB_SINGLE_multiple_parameter_options C_COMPILE_FLAGS DEPENDS FILE_DEPENDS FRAMEWORK_DEPENDS FRAMEWORK_DEPENDS_WEAK INCORPORATE_OBJECT_LIBRARIES INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY INTERFACE_LINK_LIBRARIES LINK_FLAGS LINK_LIBRARIES LLVM_COMPONENT_DEPENDS PRIVATE_LINK_LIBRARIES SWIFT_COMPILE_FLAGS) cmake_parse_arguments(SWIFTLIB_SINGLE "${SWIFTLIB_SINGLE_options}" "${SWIFTLIB_SINGLE_single_parameter_options}" "${SWIFTLIB_SINGLE_multiple_parameter_options}" ${ARGN}) 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") if(NOT SWIFTLIB_SINGLE_SHARED AND NOT SWIFTLIB_SINGLE_STATIC AND NOT SWIFTLIB_SINGLE_OBJECT_LIBRARY) message(FATAL_ERROR "Either SHARED, STATIC, or OBJECT_LIBRARY 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}") # Include LLVM Bitcode slices for iOS, Watch OS, and Apple TV OS device libraries. set(embed_bitcode_arg) if(SWIFT_EMBED_BITCODE_SECTION AND NOT SWIFTLIB_SINGLE_DONT_EMBED_BITCODE) 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") list(APPEND SWIFTLIB_SINGLE_LINK_FLAGS "-Xlinker" "-bitcode_bundle" "-Xlinker" "-bitcode_hide_symbols" "-Xlinker" "-lto_library" "-Xlinker" "${LLVM_LIBRARY_DIR}/libLTO.dylib") set(embed_bitcode_arg EMBED_BITCODE) endif() endif() if (SWIFT_COMPILER_VERSION) is_darwin_based_sdk("${SWIFTLIB_SINGLE_SDK}" IS_DARWIN) if(IS_DARWIN) list(APPEND SWIFTLIB_SINGLE_LINK_FLAGS "-Xlinker" "-current_version" "-Xlinker" "${SWIFT_COMPILER_VERSION}" "-Xlinker" "-compatibility_version" "-Xlinker" "1") 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 ${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 ${SWIFT_SOURCE_DIR}/include/swift${dir}/*.td) set_source_files_properties(${SWIFTLIB_SINGLE_HEADERS} ${SWIFTLIB_SINGLE_TDS} PROPERTIES HEADER_FILE_ONLY true) source_group("TableGen descriptions" FILES ${SWIFTLIB_SINGLE_TDS}) set(SWIFTLIB_SINGLE_SOURCES ${SWIFTLIB_SINGLE_SOURCES} ${SWIFTLIB_SINGLE_HEADERS} ${SWIFTLIB_SINGLE_TDS}) endif() if(MODULE) set(libkind MODULE) elseif(SWIFTLIB_SINGLE_OBJECT_LIBRARY) set(libkind OBJECT) # If both SHARED and STATIC are specified, we add the SHARED library first. # The STATIC library is handled further below. elseif(SWIFTLIB_SINGLE_SHARED) set(libkind SHARED) elseif(SWIFTLIB_SINGLE_STATIC) set(libkind STATIC) else() message(FATAL_ERROR "Either SHARED, STATIC, or OBJECT_LIBRARY must be specified") endif() handle_gyb_sources( gyb_dependency_targets SWIFTLIB_SINGLE_SOURCES "${SWIFTLIB_SINGLE_ARCHITECTURE}") # Figure out whether and which API notes to create. set(SWIFTLIB_SINGLE_API_NOTES) if(SWIFTLIB_SINGLE_API_NOTES_NON_OVERLAY) # Adopt all of the non-overlay API notes. foreach(framework_name ${SWIFT_API_NOTES_INPUTS}) if (${framework_name} STREQUAL "WatchKit" AND ${SWIFTLIB_SINGLE_SDK} STREQUAL "OSX") # HACK: don't build WatchKit API notes for OS X. else() if (NOT IS_DIRECTORY "${SWIFT_SOURCE_DIR}/stdlib/public/SDK/${framework_name}") list(APPEND SWIFTLIB_SINGLE_API_NOTES "${framework_name}") endif() endif() endforeach() endif() # Remove the "swift" prefix from the name to determine the module name. if(SWIFTLIB_IS_STDLIB_CORE) set(module_name "Swift") else() string(REPLACE swift "" module_name "${name}") endif() if("${module_name}" IN_LIST SWIFT_API_NOTES_INPUTS) set(SWIFTLIB_SINGLE_API_NOTES "${module_name}") endif() if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "WINDOWS") swift_windows_include_for_arch(${SWIFTLIB_SINGLE_ARCHITECTURE} SWIFTLIB_INCLUDE) swift_windows_generate_sdk_vfs_overlay(SWIFTLIB_SINGLE_VFS_OVERLAY_FLAGS) foreach(flag ${SWIFTLIB_SINGLE_VFS_OVERLAY_FLAGS}) list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xcc;${flag}) list(APPEND SWIFTLIB_SINGLE_C_COMPILE_FLAGS ${flag}) endforeach() foreach(directory ${SWIFTLIB_INCLUDE}) list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-I${directory}) endforeach() if("${SWIFTLIB_SINGLE_ARCHITECTURE}" MATCHES arm) list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xcc;-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE) endif() list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-autolink-library;-Xfrontend;oldnames) # TODO(compnerd) handle /MT and /MTd if("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE") list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-autolink-library;-Xfrontend;msvcrt) else() list(APPEND SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS -Xfrontend;-autolink-library;-Xfrontend;msvcrtd) endif() endif() # FIXME: don't actually depend on the libraries in SWIFTLIB_SINGLE_LINK_LIBRARIES, # just any swiftmodule files that are associated with them. handle_swift_sources( swift_object_dependency_target swift_module_dependency_target swift_sib_dependency_target swift_sibopt_dependency_target swift_sibgen_dependency_target SWIFTLIB_SINGLE_SOURCES SWIFTLIB_SINGLE_EXTERNAL_SOURCES ${name} DEPENDS ${gyb_dependency_targets} ${SWIFTLIB_SINGLE_DEPENDS} ${SWIFTLIB_SINGLE_FILE_DEPENDS} ${SWIFTLIB_SINGLE_LINK_LIBRARIES} ${SWIFTLIB_SINGLE_INTERFACE_LINK_LIBRARIES} SDK ${SWIFTLIB_SINGLE_SDK} ARCHITECTURE ${SWIFTLIB_SINGLE_ARCHITECTURE} API_NOTES ${SWIFTLIB_SINGLE_API_NOTES} MODULE_NAME ${module_name} COMPILE_FLAGS ${SWIFTLIB_SINGLE_SWIFT_COMPILE_FLAGS} ${SWIFTLIB_SINGLE_IS_STDLIB_keyword} ${SWIFTLIB_SINGLE_IS_STDLIB_CORE_keyword} ${SWIFTLIB_SINGLE_IS_SDK_OVERLAY_keyword} ${embed_bitcode_arg} INSTALL_IN_COMPONENT "${SWIFTLIB_INSTALL_IN_COMPONENT}") add_swift_source_group("${SWIFTLIB_SINGLE_EXTERNAL_SOURCES}") # If there were any swift sources, then a .swiftmodule may have been created. # If that is the case, then add a target which is an alias of the module files. set(VARIANT_SUFFIX "-${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_LIB_SUBDIR}-${SWIFTLIB_SINGLE_ARCHITECTURE}") if(NOT "${SWIFTLIB_SINGLE_MODULE_TARGET}" STREQUAL "" AND NOT "${swift_module_dependency_target}" STREQUAL "") add_custom_target("${SWIFTLIB_SINGLE_MODULE_TARGET}" DEPENDS ${swift_module_dependency_target}) set_target_properties("${SWIFTLIB_SINGLE_MODULE_TARGET}" PROPERTIES FOLDER "Swift libraries/Modules") endif() # For standalone overlay builds to work if(NOT BUILD_STANDALONE) if (EXISTS swift_sib_dependency_target AND NOT "${swift_sib_dependency_target}" STREQUAL "") add_dependencies(swift-stdlib${VARIANT_SUFFIX}-sib ${swift_sib_dependency_target}) endif() if (EXISTS swift_sibopt_dependency_target AND NOT "${swift_sibopt_dependency_target}" STREQUAL "") add_dependencies(swift-stdlib${VARIANT_SUFFIX}-sibopt ${swift_sibopt_dependency_target}) endif() if (EXISTS swift_sibgen_dependency_target AND NOT "${swift_sibgen_dependency_target}" STREQUAL "") add_dependencies(swift-stdlib${VARIANT_SUFFIX}-sibgen ${swift_sibgen_dependency_target}) endif() endif() set(SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS) foreach(object_library ${SWIFTLIB_SINGLE_INCORPORATE_OBJECT_LIBRARIES}) list(APPEND SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS $) endforeach() set(SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS_SHARED_ONLY) foreach(object_library ${SWIFTLIB_SINGLE_INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY}) list(APPEND SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS_SHARED_ONLY $) endforeach() set(SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES) if(XCODE AND SWIFTLIB_SINGLE_TARGET_LIBRARY) set(SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES # Note: the dummy.cpp source file provides no definitions. However, # it forces Xcode to properly link the static library. ${SWIFT_SOURCE_DIR}/cmake/dummy.cpp) endif() set(INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS ${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS}) if(${libkind} STREQUAL "SHARED") list(APPEND INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS ${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS_SHARED_ONLY}) endif() add_library("${target}" ${libkind} ${SWIFTLIB_SINGLE_SOURCES} ${SWIFTLIB_SINGLE_EXTERNAL_SOURCES} ${INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS} ${SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES}) if(("${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_OBJECT_FORMAT}" STREQUAL "ELF" OR "${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_OBJECT_FORMAT}" STREQUAL "COFF") AND SWIFTLIB_TARGET_LIBRARY) if("${libkind}" STREQUAL "SHARED" AND NOT SWIFTLIB_SINGLE_NOSWIFTRT) # TODO(compnerd) switch to the generator expression when cmake is upgraded # to a version which supports it. # target_sources(${target} # PRIVATE # $) target_sources(${target} PRIVATE "${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}/swiftrt${CMAKE_C_OUTPUT_EXTENSION}") set_source_files_properties("${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}/swiftrt${CMAKE_C_OUTPUT_EXTENSION}" PROPERTIES GENERATED 1) endif() endif() _set_target_prefix_and_suffix("${target}" "${libkind}" "${SWIFTLIB_SINGLE_SDK}") if(SWIFTLIB_SINGLE_TARGET_LIBRARY) if(NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_UC_INCLUDE}" STREQUAL "" AND NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_UC_INCLUDE}" STREQUAL "/usr/include" AND NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_UC_INCLUDE}" STREQUAL "/usr/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_ARCH_${SWIFTLIB_SINGLE_ARCHITECTURE}_TRIPLE}/include" AND NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_UC_INCLUDE}" STREQUAL "/usr/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${SWIFT_HOST_VARIANT_ARCH}_TRIPLE}/include") target_include_directories("${target}" SYSTEM PRIVATE "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_UC_INCLUDE}") endif() if(NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_I18N_INCLUDE}" STREQUAL "" AND NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_I18N_INCLUDE}" STREQUAL "/usr/include" AND NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_I18N_INCLUDE}" STREQUAL "/usr/${SWIFT_SDK_${SWIFTLIB_SINGLE_SDK}_ARCH_${SWIFTLIB_SINGLE_ARCHITECTURE}_TRIPLE}/include" AND NOT "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_I18N_INCLUDE}" STREQUAL "/usr/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${SWIFT_HOST_VARIANT_ARCH}_TRIPLE}/include") target_include_directories("${target}" SYSTEM PRIVATE "${SWIFT_${SWIFTLIB_SINGLE_SDK}_${SWIFTLIB_SINGLE_ARCHITECTURE}_ICU_I18N_INCLUDE}") endif() endif() if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "WINDOWS") swift_windows_include_for_arch(${SWIFTLIB_SINGLE_ARCHITECTURE} 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() set_property(TARGET "${target}" PROPERTY NO_SONAME ON) endif() llvm_update_compile_flags(${target}) set_output_directory(${target} BINARY_DIR ${SWIFT_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${SWIFT_LIBRARY_OUTPUT_INTDIR}) if(MODULE) set_target_properties("${target}" PROPERTIES PREFIX "" SUFFIX ${LLVM_PLUGIN_EXT}) endif() if(SWIFTLIB_SINGLE_TARGET_LIBRARY) # Install runtime libraries to lib/swift instead of lib. This works around # the fact that -isysroot prevents linking to libraries in the system # /usr/lib if Swift is installed in /usr. set_target_properties("${target}" PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR} ARCHIVE_OUTPUT_DIRECTORY ${SWIFTLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}) foreach(config ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${config} config_upper) escape_path_for_xcode("${config}" "${SWIFTLIB_DIR}" config_lib_dir) set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${config_upper} ${config_lib_dir}/${SWIFTLIB_SINGLE_SUBDIR} ARCHIVE_OUTPUT_DIRECTORY_${config_upper} ${config_lib_dir}/${SWIFTLIB_SINGLE_SUBDIR}) endforeach() endif() is_darwin_based_sdk("${SWIFTLIB_SINGLE_SDK}" IS_DARWIN) if(IS_DARWIN) set(install_name_dir "@rpath") if(SWIFTLIB_SINGLE_IS_STDLIB) # Always use @rpath for XCTest. if(NOT "${module_name}" STREQUAL "XCTest") set(install_name_dir "${SWIFT_DARWIN_STDLIB_INSTALL_NAME_DIR}") endif() endif() set_target_properties("${target}" PROPERTIES INSTALL_NAME_DIR "${install_name_dir}") elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX" AND NOT "${SWIFTLIB_SINGLE_SDK}" STREQUAL "ANDROID") set_target_properties("${target}" PROPERTIES INSTALL_RPATH "$ORIGIN:/usr/lib/swift/linux") elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "CYGWIN") set_target_properties("${target}" PROPERTIES INSTALL_RPATH "$ORIGIN:/usr/lib/swift/cygwin") endif() set_target_properties("${target}" PROPERTIES BUILD_WITH_INSTALL_RPATH YES) set_target_properties("${target}" PROPERTIES FOLDER "Swift libraries") # Configure the static library target. # Set compile and link flags for the non-static target. # Do these LAST. set(target_static) if(SWIFTLIB_SINGLE_IS_STDLIB AND SWIFTLIB_SINGLE_STATIC) set(target_static "${target}-static") # We have already compiled Swift sources. Link everything into a static # library. add_library(${target_static} STATIC ${SWIFTLIB_SINGLE_SOURCES} ${SWIFTLIB_INCORPORATED_OBJECT_LIBRARIES_EXPRESSIONS} ${SWIFTLIB_SINGLE_XCODE_WORKAROUND_SOURCES}) set_output_directory(${target_static} BINARY_DIR ${SWIFT_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${SWIFT_LIBRARY_OUTPUT_INTDIR}) foreach(config ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${config} config_upper) escape_path_for_xcode( "${config}" "${SWIFTSTATICLIB_DIR}" config_lib_dir) set_target_properties(${target_static} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${config_upper} ${config_lib_dir}/${SWIFTLIB_SINGLE_SUBDIR} ARCHIVE_OUTPUT_DIRECTORY_${config_upper} ${config_lib_dir}/${SWIFTLIB_SINGLE_SUBDIR}) endforeach() set_target_properties(${target_static} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${SWIFTSTATICLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR} ARCHIVE_OUTPUT_DIRECTORY ${SWIFTSTATICLIB_DIR}/${SWIFTLIB_SINGLE_SUBDIR}) endif() set_target_properties(${target} PROPERTIES # Library name (without the variant information) OUTPUT_NAME ${name}) if(target_static) set_target_properties(${target_static} PROPERTIES OUTPUT_NAME ${name}) endif() # Don't build standard libraries by default. We will enable building # standard libraries that the user requested; the rest can be built on-demand. if(SWIFTLIB_SINGLE_TARGET_LIBRARY) foreach(t "${target}" ${target_static}) set_target_properties(${t} PROPERTIES EXCLUDE_FROM_ALL TRUE) endforeach() endif() # Handle linking and dependencies. add_dependencies_multiple_targets( TARGETS "${target}" ${target_static} DEPENDS ${SWIFTLIB_SINGLE_DEPENDS} ${gyb_dependency_targets} "${swift_object_dependency_target}" "${swift_module_dependency_target}" ${LLVM_COMMON_DEPENDS}) # HACK: On some systems or build directory setups, CMake will not find static # archives of Clang libraries in the Clang build directory, and it will pass # them as '-lclangFoo'. Some other logic in CMake would reorder libraries # specified with this syntax, which breaks linking. set(prefixed_link_libraries) foreach(dep ${SWIFTLIB_SINGLE_LINK_LIBRARIES}) if("${dep}" MATCHES "^clang") if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "WINDOWS") set(dep "${LLVM_LIBRARY_OUTPUT_INTDIR}/${dep}.lib") else() set(dep "${LLVM_LIBRARY_OUTPUT_INTDIR}/lib${dep}.a") endif() endif() list(APPEND prefixed_link_libraries "${dep}") endforeach() set(SWIFTLIB_SINGLE_LINK_LIBRARIES "${prefixed_link_libraries}") if("${libkind}" STREQUAL "SHARED") target_link_libraries("${target}" PRIVATE ${SWIFTLIB_SINGLE_LINK_LIBRARIES}) elseif("${libkind}" STREQUAL "OBJECT") precondition_list_empty( "${SWIFTLIB_SINGLE_LINK_LIBRARIES}" "OBJECT_LIBRARY may not link to anything") else() target_link_libraries("${target}" INTERFACE ${SWIFTLIB_SINGLE_LINK_LIBRARIES}) endif() # Don't add the icucore target. set(SWIFTLIB_SINGLE_LINK_LIBRARIES_WITHOUT_ICU) foreach(item ${SWIFTLIB_SINGLE_LINK_LIBRARIES}) if(NOT "${item}" STREQUAL "icucore") list(APPEND SWIFTLIB_SINGLE_LINK_LIBRARIES_WITHOUT_ICU "${item}") endif() endforeach() if(target_static) _list_add_string_suffix( "${SWIFTLIB_SINGLE_LINK_LIBRARIES_WITHOUT_ICU}" "-static" target_static_depends) # FIXME: should this be target_link_libraries? add_dependencies_multiple_targets( TARGETS "${target_static}" DEPENDS ${target_static_depends}) endif() # Link against system frameworks. foreach(FRAMEWORK ${SWIFTLIB_SINGLE_FRAMEWORK_DEPENDS}) foreach(t "${target}" ${target_static}) target_link_libraries("${t}" PUBLIC "-framework ${FRAMEWORK}") endforeach() endforeach() foreach(FRAMEWORK ${SWIFTLIB_SINGLE_FRAMEWORK_DEPENDS_WEAK}) foreach(t "${target}" ${target_static}) target_link_libraries("${t}" PUBLIC "-weak_framework ${FRAMEWORK}") endforeach() endforeach() if(NOT SWIFTLIB_SINGLE_TARGET_LIBRARY) # Call llvm_config() only for libraries that are part of the compiler. swift_common_llvm_config("${target}" ${SWIFTLIB_SINGLE_LLVM_COMPONENT_DEPENDS}) endif() # 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(link_flags ${SWIFTLIB_SINGLE_LINK_FLAGS}) 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}") # Add variant-specific flags. if(SWIFTLIB_SINGLE_TARGET_LIBRARY) set(build_type "${SWIFT_STDLIB_BUILD_TYPE}") set(enable_assertions "${SWIFT_STDLIB_ASSERTIONS}") else() set(build_type "${CMAKE_BUILD_TYPE}") set(enable_assertions "${LLVM_ENABLE_ASSERTIONS}") set(analyze_code_coverage "${SWIFT_ANALYZE_CODE_COVERAGE}") endif() if (NOT SWIFTLIB_SINGLE_TARGET_LIBRARY) set(lto_type "${SWIFT_TOOLS_ENABLE_LTO}") endif() _add_variant_c_compile_flags( SDK "${SWIFTLIB_SINGLE_SDK}" ARCH "${SWIFTLIB_SINGLE_ARCHITECTURE}" BUILD_TYPE "${build_type}" ENABLE_ASSERTIONS "${enable_assertions}" ANALYZE_CODE_COVERAGE "${analyze_code_coverage}" ENABLE_LTO "${lto_type}" DEPLOYMENT_VERSION_OSX "${SWIFTLIB_DEPLOYMENT_VERSION_OSX}" DEPLOYMENT_VERSION_IOS "${SWIFTLIB_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_TVOS "${SWIFTLIB_DEPLOYMENT_VERSION_TVOS}" DEPLOYMENT_VERSION_WATCHOS "${SWIFTLIB_DEPLOYMENT_VERSION_WATCHOS}" "${SWIFTLIB_FORCE_BUILD_OPTIMIZED_keyword}" RESULT_VAR_NAME c_compile_flags ) _add_variant_link_flags( SDK "${SWIFTLIB_SINGLE_SDK}" ARCH "${SWIFTLIB_SINGLE_ARCHITECTURE}" BUILD_TYPE "${build_type}" ENABLE_ASSERTIONS "${enable_assertions}" ANALYZE_CODE_COVERAGE "${analyze_code_coverage}" ENABLE_LTO "${lto_type}" LTO_OBJECT_NAME "${target}-${SWIFTLIB_SINGLE_SDK}-${SWIFTLIB_SINGLE_ARCHITECTURE}" DEPLOYMENT_VERSION_OSX "${SWIFTLIB_DEPLOYMENT_VERSION_OSX}" DEPLOYMENT_VERSION_IOS "${SWIFTLIB_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_TVOS "${SWIFTLIB_DEPLOYMENT_VERSION_TVOS}" DEPLOYMENT_VERSION_WATCHOS "${SWIFTLIB_DEPLOYMENT_VERSION_WATCHOS}" RESULT_VAR_NAME link_flags LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories ) # Configure plist creation for OS X. set(PLIST_INFO_PLIST "Info.plist" CACHE STRING "Plist name") if("${SWIFTLIB_SINGLE_SDK}" IN_LIST SWIFT_APPLE_PLATFORMS AND SWIFTLIB_SINGLE_IS_STDLIB) set(PLIST_INFO_NAME ${name}) set(PLIST_INFO_UTI "com.apple.dt.runtime.${name}") set(PLIST_INFO_VERSION "${SWIFT_VERSION}") if (SWIFT_COMPILER_VERSION) set(PLIST_INFO_BUILD_VERSION "${SWIFT_COMPILER_VERSION}") endif() set(PLIST_INFO_PLIST_OUT "${PLIST_INFO_PLIST}") list(APPEND link_flags "-Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_BINARY_DIR}/${PLIST_INFO_PLIST_OUT}") configure_file( "${SWIFT_SOURCE_DIR}/stdlib/${PLIST_INFO_PLIST}.in" "${PLIST_INFO_PLIST_OUT}" @ONLY NEWLINE_STYLE UNIX) # If Application Extensions are enabled, pass the linker flag marking # the dylib as safe. if (CXX_SUPPORTS_FAPPLICATION_EXTENSION AND (NOT DISABLE_APPLICATION_EXTENSION)) list(APPEND link_flags "-Wl,-application_extension") endif() set(PLIST_INFO_UTI) set(PLIST_INFO_NAME) set(PLIST_INFO_VERSION) set(PLIST_INFO_BUILD_VERSION) endif() # Convert variables to space-separated strings. _list_escape_for_shell("${c_compile_flags}" c_compile_flags) _list_escape_for_shell("${link_flags}" link_flags) # Set compilation and link flags. set_property(TARGET "${target}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${c_compile_flags}") set_property(TARGET "${target}" APPEND_STRING PROPERTY LINK_FLAGS " ${link_flags}") swift_target_link_search_directories("${target}" "${library_search_directories}") # Adjust the linked libraries for windows targets. On Windows, the link is # performed against the import library, and the runtime uses the dll. Not # doing so will result in incorrect symbol resolution and linkage. We created # import library targets when the library was added. Use that to adjust the # link libraries. if("${SWIFTLIB_SINGLE_SDK}" STREQUAL "WINDOWS") foreach(library_list LINK_LIBRARIES INTERFACE_LINK_LIBRARIES PRIVATE_LINK_LIBRARIES) set(import_libraries) foreach(library ${SWIFTLIB_SINGLE_${library_list}}) # Ensure that the library is a target. If an absolute path was given, # then we do not have an import library associated with it. This occurs # primarily with ICU (which will be an import library). Import # libraries are only associated with shared libraries, so add an # additional check for that as well. set(import_library ${library}) if(TARGET ${library} AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") get_target_property(type ${library} TYPE) if(${type} STREQUAL "SHARED_LIBRARY") set(import_library ${library}_IMPLIB) endif() endif() list(APPEND import_libraries ${import_library}) endforeach() set(SWIFTLIB_SINGLE_${library_list} ${import_libraries}) endforeach() endif() if("${libkind}" STREQUAL "OBJECT") precondition_list_empty( "${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}" "OBJECT_LIBRARY may not link to anything") else() target_link_libraries("${target}" PRIVATE ${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}) endif() if("${libkind}" STREQUAL "OBJECT") precondition_list_empty( "${SWIFTLIB_SINGLE_INTERFACE_LINK_LIBRARIES}" "OBJECT_LIBRARY may not link to anything") else() target_link_libraries("${target}" INTERFACE ${SWIFTLIB_SINGLE_INTERFACE_LINK_LIBRARIES}) endif() set_property(TARGET "${target}" PROPERTY LINKER_LANGUAGE "CXX") if(target_static) set_property(TARGET "${target_static}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${c_compile_flags}") set(library_search_directories "${SWIFTSTATICLIB_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}") swift_target_link_search_directories("${target_static}" "${library_search_directories}") target_link_libraries("${target_static}" PRIVATE ${SWIFTLIB_SINGLE_PRIVATE_LINK_LIBRARIES}) endif() # Do not add code here. endfunction() # Add a new Swift library. # # Usage: # add_swift_library(name # [SHARED] # [STATIC] # [DEPENDS dep1 ...] # [LINK_LIBRARIES dep1 ...] # [INTERFACE_LINK_LIBRARIES dep1 ...] # [SWIFT_MODULE_DEPENDS dep1 ...] # [FRAMEWORK_DEPENDS dep1 ...] # [FRAMEWORK_DEPENDS_WEAK dep1 ...] # [LLVM_COMPONENT_DEPENDS comp1 ...] # [FILE_DEPENDS target1 ...] # [TARGET_SDKS sdk1...] # [C_COMPILE_FLAGS flag1...] # [SWIFT_COMPILE_FLAGS flag1...] # [LINK_FLAGS flag1...] # [DONT_EMBED_BITCODE] # [API_NOTES_NON_OVERLAY] # [INSTALL] # [IS_STDLIB] # [IS_STDLIB_CORE] # [TARGET_LIBRARY] # [FORCE_BUILD_FOR_HOST_SDK] # INSTALL_IN_COMPONENT comp # DEPLOYMENT_VERSION_OSX version # DEPLOYMENT_VERSION_IOS version # DEPLOYMENT_VERSION_TVOS version # DEPLOYMENT_VERSION_WATCHOS version # source1 [source2 source3 ...]) # # name # Name of the library (e.g., swiftParse). # # SHARED # Build a shared library. # # STATIC # Build a static library. # # DEPENDS # Targets that this library depends on. # # LINK_LIBRARIES # Libraries this library depends on. # # SWIFT_MODULE_DEPENDS # Swift modules this library depends on. # # SWIFT_MODULE_DEPENDS_OSX # Swift modules this library depends on when built for OS X. # # SWIFT_MODULE_DEPENDS_IOS # Swift modules this library depends on when built for iOS. # # SWIFT_MODULE_DEPENDS_TVOS # Swift modules this library depends on when built for tvOS. # # SWIFT_MODULE_DEPENDS_WATCHOS # Swift modules this library depends on when built for watchOS. # # SWIFT_MODULE_DEPENDS_FREEBSD # Swift modules this library depends on when built for FreeBSD. # # SWIFT_MODULE_DEPENDS_LINUX # Swift modules this library depends on when built for Linux. # # SWIFT_MODULE_DEPENDS_CYGWIN # Swift modules this library depends on when built for Cygwin. # # SWIFT_MODULE_DEPENDS_HAIKU # Swift modules this library depends on when built for Haiku. # # FRAMEWORK_DEPENDS # System frameworks this library depends on. # # FRAMEWORK_DEPENDS_WEAK # System frameworks this library depends on that should be weak-linked # # LLVM_COMPONENT_DEPENDS # LLVM components this library depends on. # # FILE_DEPENDS # Additional files this library depends on. # # TARGET_SDKS # The set of SDKs in which this library is included. If empty, the library # is included in all SDKs. # # C_COMPILE_FLAGS # Extra compiler flags (C, C++, ObjC). # # SWIFT_COMPILE_FLAGS # Extra compiler flags (Swift). # # LINK_FLAGS # Extra linker flags. # # API_NOTES_NON_OVERLAY # Generate API notes for non-overlayed modules with this target. # # DONT_EMBED_BITCODE # Don't embed LLVM bitcode in this target, even if it is enabled globally. # # IS_STDLIB # Treat the library as a part of the Swift standard library. # IS_STDLIB implies TARGET_LIBRARY. # # IS_STDLIB_CORE # Compile as the Swift standard library core. # # IS_SDK_OVERLAY # Treat the library as a part of the Swift SDK overlay. # IS_SDK_OVERLAY implies TARGET_LIBRARY and IS_STDLIB. # # TARGET_LIBRARY # Build library for the target SDKs. # # INSTALL_IN_COMPONENT comp # The Swift installation component that this library belongs to. # # DEPLOYMENT_VERSION_OSX # The minimum deployment version to build for if this is an OSX library. # # DEPLOYMENT_VERSION_IOS # The minimum deployment version to build for if this is an iOS library. # # DEPLOYMENT_VERSION_TVOS # The minimum deployment version to build for if this is an TVOS library. # # DEPLOYMENT_VERSION_WATCHOS # The minimum deployment version to build for if this is an WATCHOS library. # # FORCE_BUILD_FOR_HOST_SDK # Regardless of the defaults, also build this library for the host SDK. # # source1 ... # Sources to add into this library. function(add_swift_library name) set(SWIFTLIB_options API_NOTES_NON_OVERLAY DONT_EMBED_BITCODE FORCE_BUILD_FOR_HOST_SDK FORCE_BUILD_OPTIMIZED HAS_SWIFT_CONTENT IS_SDK_OVERLAY IS_STDLIB IS_STDLIB_CORE NOSWIFTRT OBJECT_LIBRARY SHARED STATIC TARGET_LIBRARY) set(SWIFTLIB_single_parameter_options DEPLOYMENT_VERSION_IOS DEPLOYMENT_VERSION_OSX DEPLOYMENT_VERSION_TVOS DEPLOYMENT_VERSION_WATCHOS INSTALL_IN_COMPONENT) set(SWIFTLIB_multiple_parameter_options C_COMPILE_FLAGS DEPENDS FILE_DEPENDS FRAMEWORK_DEPENDS FRAMEWORK_DEPENDS_IOS_TVOS FRAMEWORK_DEPENDS_OSX FRAMEWORK_DEPENDS_WEAK INCORPORATE_OBJECT_LIBRARIES INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY INTERFACE_LINK_LIBRARIES LINK_FLAGS LINK_LIBRARIES LLVM_COMPONENT_DEPENDS PRIVATE_LINK_LIBRARIES SWIFT_COMPILE_FLAGS SWIFT_COMPILE_FLAGS_IOS SWIFT_COMPILE_FLAGS_OSX SWIFT_COMPILE_FLAGS_TVOS SWIFT_COMPILE_FLAGS_WATCHOS SWIFT_MODULE_DEPENDS SWIFT_MODULE_DEPENDS_CYGWIN SWIFT_MODULE_DEPENDS_FREEBSD SWIFT_MODULE_DEPENDS_HAIKU SWIFT_MODULE_DEPENDS_IOS SWIFT_MODULE_DEPENDS_LINUX SWIFT_MODULE_DEPENDS_OSX SWIFT_MODULE_DEPENDS_TVOS SWIFT_MODULE_DEPENDS_WATCHOS TARGET_SDKS) cmake_parse_arguments(SWIFTLIB "${SWIFTLIB_options}" "${SWIFTLIB_single_parameter_options}" "${SWIFTLIB_multiple_parameter_options}" ${ARGN}) set(SWIFTLIB_SOURCES ${SWIFTLIB_UNPARSED_ARGUMENTS}) # Infer arguments. if(SWIFTLIB_IS_SDK_OVERLAY) set(SWIFTLIB_HAS_SWIFT_CONTENT TRUE) set(SWIFTLIB_IS_STDLIB TRUE) set(SWIFTLIB_TARGET_LIBRARY TRUE) # Install to sdk-overlay by default, but don't hardcode it if(NOT SWIFTLIB_INSTALL_IN_COMPONENT) set(SWIFTLIB_INSTALL_IN_COMPONENT sdk-overlay) endif() endif() # Standard library is always a target library. if(SWIFTLIB_IS_STDLIB) set(SWIFTLIB_HAS_SWIFT_CONTENT TRUE) set(SWIFTLIB_TARGET_LIBRARY TRUE) endif() if(NOT SWIFTLIB_TARGET_LIBRARY) set(SWIFTLIB_INSTALL_IN_COMPONENT dev) endif() # If target SDKs are not specified, build for all known SDKs. if("${SWIFTLIB_TARGET_SDKS}" STREQUAL "") set(SWIFTLIB_TARGET_SDKS ${SWIFT_SDKS}) endif() list_replace(SWIFTLIB_TARGET_SDKS ALL_POSIX_PLATFORMS "ALL_APPLE_PLATFORMS;ANDROID;CYGWIN;FREEBSD;LINUX;HAIKU") list_replace(SWIFTLIB_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_APPLE_PLATFORMS}") # All Swift code depends on the standard library, except for the standard # library itself. if(SWIFTLIB_HAS_SWIFT_CONTENT AND NOT SWIFTLIB_IS_STDLIB_CORE) list(APPEND SWIFTLIB_SWIFT_MODULE_DEPENDS Core) endif() if((NOT "${SWIFT_BUILD_STDLIB}") AND (NOT "${SWIFTLIB_SWIFT_MODULE_DEPENDS}" STREQUAL "")) list(REMOVE_ITEM SWIFTLIB_SWIFT_MODULE_DEPENDS Core) endif() if(SWIFTLIB_HAS_SWIFT_CONTENT AND NOT SWIFTLIB_IS_STDLIB_CORE) # All Swift code depends on the SwiftOnoneSupport in non-optimized mode, # except for the standard library itself. is_build_type_optimized("${SWIFT_STDLIB_BUILD_TYPE}" optimized) if(NOT optimized) list(APPEND SWIFTLIB_SWIFT_MODULE_DEPENDS SwiftOnoneSupport) endif() endif() if((NOT "${SWIFT_BUILD_STDLIB}") AND (NOT "${SWIFTLIB_SWIFT_MODULE_DEPENDS}" STREQUAL "")) list(REMOVE_ITEM SWIFTLIB_SWIFT_MODULE_DEPENDS SwiftOnoneSupport) endif() # swiftSwiftOnoneSupport does not depend on itself, # obviously. if("${name}" STREQUAL "swiftSwiftOnoneSupport") list(REMOVE_ITEM SWIFTLIB_SWIFT_MODULE_DEPENDS SwiftOnoneSupport) endif() translate_flags(SWIFTLIB "${SWIFTLIB_options}") precondition(SWIFTLIB_INSTALL_IN_COMPONENT MESSAGE "INSTALL_IN_COMPONENT is required") if(NOT SWIFTLIB_SHARED AND NOT SWIFTLIB_STATIC AND NOT SWIFTLIB_OBJECT_LIBRARY) message(FATAL_ERROR "Either SHARED, STATIC, or OBJECT_LIBRARY must be specified") endif() if(SWIFTLIB_TARGET_LIBRARY) if(NOT SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER AND NOT BUILD_STANDALONE) list(APPEND SWIFTLIB_DEPENDS clang) endif() # If we are building this library for targets, loop through the various # SDKs building the variants of this library. list_intersect( "${SWIFTLIB_TARGET_SDKS}" "${SWIFT_SDKS}" SWIFTLIB_TARGET_SDKS) if(SWIFTLIB_FORCE_BUILD_FOR_HOST_SDK) list_union( "${SWIFTLIB_TARGET_SDKS}" "${SWIFT_HOST_VARIANT_SDK}" SWIFTLIB_TARGET_SDKS) endif() foreach(sdk ${SWIFTLIB_TARGET_SDKS}) if(NOT SWIFT_SDK_${sdk}_ARCHITECTURES) # SWIFT_SDK_${sdk}_ARCHITECTURES is empty, so just continue continue() endif() set(THIN_INPUT_TARGETS) # For each architecture supported by this SDK foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES}) # Configure variables for this subdirectory. set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}") set(VARIANT_NAME "${name}${VARIANT_SUFFIX}") set(MODULE_VARIANT_SUFFIX "-swiftmodule${VARIANT_SUFFIX}") set(MODULE_VARIANT_NAME "${name}${MODULE_VARIANT_SUFFIX}") # Map dependencies over to the appropriate variants. set(swiftlib_link_libraries) foreach(lib ${SWIFTLIB_LINK_LIBRARIES}) if(TARGET "${lib}${VARIANT_SUFFIX}") list(APPEND swiftlib_link_libraries "${lib}${VARIANT_SUFFIX}") else() list(APPEND swiftlib_link_libraries "${lib}") endif() endforeach() set(swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS}) if("${sdk}" STREQUAL "OSX") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_OSX}) elseif("${sdk}" STREQUAL "IOS" OR "${sdk}" STREQUAL "IOS_SIMULATOR") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_IOS}) elseif("${sdk}" STREQUAL "TVOS" OR "${sdk}" STREQUAL "TVOS_SIMULATOR") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_TVOS}) elseif("${sdk}" STREQUAL "WATCHOS" OR "${sdk}" STREQUAL "WATCHOS_SIMULATOR") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_WATCHOS}) elseif("${sdk}" STREQUAL "FREEBSD") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_FREEBSD}) elseif("${sdk}" STREQUAL "LINUX" OR "${sdk}" STREQUAL "ANDROID") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX}) elseif("${sdk}" STREQUAL "CYGWIN") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN}) elseif("${sdk}" STREQUAL "HAIKU") list(APPEND swiftlib_module_depends_flattened ${SWIFTLIB_SWIFT_MODULE_DEPENDS_HAIKU}) endif() # Swift compiles depend on swift modules, while links depend on # linked libraries. Find targets for both of these here. set(swiftlib_module_dependency_targets) set(swiftlib_private_link_libraries_targets) if(NOT BUILD_STANDALONE) foreach(mod ${swiftlib_module_depends_flattened}) list(APPEND swiftlib_module_dependency_targets "swift${mod}${MODULE_VARIANT_SUFFIX}") list(APPEND swiftlib_private_link_libraries_targets "swift${mod}${VARIANT_SUFFIX}") endforeach() endif() foreach(lib ${SWIFTLIB_PRIVATE_LINK_LIBRARIES}) if("${lib}" STREQUAL "ICU_UC") list(APPEND swiftlib_private_link_libraries_targets "${SWIFT_${sdk}_${arch}_ICU_UC}") # temporary fix for atomic needing to be # after object files for libswiftCore.so if("${sdk}" STREQUAL "ANDROID") list(APPEND swiftlib_private_link_libraries_targets "-latomic") # the same issue on FreeBSD, missing symbols: # __atomic_store, __atomic_compare_exchange, __atomic_load elseif("${sdk}" STREQUAL "FREEBSD") list(APPEND swiftlib_private_link_libraries_targets "${SWIFTLIB_DIR}/clang/lib/freebsd/libclang_rt.builtins-${arch}.a") endif() elseif("${lib}" STREQUAL "ICU_I18N") list(APPEND swiftlib_private_link_libraries_targets "${SWIFT_${sdk}_${arch}_ICU_I18N}") elseif(TARGET "${lib}${VARIANT_SUFFIX}") list(APPEND swiftlib_private_link_libraries_targets "${lib}${VARIANT_SUFFIX}") else() list(APPEND swiftlib_private_link_libraries_targets "${lib}") endif() endforeach() set(swiftlib_framework_depends_flattened ${SWIFTLIB_FRAMEWORK_DEPENDS}) if("${sdk}" STREQUAL "OSX") list(APPEND swiftlib_framework_depends_flattened ${SWIFTLIB_FRAMEWORK_DEPENDS_OSX}) elseif("${sdk}" STREQUAL "IOS" OR "${sdk}" STREQUAL "IOS_SIMULATOR" OR "${sdk}" STREQUAL "TVOS" OR "${sdk}" STREQUAL "TVOS_SIMULATOR") list(APPEND swiftlib_framework_depends_flattened ${SWIFTLIB_FRAMEWORK_DEPENDS_IOS_TVOS}) endif() # Collect compiler flags set(swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS}) if("${sdk}" STREQUAL "OSX") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_OSX}) elseif("${sdk}" STREQUAL "IOS" OR "${sdk}" STREQUAL "IOS_SIMULATOR") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_IOS}) elseif("${sdk}" STREQUAL "TVOS" OR "${sdk}" STREQUAL "TVOS_SIMULATOR") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_TVOS}) elseif("${sdk}" STREQUAL "WATCHOS" OR "${sdk}" STREQUAL "WATCHOS_SIMULATOR") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_WATCHOS}) elseif("${sdk}" STREQUAL "WINDOWS") # FIXME(SR2005) static and shared are not mutually exclusive; however # since we do a single build of the sources, this doesn't work for # building both simultaneously. Effectively, only shared builds are # supported on windows currently. if(SWIFTLIB_SHARED) list(APPEND swiftlib_swift_compile_flags_all -D_USRDLL) if(SWIFTLIB_IS_STDLIB_CORE) list(APPEND swiftlib_swift_compile_flags_all -DswiftCore_EXPORTS) endif() elseif(SWIFTLIB_STATIC) list(APPEND swiftlib_swift_compile_flags_all -D_LIB) endif() endif() # Add PrivateFrameworks, rdar://28466433 set(swiftlib_link_flags_all ${SWIFTLIB_LINK_FLAGS}) if(SWIFTLIB_IS_SDK_OVERLAY) list(APPEND swiftlib_swift_compile_flags_all "-Fsystem" "${SWIFT_SDK_${sdk}_ARCH_${arch}_PATH}/System/Library/PrivateFrameworks/") endif() if("${sdk}" STREQUAL "IOS_SIMULATOR") if("${name}" STREQUAL "swiftMediaPlayer") message("DISABLING AUTOLINK FOR swiftMediaPlayer") list(APPEND swiftlib_link_flags_all "-Xlinker" "-ignore_auto_link") endif() endif() # We unconditionally removed "-z,defs" from CMAKE_SHARED_LINKER_FLAGS in # swift_common_standalone_build_config_llvm within SwiftSharedCMakeConfig.cmake, # where it was added by a call to HandleLLVMOptions. # # Rather than applying it to all targets and libraries, we here add it back to # supported targets and libraries only. # This is needed for ELF targets only; however, RemoteMirror needs to build # with undefined symbols. if("${SWIFT_SDK_${LFLAGS_SDK}_OBJECT_FORMAT}" STREQUAL "ELF" AND NOT "${name}" STREQUAL "swiftRemoteMirror") list(APPEND swiftlib_link_flags_all "-Wl,-z,defs") endif() # Add this library variant. _add_swift_library_single( ${VARIANT_NAME} ${name} ${SWIFTLIB_SHARED_keyword} ${SWIFTLIB_STATIC_keyword} ${SWIFTLIB_OBJECT_LIBRARY_keyword} ${SWIFTLIB_SOURCES} MODULE_TARGET ${MODULE_VARIANT_NAME} SDK ${sdk} ARCHITECTURE ${arch} DEPENDS ${SWIFTLIB_DEPENDS} LINK_LIBRARIES ${swiftlib_link_libraries} FRAMEWORK_DEPENDS ${swiftlib_framework_depends_flattened} FRAMEWORK_DEPENDS_WEAK ${SWIFTLIB_FRAMEWORK_DEPENDS_WEAK} LLVM_COMPONENT_DEPENDS ${SWIFTLIB_LLVM_COMPONENT_DEPENDS} FILE_DEPENDS ${SWIFTLIB_FILE_DEPENDS} ${swiftlib_module_dependency_targets} C_COMPILE_FLAGS ${SWIFTLIB_C_COMPILE_FLAGS} SWIFT_COMPILE_FLAGS ${swiftlib_swift_compile_flags_all} LINK_FLAGS ${swiftlib_link_flags_all} PRIVATE_LINK_LIBRARIES ${swiftlib_private_link_libraries_targets} INCORPORATE_OBJECT_LIBRARIES ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES} INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY} ${SWIFTLIB_DONT_EMBED_BITCODE_keyword} ${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword} ${SWIFTLIB_IS_STDLIB_keyword} ${SWIFTLIB_IS_STDLIB_CORE_keyword} ${SWIFTLIB_IS_SDK_OVERLAY_keyword} ${SWIFTLIB_TARGET_LIBRARY_keyword} ${SWIFTLIB_FORCE_BUILD_FOR_HOST_SDK_keyword} ${SWIFTLIB_FORCE_BUILD_OPTIMIZED_keyword} ${SWIFTLIB_NOSWIFTRT_keyword} INSTALL_IN_COMPONENT "${SWIFTLIB_INSTALL_IN_COMPONENT}" DEPLOYMENT_VERSION_OSX "${SWIFTLIB_DEPLOYMENT_VERSION_OSX}" DEPLOYMENT_VERSION_IOS "${SWIFTLIB_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_TVOS "${SWIFTLIB_DEPLOYMENT_VERSION_TVOS}" DEPLOYMENT_VERSION_WATCHOS "${SWIFTLIB_DEPLOYMENT_VERSION_WATCHOS}" ) if(NOT SWIFTLIB_OBJECT_LIBRARY) # Add dependencies on the (not-yet-created) custom lipo target. foreach(DEP ${SWIFTLIB_LINK_LIBRARIES}) if (NOT "${DEP}" STREQUAL "icucore") add_dependencies(${VARIANT_NAME} "${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}") endif() endforeach() if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC) # Add dependencies on the (not-yet-created) custom lipo target. foreach(DEP ${SWIFTLIB_LINK_LIBRARIES}) if (NOT "${DEP}" STREQUAL "icucore") add_dependencies("${VARIANT_NAME}-static" "${DEP}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static") endif() endforeach() endif() # Note this thin library. list(APPEND THIN_INPUT_TARGETS ${VARIANT_NAME}) endif() endforeach() if(NOT SWIFTLIB_OBJECT_LIBRARY) # Determine the name of the universal library. if(SWIFTLIB_SHARED) if("${sdk}" STREQUAL "WINDOWS") set(UNIVERSAL_LIBRARY_NAME "${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${name}.dll") else() set(UNIVERSAL_LIBRARY_NAME "${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}") endif() else() if("${sdk}" STREQUAL "WINDOWS") set(UNIVERSAL_LIBRARY_NAME "${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${name}.lib") else() set(UNIVERSAL_LIBRARY_NAME "${SWIFTLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}") endif() endif() set(lipo_target "${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}") if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND SWIFTLIB_SHARED) set(codesign_arg CODESIGN) endif() precondition(THIN_INPUT_TARGETS) _add_swift_lipo_target(SDK ${sdk} TARGET ${lipo_target} OUTPUT ${UNIVERSAL_LIBRARY_NAME} ${codesign_arg} ${THIN_INPUT_TARGETS}) # Cache universal libraries for dependency purposes set(UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR} ${UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}} ${lipo_target} CACHE INTERNAL "UNIVERSAL_LIBRARY_NAMES_${SWIFT_SDK_${sdk}_LIB_SUBDIR}") # Determine the subdirectory where this library will be installed. set(resource_dir_sdk_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}") precondition(resource_dir_sdk_subdir) if(SWIFTLIB_TARGET_LIBRARY) if(SWIFTLIB_SHARED) set(resource_dir "swift") set(file_permissions OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) else() set(resource_dir "swift_static") set(file_permissions OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) endif() swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}" FILES "${UNIVERSAL_LIBRARY_NAME}" DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/${resource_dir}/${resource_dir_sdk_subdir}" PERMISSIONS ${file_permissions}) endif() # If we built static variants of the library, create a lipo target for # them. set(lipo_target_static) if (SWIFTLIB_IS_STDLIB AND SWIFTLIB_STATIC) set(THIN_INPUT_TARGETS_STATIC) foreach(TARGET ${THIN_INPUT_TARGETS}) list(APPEND THIN_INPUT_TARGETS_STATIC "${TARGET}-static") endforeach() set(lipo_target_static "${name}-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-static") set(UNIVERSAL_LIBRARY_NAME "${SWIFTSTATICLIB_DIR}/${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}") _add_swift_lipo_target(SDK ${sdk} TARGET ${lipo_target_static} OUTPUT "${UNIVERSAL_LIBRARY_NAME}" ${THIN_INPUT_TARGETS_STATIC}) swift_install_in_component("${SWIFTLIB_INSTALL_IN_COMPONENT}" FILES "${UNIVERSAL_LIBRARY_NAME}" DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift_static/${resource_dir_sdk_subdir}" PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) endif() # Add Swift standard library targets as dependencies to the top-level # convenience target. if(SWIFTLIB_TARGET_LIBRARY) set(FILTERED_UNITTESTS swiftStdlibCollectionUnittest swiftStdlibUnicodeUnittest) foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES}) set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}") if(TARGET "swift-stdlib${VARIANT_SUFFIX}" AND TARGET "swift-test-stdlib${VARIANT_SUFFIX}") add_dependencies("swift-stdlib${VARIANT_SUFFIX}" ${lipo_target} ${lipo_target_static}) if(NOT "${name}" IN_LIST FILTERED_UNITTESTS) add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}" ${lipo_target} ${lipo_target_static}) endif() endif() endforeach() endif() endif() endforeach() else() set(sdk "${SWIFT_HOST_VARIANT_SDK}") set(arch "${SWIFT_HOST_VARIANT_ARCH}") # Collect compiler flags set(swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS}) if("${sdk}" STREQUAL "OSX") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_OSX}) elseif("${sdk}" STREQUAL "IOS" OR "${sdk}" STREQUAL "IOS_SIMULATOR") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_IOS}) elseif("${sdk}" STREQUAL "TVOS" OR "${sdk}" STREQUAL "TVOS_SIMULATOR") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_TVOS}) elseif("${sdk}" STREQUAL "WATCHOS" OR "${sdk}" STREQUAL "WATCHOS_SIMULATOR") list(APPEND swiftlib_swift_compile_flags_all ${SWIFTLIB_SWIFT_COMPILE_FLAGS_WATCHOS}) endif() _add_swift_library_single( ${name} ${name} ${SWIFTLIB_SHARED_keyword} ${SWIFTLIB_STATIC_keyword} ${SWIFTLIB_OBJECT_LIBRARY_keyword} ${SWIFTLIB_SOURCES} SDK ${sdk} ARCHITECTURE ${arch} DEPENDS ${SWIFTLIB_DEPENDS} LINK_LIBRARIES ${SWIFTLIB_LINK_LIBRARIES} FRAMEWORK_DEPENDS ${SWIFTLIB_FRAMEWORK_DEPENDS} FRAMEWORK_DEPENDS_WEAK ${SWIFTLIB_FRAMEWORK_DEPENDS_WEAK} LLVM_COMPONENT_DEPENDS ${SWIFTLIB_LLVM_COMPONENT_DEPENDS} FILE_DEPENDS ${SWIFTLIB_FILE_DEPENDS} C_COMPILE_FLAGS ${SWIFTLIB_C_COMPILE_FLAGS} SWIFT_COMPILE_FLAGS ${swiftlib_swift_compile_flags_all} LINK_FLAGS ${SWIFTLIB_LINK_FLAGS} PRIVATE_LINK_LIBRARIES ${SWIFTLIB_PRIVATE_LINK_LIBRARIES} INTERFACE_LINK_LIBRARIES ${SWIFTLIB_INTERFACE_LINK_LIBRARIES} INCORPORATE_OBJECT_LIBRARIES ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES} INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY ${SWIFTLIB_INCORPORATE_OBJECT_LIBRARIES_SHARED_ONLY} ${SWIFTLIB_DONT_EMBED_BITCODE_keyword} ${SWIFTLIB_API_NOTES_NON_OVERLAY_keyword} ${SWIFTLIB_IS_STDLIB_keyword} ${SWIFTLIB_IS_STDLIB_CORE_keyword} ${SWIFTLIB_IS_SDK_OVERLAY_keyword} INSTALL_IN_COMPONENT "${SWIFTLIB_INSTALL_IN_COMPONENT}" DEPLOYMENT_VERSION_OSX "${SWIFTLIB_DEPLOYMENT_VERSION_OSX}" DEPLOYMENT_VERSION_IOS "${SWIFTLIB_DEPLOYMENT_VERSION_IOS}" DEPLOYMENT_VERSION_TVOS "${SWIFTLIB_DEPLOYMENT_VERSION_TVOS}" DEPLOYMENT_VERSION_WATCHOS "${SWIFTLIB_DEPLOYMENT_VERSION_WATCHOS}" ) swift_install_in_component(dev TARGETS ${name} ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} RUNTIME DESTINATION bin) swift_is_installing_component(dev is_installing) if(NOT is_installing) set_property(GLOBAL APPEND PROPERTY SWIFT_BUILDTREE_EXPORTS ${name}) else() set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${name}) endif() endif() endfunction() # Add an executable compiled for a given variant. # # Don't use directly, use add_swift_executable and add_swift_target_executable # instead. # # See add_swift_executable for detailed documentation. # # Additional parameters: # [SDK sdk] # SDK to build for. # # [ARCHITECTURE architecture] # Architecture to build for. # # [LINK_FAT_LIBRARIES lipo_target1 ...] # Fat libraries to link with. function(_add_swift_executable_single name) # Parse the arguments we were given. cmake_parse_arguments(SWIFTEXE_SINGLE "EXCLUDE_FROM_ALL;DONT_STRIP_NON_MAIN_SYMBOLS;DISABLE_ASLR" "SDK;ARCHITECTURE" "DEPENDS;LLVM_COMPONENT_DEPENDS;LINK_LIBRARIES;LINK_FAT_LIBRARIES" ${ARGN}) set(SWIFTEXE_SINGLE_SOURCES ${SWIFTEXE_SINGLE_UNPARSED_ARGUMENTS}) translate_flag(${SWIFTEXE_SINGLE_EXCLUDE_FROM_ALL} "EXCLUDE_FROM_ALL" SWIFTEXE_SINGLE_EXCLUDE_FROM_ALL_FLAG) # Check arguments. precondition(SWIFTEXE_SINGLE_SDK MESSAGE "Should specify an SDK") precondition(SWIFTEXE_SINGLE_ARCHITECTURE MESSAGE "Should specify an architecture") # Determine compiler flags. set(c_compile_flags) set(link_flags) # Prepare linker search directories. set(library_search_directories "${SWIFTLIB_DIR}/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}") # Add variant-specific flags. _add_variant_c_compile_flags( SDK "${SWIFTEXE_SINGLE_SDK}" ARCH "${SWIFTEXE_SINGLE_ARCHITECTURE}" BUILD_TYPE "${CMAKE_BUILD_TYPE}" ENABLE_ASSERTIONS "${LLVM_ENABLE_ASSERTIONS}" ENABLE_LTO "${SWIFT_TOOLS_ENABLE_LTO}" ANALYZE_CODE_COVERAGE "${SWIFT_ANALYZE_CODE_COVERAGE}" RESULT_VAR_NAME c_compile_flags) _add_variant_link_flags( SDK "${SWIFTEXE_SINGLE_SDK}" ARCH "${SWIFTEXE_SINGLE_ARCHITECTURE}" BUILD_TYPE "${CMAKE_BUILD_TYPE}" ENABLE_ASSERTIONS "${LLVM_ENABLE_ASSERTIONS}" ENABLE_LTO "${SWIFT_TOOLS_ENABLE_LTO}" LTO_OBJECT_NAME "${name}-${SWIFTEXE_SINGLE_SDK}-${SWIFTEXE_SINGLE_ARCHITECTURE}" ANALYZE_CODE_COVERAGE "${SWIFT_ANALYZE_CODE_COVERAGE}" RESULT_VAR_NAME link_flags LIBRARY_SEARCH_DIRECTORIES_VAR_NAME library_search_directories) if(SWIFTEXE_SINGLE_DISABLE_ASLR) list(APPEND link_flags "-Wl,-no_pie") endif() is_darwin_based_sdk("${SWIFTEXE_SINGLE_SDK}" IS_DARWIN) if(IS_DARWIN) list(APPEND link_flags "-Xlinker" "-rpath" "-Xlinker" "@executable_path/../lib/swift/${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}") endif() # Find the names of dependency library targets. # # We don't add the ${ARCH} to the target suffix because we want to link # against fat libraries. _list_add_string_suffix( "${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES}" "-${SWIFT_SDK_${SWIFTEXE_SINGLE_SDK}_LIB_SUBDIR}" SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES_TARGETS) handle_swift_sources( dependency_target unused_module_dependency_target unused_sib_dependency_target unused_sibopt_dependency_target unused_sibgen_dependency_target SWIFTEXE_SINGLE_SOURCES SWIFTEXE_SINGLE_EXTERNAL_SOURCES ${name} DEPENDS ${SWIFTEXE_SINGLE_DEPENDS} ${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES_TARGETS} MODULE_NAME ${name} SDK ${SWIFTEXE_SINGLE_SDK} ARCHITECTURE ${SWIFTEXE_SINGLE_ARCHITECTURE} IS_MAIN) add_swift_source_group("${SWIFTEXE_SINGLE_EXTERNAL_SOURCES}") add_executable(${name} ${SWIFTEXE_SINGLE_EXCLUDE_FROM_ALL_FLAG} ${SWIFTEXE_SINGLE_SOURCES} ${SWIFTEXE_SINGLE_EXTERNAL_SOURCES}) add_dependencies_multiple_targets( TARGETS "${name}" DEPENDS ${dependency_target} ${LLVM_COMMON_DEPENDS} ${SWIFTEXE_SINGLE_DEPENDS} ${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES_TARGETS}) llvm_update_compile_flags("${name}") # Convert variables to space-separated strings. _list_escape_for_shell("${c_compile_flags}" c_compile_flags) _list_escape_for_shell("${link_flags}" link_flags) set_property(TARGET ${name} APPEND_STRING PROPERTY COMPILE_FLAGS " ${c_compile_flags}") swift_target_link_search_directories("${name}" "${library_search_directories}") set_property(TARGET ${name} APPEND_STRING PROPERTY LINK_FLAGS " ${link_flags}") if (SWIFT_PARALLEL_LINK_JOBS) set_property(TARGET ${name} PROPERTY JOB_POOL_LINK swift_link_job_pool) endif() set_output_directory(${name} BINARY_DIR ${SWIFT_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${SWIFT_LIBRARY_OUTPUT_INTDIR}) target_link_libraries("${name}" PRIVATE ${SWIFTEXE_SINGLE_LINK_LIBRARIES} ${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES}) swift_common_llvm_config("${name}" ${SWIFTEXE_SINGLE_LLVM_COMPONENT_DEPENDS}) set_target_properties(${name} PROPERTIES FOLDER "Swift executables") endfunction() # Add an executable for each target variant. Executables are given suffixes # with the variant SDK and ARCH. # # See add_swift_executable for detailed documentation. # # Additional parameters: # [LINK_FAT_LIBRARIES lipo_target1 ...] # Fat libraries to link with. function(add_swift_target_executable name) # Parse the arguments we were given. cmake_parse_arguments(SWIFTEXE_TARGET "EXCLUDE_FROM_ALL;DONT_STRIP_NON_MAIN_SYMBOLS;DISABLE_ASLR;BUILD_WITH_STDLIB" "" "DEPENDS;LLVM_COMPONENT_DEPENDS;LINK_FAT_LIBRARIES" ${ARGN}) set(SWIFTEXE_TARGET_SOURCES ${SWIFTEXE_TARGET_UNPARSED_ARGUMENTS}) translate_flag(${SWIFTEXE_TARGET_EXCLUDE_FROM_ALL} "EXCLUDE_FROM_ALL" SWIFTEXE_TARGET_EXCLUDE_FROM_ALL_FLAG) translate_flag(${SWIFTEXE_TARGET_DONT_STRIP_NON_MAIN_SYMBOLS} "DONT_STRIP_NON_MAIN_SYMBOLS" SWIFTEXE_TARGET_DONT_STRIP_NON_MAIN_SYMBOLS_FLAG) translate_flag(${SWIFTEXE_TARGET_DISABLE_ASLR} "DISABLE_ASLR" SWIFTEXE_DISABLE_ASLR_FLAG) # All Swift executables depend on the standard library. list(APPEND SWIFTEXE_TARGET_LINK_FAT_LIBRARIES swiftCore) # All Swift executables depend on the swiftSwiftOnoneSupport library. list(APPEND SWIFTEXE_TARGET_DEPENDS swiftSwiftOnoneSupport) if(NOT "${SWIFT_BUILD_STDLIB}") list(REMOVE_ITEM SWIFTEXE_TARGET_LINK_FAT_LIBRARIES swiftCore) endif() foreach(sdk ${SWIFT_SDKS}) foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES}) set(VARIANT_SUFFIX "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}") set(VARIANT_NAME "${name}${VARIANT_SUFFIX}") set(SWIFTEXE_TARGET_EXCLUDE_FROM_ALL_FLAG_CURRENT ${SWIFTEXE_TARGET_EXCLUDE_FROM_ALL_FLAG}) if(NOT "${VARIANT_SUFFIX}" STREQUAL "${SWIFT_PRIMARY_VARIANT_SUFFIX}") # By default, don't build executables for target SDKs to avoid building # target stdlibs. set(SWIFTEXE_TARGET_EXCLUDE_FROM_ALL_FLAG_CURRENT "EXCLUDE_FROM_ALL") endif() if(SWIFTEXE_TARGET_BUILD_WITH_STDLIB) add_dependencies("swift-test-stdlib${VARIANT_SUFFIX}" ${VARIANT_NAME}) endif() # Don't add the ${arch} to the suffix. We want to link against fat # libraries. _list_add_string_suffix( "${SWIFTEXE_TARGET_DEPENDS}" "-${SWIFT_SDK_${sdk}_LIB_SUBDIR}" SWIFTEXE_TARGET_DEPENDS_with_suffix) _add_swift_executable_single( ${VARIANT_NAME} ${SWIFTEXE_TARGET_SOURCES} DEPENDS ${SWIFTEXE_TARGET_DEPENDS_with_suffix} LLVM_COMPONENT_DEPENDS ${SWIFTEXE_TARGET_LLVM_COMPONENT_DEPENDS} SDK "${sdk}" ARCHITECTURE "${arch}" LINK_FAT_LIBRARIES ${SWIFTEXE_TARGET_LINK_FAT_LIBRARIES} ${SWIFTEXE_TARGET_EXCLUDE_FROM_ALL_FLAG_CURRENT} ${SWIFTEXE_TARGET_DONT_STRIP_NON_MAIN_SYMBOLS_FLAG} ${SWIFTEXE_DISABLE_ASLR_FLAG}) endforeach() endforeach() endfunction() # Add an executable for the host machine. # # Usage: # add_swift_executable(name # [DEPENDS dep1 ...] # [LLVM_COMPONENT_DEPENDS comp1 ...] # [FILE_DEPENDS target1 ...] # [LINK_LIBRARIES target1 ...] # [EXCLUDE_FROM_ALL] # [DONT_STRIP_NON_MAIN_SYMBOLS] # [DISABLE_ASLR] # source1 [source2 source3 ...]) # # name # Name of the executable (e.g., swift). # # LIBRARIES # Libraries this executable depends on, without variant suffixes. # # LLVM_COMPONENT_DEPENDS # LLVM components this executable depends on. # # FILE_DEPENDS # Additional files this executable depends on. # # LINK_LIBRARIES # Libraries to link with. # # EXCLUDE_FROM_ALL # Whether to exclude this executable from the ALL_BUILD target. # # DONT_STRIP_NON_MAIN_SYMBOLS # Should we not strip non main symbols. # # DISABLE_ASLR # Should we compile with -Wl,-no_pie so that ASLR is disabled? # # source1 ... # Sources to add into this executable. # # Note: # Host executables are not given a variant suffix. To build an executable for # each SDK and ARCH variant, use add_swift_target_executable. function(add_swift_executable name) # Parse the arguments we were given. cmake_parse_arguments(SWIFTEXE "EXCLUDE_FROM_ALL;DONT_STRIP_NON_MAIN_SYMBOLS;DISABLE_ASLR" "" "DEPENDS;LLVM_COMPONENT_DEPENDS;LINK_LIBRARIES" ${ARGN}) translate_flag(${SWIFTEXE_EXCLUDE_FROM_ALL} "EXCLUDE_FROM_ALL" SWIFTEXE_EXCLUDE_FROM_ALL_FLAG) translate_flag(${SWIFTEXE_DONT_STRIP_NON_MAIN_SYMBOLS} "DONT_STRIP_NON_MAIN_SYMBOLS" SWIFTEXE_DONT_STRIP_NON_MAIN_SYMBOLS_FLAG) translate_flag(${SWIFTEXE_DISABLE_ASLR} "DISABLE_ASLR" SWIFTEXE_DISABLE_ASLR_FLAG) set(SWIFTEXE_SOURCES ${SWIFTEXE_UNPARSED_ARGUMENTS}) _add_swift_executable_single( ${name} ${SWIFTEXE_SOURCES} DEPENDS ${SWIFTEXE_DEPENDS} LLVM_COMPONENT_DEPENDS ${SWIFTEXE_LLVM_COMPONENT_DEPENDS} LINK_LIBRARIES ${SWIFTEXE_LINK_LIBRARIES} SDK ${SWIFT_HOST_VARIANT_SDK} ARCHITECTURE ${SWIFT_HOST_VARIANT_ARCH} ${SWIFTEXE_EXCLUDE_FROM_ALL_FLAG} ${SWIFTEXE_DONT_STRIP_NON_MAIN_SYMBOLS_FLAG} ${SWIFTEXE_DISABLE_ASLR_FLAG}) endfunction() macro(add_swift_tool_subdirectory name) add_llvm_subdirectory(SWIFT TOOL ${name}) endmacro() macro(add_swift_lib_subdirectory name) add_llvm_subdirectory(SWIFT LIB ${name}) endmacro() function(add_swift_host_tool executable) cmake_parse_arguments( ADDSWIFTHOSTTOOL # prefix "" # options "" # single-value args "SWIFT_COMPONENT" # multi-value args ${ARGN}) # Create the executable rule. add_swift_executable(${executable} ${ADDSWIFTHOSTTOOL_UNPARSED_ARGUMENTS}) # And then create the install rule if we are asked to. if (ADDSWIFTHOSTTOOL_SWIFT_COMPONENT) swift_install_in_component(${ADDSWIFTHOSTTOOL_SWIFT_COMPONENT} TARGETS ${executable} RUNTIME DESTINATION bin) swift_is_installing_component(${ADDSWIFTHOSTTOOL_SWIFT_COMPONENT} is_installing) if(NOT is_installing) set_property(GLOBAL APPEND PROPERTY SWIFT_BUILDTREE_EXPORTS ${executable}) else() set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${executable}) endif() endif() endfunction() macro(add_swift_tool_symlink name dest component) add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE COMPONENT ${component}) endmacro()