diff --git a/CMakeLists.txt b/CMakeLists.txt index aad9e525e5892..ed3311955885d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,6 +190,8 @@ cmake_dependent_option(LIBSWIFT_BUILD_MODE "How to build libswift. Possible valu BOOTSTRAPPING: libswift is built with a 2-stage bootstrapping process BOOTSTRAPPING-WITH-HOSTLIBS: libswift is built with a 2-stage bootstrapping process, but the compiler links against the host system swift libs (macOS only) + CROSSCOMPILE: libswift is cross-compiled with a native host compiler, provided in + `SWIFT_NATIVE_SWIFT_TOOLS_PATH` (non-Darwin only) CROSSCOMPILE-WITH-HOSTLIBS: libswift is built with a bootstrapping-with-hostlibs compiled compiler, provided in `SWIFT_NATIVE_SWIFT_TOOLS_PATH`" OFF "NOT CMAKE_GENERATOR STREQUAL \"Xcode\"" OFF) @@ -616,6 +618,8 @@ elseif(LIBSWIFT_BUILD_MODE MATCHES "BOOTSTRAPPING.*") set(SWIFT_EXEC_FOR_LIBSWIFT "${SWIFT_NATIVE_SWIFT_TOOLS_PATH}/swiftc") if(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING-WITH-HOSTLIBS") set(LIBSWIFT_BUILD_MODE "CROSSCOMPILE-WITH-HOSTLIBS") + elseif(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING") + set(LIBSWIFT_BUILD_MODE "CROSSCOMPILE") else() set(LIBSWIFT_BUILD_MODE "HOSTTOOLS") endif() diff --git a/cmake/modules/AddSwift.cmake b/cmake/modules/AddSwift.cmake index bd2b02d7b2444..36e99db9b2e71 100644 --- a/cmake/modules/AddSwift.cmake +++ b/cmake/modules/AddSwift.cmake @@ -739,6 +739,10 @@ function(add_libswift name) get_filename_component(swift_exec_bin_dir ${ALS_SWIFT_EXEC} DIRECTORY) set(sdk_option ${sdk_option} "-resource-dir" "${swift_exec_bin_dir}/../bootstrapping0/lib/swift") endif() + elseif(${LIBSWIFT_BUILD_MODE} STREQUAL "CROSSCOMPILE") + set(sdk_option "-sdk" "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${SWIFT_HOST_VARIANT_ARCH}_PATH}") + get_filename_component(swift_exec_bin_dir ${ALS_SWIFT_EXEC} DIRECTORY) + set(sdk_option ${sdk_option} "-resource-dir" "${swift_exec_bin_dir}/../lib/swift") endif() get_versioned_target_triple(target ${SWIFT_HOST_VARIANT_SDK} ${SWIFT_HOST_VARIANT_ARCH} "${deployment_version}") @@ -973,22 +977,28 @@ function(add_swift_host_tool executable) BUILD_WITH_INSTALL_RPATH YES INSTALL_RPATH "${RPATH_LIST}") - elseif(SWIFT_HOST_VARIANT_SDK STREQUAL "LINUX" AND ASHT_HAS_LIBSWIFT AND LIBSWIFT_BUILD_MODE) + elseif(SWIFT_HOST_VARIANT_SDK MATCHES "LINUX|ANDROID|OPENBSD" AND ASHT_HAS_LIBSWIFT AND LIBSWIFT_BUILD_MODE) set(swiftrt "swiftImageRegistrationObject${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_OBJECT_FORMAT}-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH}") - if(LIBSWIFT_BUILD_MODE STREQUAL "HOSTTOOLS") + if(${LIBSWIFT_BUILD_MODE} MATCHES "HOSTTOOLS|CROSSCOMPILE") # At build time and and run time, link against the swift libraries in the # installed host toolchain. get_filename_component(swift_bin_dir ${SWIFT_EXEC_FOR_LIBSWIFT} DIRECTORY) get_filename_component(swift_dir ${swift_bin_dir} DIRECTORY) - set(host_lib_dir "${swift_dir}/lib/swift/linux") + set(host_lib_dir "${swift_dir}/lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}") target_link_libraries(${executable} PRIVATE ${swiftrt}) target_link_libraries(${executable} PRIVATE "swiftCore") target_link_directories(${executable} PRIVATE ${host_lib_dir}) - set_target_properties(${executable} PROPERTIES - BUILD_WITH_INSTALL_RPATH YES - INSTALL_RPATH "${host_lib_dir}") + if(LIBSWIFT_BUILD_MODE STREQUAL "HOSTTOOLS") + set_target_properties(${executable} PROPERTIES + BUILD_WITH_INSTALL_RPATH YES + INSTALL_RPATH "${host_lib_dir}") + else() + set_target_properties(${executable} PROPERTIES + BUILD_WITH_INSTALL_RPATH YES + INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}") + endif() elseif(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING") # At build time link against the built swift libraries from the @@ -1004,7 +1014,7 @@ function(add_swift_host_tool executable) # bootstrapping stage. set_target_properties(${executable} PROPERTIES BUILD_WITH_INSTALL_RPATH YES - INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SDK_LINUX_LIB_SUBDIR}") + INSTALL_RPATH "$ORIGIN/../lib/swift/${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}") elseif(LIBSWIFT_BUILD_MODE STREQUAL "BOOTSTRAPPING-WITH-HOSTLIBS") message(FATAL_ERROR "LIBSWIFT_BUILD_MODE 'BOOTSTRAPPING-WITH-HOSTLIBS' not supported on Linux") diff --git a/libswift/CMakeLists.txt b/libswift/CMakeLists.txt index bc462fe3582b3..981e94055405b 100644 --- a/libswift/CMakeLists.txt +++ b/libswift/CMakeLists.txt @@ -20,7 +20,7 @@ else() add_subdirectory(Sources) - if(${LIBSWIFT_BUILD_MODE} MATCHES "HOSTTOOLS|CROSSCOMPILE-WITH-HOSTLIBS") + if(${LIBSWIFT_BUILD_MODE} MATCHES "HOSTTOOLS|CROSSCOMPILE") if (NOT SWIFT_EXEC_FOR_LIBSWIFT) message(FATAL_ERROR "Need a swift toolchain for building libswift") diff --git a/stdlib/cmake/modules/SwiftSource.cmake b/stdlib/cmake/modules/SwiftSource.cmake index 781c9d4610c8e..ca8739f3bb2ad 100644 --- a/stdlib/cmake/modules/SwiftSource.cmake +++ b/stdlib/cmake/modules/SwiftSource.cmake @@ -734,7 +734,7 @@ function(_compile_swift_files # stdlib in the current stage is not built yet. if(${SWIFT_HOST_VARIANT_SDK} IN_LIST SWIFT_APPLE_PLATFORMS) set(set_environment_args "${CMAKE_COMMAND}" "-E" "env" "DYLD_LIBRARY_PATH=${bs_lib_dir}") - elseif(SWIFT_HOST_VARIANT_SDK STREQUAL "LINUX") + elseif(SWIFT_HOST_VARIANT_SDK MATCHES "LINUX|ANDROID|OPENBSD") set(set_environment_args "${CMAKE_COMMAND}" "-E" "env" "LD_LIBRARY_PATH=${bs_lib_dir}") else() message(FATAL_ERROR "TODO: bootstrapping support for ${SWIFT_HOST_VARIANT_SDK}")