257 lines
13 KiB
Diff
257 lines
13 KiB
Diff
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"],
|