diff --git a/swift/CMakeLists.txt b/swift/CMakeLists.txt index 4b202c99502..aa7b9e8f715 100644 --- a/swift/CMakeLists.txt +++ b/swift/CMakeLists.txt @@ -443,7 +445,7 @@ endif() set(SWIFT_BUILD_HOST_DISPATCH FALSE) -if(SWIFT_BUILD_SYNTAXPARSERLIB OR SWIFT_BUILD_SOURCEKIT) +if(NOT SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID AND SWIFT_INCLUDE_TOOLS AND (SWIFT_BUILD_SYNTAXPARSERLIB OR SWIFT_BUILD_SOURCEKIT)) if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) set(SWIFT_BUILD_HOST_DISPATCH TRUE) endif() diff --git a/swift/utils/build-script b/swift/utils/build-script index b4c3f6f6b28..27045d12eac 100755 --- a/swift/utils/build-script +++ b/swift/utils/build-script @@ -817,6 +817,7 @@ class BuildScriptInvocation(object): """ args = self.args + args.build_root = self.workspace.build_root options = {} for host_target in [args.host_target] + args.cross_compile_hosts: @@ -838,6 +839,8 @@ class BuildScriptInvocation(object): config.swift_benchmark_run_targets), "SWIFT_TEST_TARGETS": " ".join( config.swift_test_run_targets), + "SWIFT_FLAGS": config.swift_flags, + "SWIFT_TARGET_CMAKE_OPTIONS": config.cmake_options, } return options diff --git a/swift/utils/build-script-impl b/swift/utils/build-script-impl index 66a4408d066..2f6e9981252 100755 --- a/swift/utils/build-script-impl +++ b/swift/utils/build-script-impl @@ -137,7 +137,6 @@ KNOWN_SETTINGS=( common-cmake-options "" "CMake options used for all targets, including LLVM/Clang" extra-cmake-options "" "Extra options to pass to CMake for all targets" ninja-cmake-options "" "CMake options used for all ninja targets" - ninja-cmake-options "" "CMake options used for all ninja targets" ## Build ... build-llvm "1" "set to 1 to build LLVM and Clang" @@ -199,6 +198,7 @@ swift-stdlib-single-threaded-runtime "0" "whether to build stdlib as a single-threaded runtime only" swift-stdlib-os-versioning "1" "whether to build stdlib with availability based on OS versions (Darwin only)" swift-stdlib-stable-abi "" "should stdlib be built with stable ABI, if not set defaults to true on Darwin, false otherwise" + common-swift-flags "" "Flags used for Swift targets other than the stdlib, like the corelibs" ## FREESTANDING Stdlib Options swift-freestanding-sdk "" "which SDK to use when building the FREESTANDING stdlib" @@ -224,6 +223,7 @@ KNOWN_SETTINGS=( cross-compile-hosts "" "space-separated list of targets to cross-compile host Swift tools for" cross-compile-with-host-tools "" "set to use the clang we build for the host to then build the cross-compile hosts" cross-compile-install-prefixes "" "semicolon-separated list of install prefixes to use for the cross-compiled hosts. The list expands, so if there are more cross-compile hosts than prefixes, unmatched hosts use the last prefix in the list" + cross-compile-deps-path "" "path for CMake to look for cross-compiled library dependencies, such as libXML2" skip-merge-lipo-cross-compile-tools "" "set to skip running merge-lipo after installing cross-compiled host Swift tools" coverage-db "" "If set, coverage database to use when prioritizing testing" skip-local-host-install "" "If we are cross-compiling multiple targets, skip an install pass locally if the hosts match" @@ -1206,6 +1206,8 @@ function calculate_targets_for_host() { SWIFT_BENCHMARK_TARGETS=($(get_host_specific_variable ${host} SWIFT_BENCHMARK_TARGETS)) SWIFT_RUN_BENCHMARK_TARGETS=($(get_host_specific_variable ${host} SWIFT_RUN_BENCHMARK_TARGETS)) SWIFT_TEST_TARGETS=($(get_host_specific_variable ${host} SWIFT_TEST_TARGETS)) + SWIFT_FLAGS=($(get_host_specific_variable ${host} SWIFT_FLAGS)) + SWIFT_TARGET_CMAKE_OPTIONS=($(get_host_specific_variable ${host} SWIFT_TARGET_CMAKE_OPTIONS)) } @@ -1347,6 +1349,10 @@ function swift_c_flags() { fi } +function common_swift_flags() { + echo -n "${SWIFT_FLAGS[@]} ${COMMON_SWIFT_FLAGS} -module-cache-path \"${module_cache}\" " +} + function cmake_config_opt() { product=$1 if [[ "${CMAKE_GENERATOR}" == "Xcode" ]] ; then @@ -1631,6 +1637,9 @@ for host in "${ALL_HOSTS[@]}"; do -DCMAKE_BUILD_TYPE:STRING="${CMARK_BUILD_TYPE}" "${cmark_cmake_options[@]}" ) + if [[ $(is_cross_tools_host ${host}) ]] ; then + cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") + fi build_targets=(all) ;; @@ -1751,6 +1760,7 @@ for host in "${ALL_HOSTS[@]}"; do -DCLANG_TABLEGEN=$(build_directory "${LOCAL_HOST}" llvm)/bin/clang-tblgen -DLLVM_NATIVE_BUILD=$(build_directory "${LOCAL_HOST}" llvm) ) + cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") fi ;; @@ -2161,7 +2171,7 @@ for host in "${ALL_HOSTS[@]}"; do -DCMAKE_CXX_COMPILER:PATH="${CLANG_BIN}/clang++" -DCMAKE_INSTALL_PREFIX:PATH="$(get_host_install_prefix ${host})" -DCMAKE_Swift_COMPILER:PATH=${SWIFTC_BIN} - -DCMAKE_Swift_FLAGS:STRING="-module-cache-path \"${module_cache}\"" + -DCMAKE_Swift_FLAGS:STRING="$(common_swift_flags)" -DLLBUILD_ENABLE_ASSERTIONS:BOOL=$(true_false "${LLBUILD_ENABLE_ASSERTIONS}") -DLLBUILD_SUPPORT_BINDINGS:=Swift @@ -2177,6 +2187,16 @@ for host in "${ALL_HOSTS[@]}"; do -DFoundation_DIR:PATH=$(build_directory ${host} foundation)/cmake/modules ) + if [[ $(is_cross_tools_host ${host}) ]] ; then + cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") + + # CROSS_COMPILE_DEPS_PATH is searched for the SQLite3 dependency. + cmake_options+=( + -DCMAKE_FIND_ROOT_PATH:PATH="${CROSS_COMPILE_DEPS_PATH}" + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER + ) + fi + # Ensure on Darwin platforms that we consider only the SQLite headers # from the SDK instead of picking ones found elsewhere # (e.g. in /usr/include ) @@ -2234,7 +2254,7 @@ for host in "${ALL_HOSTS[@]}"; do -DCMAKE_C_COMPILER:PATH="${CLANG_BIN}/clang" -DCMAKE_CXX_COMPILER:PATH="${CLANG_BIN}/clang++" -DCMAKE_Swift_COMPILER:PATH=${SWIFTC_BIN} - -DCMAKE_Swift_FLAGS:STRING="-module-cache-path \"${module_cache}\"" + -DCMAKE_Swift_FLAGS:STRING="$(common_swift_flags)" -DCMAKE_INSTALL_PREFIX:PATH="$(get_host_install_prefix ${host})" -DCMAKE_INSTALL_LIBDIR:PATH="lib" @@ -2250,6 +2270,9 @@ for host in "${ALL_HOSTS[@]}"; do -DENABLE_TESTING=YES ) + if [[ $(is_cross_tools_host ${host}) ]] ; then + cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") + fi ;; esac @@ -2303,7 +2326,7 @@ for host in "${ALL_HOSTS[@]}"; do -DCMAKE_CXX_COMPILER:PATH=${CLANG_BIN}/clang++ -DCMAKE_SWIFT_COMPILER:PATH=${SWIFTC_BIN} -DCMAKE_Swift_COMPILER:PATH=${SWIFTC_BIN} - -DCMAKE_Swift_FLAGS:STRING="-module-cache-path \"${module_cache}\"" + -DCMAKE_Swift_FLAGS:STRING="$(common_swift_flags)" -DCMAKE_INSTALL_PREFIX:PATH=$(get_host_install_prefix ${host}) ${LIBICU_BUILD_ARGS[@]} @@ -2319,6 +2342,21 @@ for host in "${ALL_HOSTS[@]}"; do -DBUILD_SHARED_LIBS=$([[ ${product} == foundation_static ]] && echo "NO" || echo "YES") ) + if [[ $(is_cross_tools_host ${host}) ]] ; then + cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") + + # CROSS_COMPILE_DEPS_PATH is searched for the ICU, libXML2 + # and libcurl dependencies. + cmake_options+=( + -DCMAKE_FIND_ROOT_PATH:PATH="${CROSS_COMPILE_DEPS_PATH}" + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER + ) + fi + if [[ "${host}" == "android-"* ]]; then + cmake_options+=( + -DCMAKE_HAVE_LIBC_PTHREAD=True + ) + fi ;; libdispatch|libdispatch_static) LIBDISPATCH_BUILD_DIR=$(build_directory ${host} ${product}) @@ -2345,7 +2383,7 @@ for host in "${ALL_HOSTS[@]}"; do -DCMAKE_CXX_COMPILER:PATH="${CLANG_BIN}/clang++" -DCMAKE_SWIFT_COMPILER:PATH="${SWIFTC_BIN}" -DCMAKE_Swift_COMPILER:PATH="${SWIFTC_BIN}" - -DCMAKE_Swift_FLAGS:STRING="-module-cache-path \"${module_cache}\"" + -DCMAKE_Swift_FLAGS:STRING="$(common_swift_flags)" -DCMAKE_INSTALL_PREFIX:PATH="$(get_host_install_prefix ${host})" -DCMAKE_INSTALL_LIBDIR:PATH="lib" @@ -2354,6 +2392,9 @@ for host in "${ALL_HOSTS[@]}"; do -DENABLE_TESTING=YES -DBUILD_SHARED_LIBS=$([[ ${product} == libdispatch_static ]] && echo "NO" || echo "YES") ) + if [[ $(is_cross_tools_host ${host}) ]] ; then + cmake_options+=("${SWIFT_TARGET_CMAKE_OPTIONS[@]}") + fi ;; esac diff --git a/swift/utils/swift_build_support/swift_build_support/host_specific_configuration.py b/swift/utils/swift_build_support/swift_build_support/host_specific_configuration.py index 9bd750657b8..1e24aee8468 100644 --- a/swift/utils/swift_build_support/swift_build_support/host_specific_configuration.py +++ b/swift/utils/swift_build_support/swift_build_support/host_specific_configuration.py @@ -72,6 +72,8 @@ class HostSpecificConfiguration(object): self.swift_test_run_targets = [] self.swift_benchmark_build_targets = [] self.swift_benchmark_run_targets = [] + self.swift_flags = '' + self.cmake_options = '' for deployment_target_name in stdlib_targets_to_configure: # Get the target object. deployment_target = StdlibDeploymentTarget.get_target_for_name( @@ -194,6 +196,13 @@ class HostSpecificConfiguration(object): "check-swift{}-optimize_none_with_implicit_dynamic-{}" .format(subset_suffix, name)) + # Only pull in these flags when cross-compiling with + # --cross-compile-hosts. + if deployment_target_name != args.host_target and \ + host_target != args.host_target: + self.swift_flags = deployment_target.swift_flags(args) + self.cmake_options = deployment_target.cmake_options(args) + def __platforms_to_skip_build(self, args): platforms_to_skip_build = set() if not args.build_linux: diff --git a/swift/utils/swift_build_support/swift_build_support/targets.py b/swift/utils/swift_build_support/swift_build_support/targets.py index cb42f52c633..61778ad9837 100644 --- a/swift/utils/swift_build_support/swift_build_support/targets.py +++ b/swift/utils/swift_build_support/swift_build_support/targets.py @@ -152,6 +152,29 @@ class Target(object): def name(self): return "{}-{}".format(self.platform.name, self.arch) + def swift_flags(self, args): + flags = '' + if self.platform.name == 'android': + flags = '-target %s-unknown-linux-android%s ' % (self.arch, + args.android_api_level) + flags += '-resource-dir %s/swift-%s/lib/swift ' % ( + args.build_root, self.name) + flags += '-sdk %s/sysroot ' % (args.android_ndk) + flags += '-tools-directory %s/bin' % (args.android_ndk) + flags += ' -Xlinker -rpath -Xlinker @TERMUX_PREFIX@/lib' + + return flags + + def cmake_options(self, args): + options = '' + if self.platform.name == 'android': + options = '-DCMAKE_SYSTEM_NAME=Android ' + options += '-DCMAKE_SYSTEM_VERSION=%s ' % (args.android_api_level) + options += '-DCMAKE_SYSTEM_PROCESSOR=%s ' % (args.android_arch if not + args.android_arch == 'armv7' else 'armv7-a') + options += '-DCMAKE_ANDROID_STANDALONE_TOOLCHAIN:PATH=%s' % (args.android_ndk) + + return options class StdlibDeploymentTarget(object): OSX = DarwinPlatform("macosx", archs=["x86_64", "arm64", "arm64e"],