117 lines
5.2 KiB
Diff
117 lines
5.2 KiB
Diff
diff --git a/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift b/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift
|
|
index 06a29d8..5cbfddd 100644
|
|
--- a/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift
|
|
+++ b/swift-driver/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift
|
|
@@ -14,6 +14,7 @@ import SwiftOptions
|
|
|
|
extension GenericUnixToolchain {
|
|
private func defaultLinker(for targetTriple: Triple) -> String? {
|
|
+ if targetTriple.environment == .android { return "lld" }
|
|
switch targetTriple.arch {
|
|
case .arm, .aarch64, .armeb, .thumb, .thumbeb:
|
|
// BFD linker has issues wrt relocation of the protocol conformance
|
|
@@ -133,8 +137,7 @@ extension GenericUnixToolchain {
|
|
isShared: hasRuntimeArgs
|
|
)
|
|
|
|
- if hasRuntimeArgs && targetTriple.environment != .android &&
|
|
- toolchainStdlibRpath {
|
|
+ if hasRuntimeArgs && toolchainStdlibRpath {
|
|
// FIXME: We probably shouldn't be adding an rpath here unless we know
|
|
// ahead of time the standard library won't be copied.
|
|
for path in runtimePaths {
|
|
diff --git a/swift-driver/Utilities/build-script-helper.py b/swift-driver/Utilities/build-script-helper.py
|
|
index e986475..83916c3 100755
|
|
--- a/swift-driver/Utilities/build-script-helper.py
|
|
+++ b/swift-driver/Utilities/build-script-helper.py
|
|
@@ -11,6 +11,7 @@ import shutil
|
|
import subprocess
|
|
import sys
|
|
import errno
|
|
+import re
|
|
|
|
if platform.system() == 'Darwin':
|
|
shared_lib_ext = '.dylib'
|
|
@@ -96,8 +97,13 @@ def get_swiftpm_options(args):
|
|
os.path.join(args.toolchain, 'lib', 'swift', 'Block'),
|
|
]
|
|
|
|
- if 'ANDROID_DATA' in os.environ:
|
|
+ if args.cross_compile_hosts:
|
|
+ swiftpm_args += [ '--destination', args.cross_compile_config ]
|
|
+
|
|
+ if 'ANDROID_DATA' in os.environ or (args.cross_compile_hosts and re.match(
|
|
+ 'android-', args.cross_compile_hosts[0])):
|
|
swiftpm_args += [
|
|
+ '-Xlinker', '-landroid-spawn',
|
|
'-Xlinker', '-rpath', '-Xlinker', '$ORIGIN/../lib/swift/android',
|
|
# SwiftPM will otherwise try to compile against GNU strerror_r on
|
|
# Android and fail.
|
|
@@ -177,8 +185,13 @@ def handle_invocation(args):
|
|
if args.sysroot:
|
|
env['SDKROOT'] = args.sysroot
|
|
|
|
+ env['SWIFT_EXEC'] = '%sc' % (swift_exec)
|
|
+
|
|
if args.action == 'build':
|
|
- build_using_cmake(args, toolchain_bin, args.build_path, targets)
|
|
+ if args.cross_compile_hosts and not re.match('-macosx', args.cross_compile_hosts[0]):
|
|
+ swiftpm('build', swift_exec, swiftpm_args, env)
|
|
+ else:
|
|
+ build_using_cmake(args, toolchain_bin, args.build_path, targets)
|
|
|
|
elif args.action == 'clean':
|
|
print('Cleaning ' + args.build_path)
|
|
@@ -188,7 +201,6 @@ def handle_invocation(args):
|
|
tool_path = os.path.join(toolchain_bin, tool)
|
|
if os.path.exists(tool_path):
|
|
env['SWIFT_DRIVER_' + tool.upper().replace('-','_') + '_EXEC'] = '%s' % (tool_path)
|
|
- env['SWIFT_EXEC'] = '%sc' % (swift_exec)
|
|
test_args = swiftpm_args
|
|
test_args += ['-Xswiftc', '-enable-testing']
|
|
if should_test_parallel():
|
|
@@ -205,16 +217,17 @@ def handle_invocation(args):
|
|
else:
|
|
bin_path = swiftpm_bin_path(swift_exec, swiftpm_args, env)
|
|
swiftpm('build', swift_exec, swiftpm_args, env)
|
|
- non_darwin_install(bin_path, args.toolchain, args.verbose)
|
|
+ non_darwin_install(args, bin_path)
|
|
else:
|
|
assert False, 'unknown action \'{}\''.format(args.action)
|
|
|
|
# Installation flow for non-darwin platforms, only copies over swift-driver and swift-help
|
|
# TODO: Unify CMake-based installation flow used on Darwin with this
|
|
-def non_darwin_install(swiftpm_bin_path, toolchain, verbose):
|
|
- toolchain_bin = os.path.join(toolchain, 'bin')
|
|
- for exe in executables_to_install:
|
|
- install_binary(exe, swiftpm_bin_path, toolchain_bin, verbose)
|
|
+def non_darwin_install(args, swiftpm_bin_path):
|
|
+ for prefix in args.install_prefixes:
|
|
+ prefix_bin = os.path.join(prefix, 'bin')
|
|
+ for exe in executables_to_install:
|
|
+ install_binary(exe, swiftpm_bin_path, prefix_bin, args.verbose)
|
|
|
|
def install(args, build_dir, targets):
|
|
# Construct and install universal swift-driver, swift-help executables
|
|
@@ -581,6 +594,10 @@ def main():
|
|
nargs='*',
|
|
help='List of cross compile hosts targets.',
|
|
default=[])
|
|
+ parser.add_argument(
|
|
+ '--cross-compile-config',
|
|
+ metavar='PATH',
|
|
+ help="A JSON SPM config file with Swift flags for cross-compilation")
|
|
parser.add_argument('--ninja-bin', metavar='PATH', help='ninja binary to use for testing')
|
|
parser.add_argument('--cmake-bin', metavar='PATH', help='cmake binary to use for building')
|
|
parser.add_argument('--build-path', metavar='PATH', default='.build', help='build in the given path')
|
|
@@ -617,9 +634,6 @@ def main():
|
|
else:
|
|
args.sysroot = None
|
|
|
|
- if args.cross_compile_hosts and not all('apple-macos' in target for target in args.cross_compile_hosts):
|
|
- error('Cross-compilation is currently only supported for the Darwin platform.')
|
|
-
|
|
if args.cross_compile_hosts and args.local_compiler_build:
|
|
error('Cross-compilation is currently not supported for the local compiler installation')
|
|
|