Skip to content

Commit 5fa1abc

Browse files
committed
Android: add cross-compilation configuration file flag
In addition to '--cross-compile-hosts', add a new bootstrap flag, '--cross-compile-config', that will pass in a JSON file with the destination cross-compilation flags.
1 parent 065536e commit 5fa1abc

File tree

1 file changed

+34
-25
lines changed

1 file changed

+34
-25
lines changed

Utilities/bootstrap

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ def add_build_args(parser):
144144
dest="cross_compile_hosts",
145145
help="List of cross compile hosts targets.",
146146
default=[])
147+
parser.add_argument(
148+
"--cross-compile-config",
149+
help="Swift flags to cross-compile SPM with itself")
147150

148151
def add_test_args(parser):
149152
"""Configures the parser with the arguments necessary for the test action."""
@@ -197,8 +200,14 @@ def parse_build_args(args):
197200
args.clang_path = get_clang_path(args)
198201
args.cmake_path = get_cmake_path(args)
199202
args.ninja_path = get_ninja_path(args)
200-
if args.cross_compile_hosts: # Use XCBuild target directory when building for multiple arches.
201-
args.target_dir = os.path.join(args.build_dir, "apple/Products")
203+
if args.cross_compile_hosts:
204+
if "macosx-arm64" in args.cross_compile_hosts:
205+
# Use XCBuild target directory when building for multiple arches.
206+
args.target_dir = os.path.join(args.build_dir, "apple/Products")
207+
elif re.match('android-', args.cross_compile_hosts):
208+
args.target_dir = os.path.join(
209+
args.build_dir,
210+
get_build_target(args,cross_compile=True))
202211
else:
203212
args.target_dir = os.path.join(args.build_dir, get_build_target(args))
204213
args.bootstrap_dir = os.path.join(args.target_dir, "bootstrap")
@@ -272,10 +281,15 @@ def get_ninja_path(args):
272281
else:
273282
return call_output(["which", "ninja"], verbose=args.verbose)
274283

275-
def get_build_target(args):
276-
"""Returns the target-triple of the current machine."""
284+
def get_build_target(args, cross_compile=False):
285+
"""Returns the target-triple of the current machine or for cross-compilation."""
277286
try:
278-
target_info_json = subprocess.check_output([args.swiftc_path, '-print-target-info'], stderr=subprocess.PIPE, universal_newlines=True).strip()
287+
command = [args.swiftc_path, '-print-target-info']
288+
if cross_compile:
289+
cross_compile_json = json.load(open(args.cross_compile_config))
290+
command += ['-target', cross_compile_json["target"]]
291+
target_info_json = subprocess.check_output(command,
292+
stderr=subprocess.PIPE, universal_newlines=True).strip()
279293
args.target_info = json.loads(target_info_json)
280294
return args.target_info["target"]["unversionedTriple"]
281295
except Exception as e:
@@ -310,8 +324,8 @@ def build(args):
310324
build_swift_argument_parser(args)
311325
build_swift_driver(args)
312326
build_swift_crypto(args)
327+
build_swiftpm_with_cmake(args)
313328

314-
build_swiftpm_with_cmake(args)
315329
build_swiftpm_with_swiftpm(args,integrated_swift_driver=False)
316330

317331
def test(args):
@@ -469,7 +483,7 @@ def install_binary(args, binary, dest_dir):
469483
# Build functions
470484
# -----------------------------------------------------------
471485

472-
def build_with_cmake(args, cmake_args, source_path, build_dir, targets=[]):
486+
def build_with_cmake(args, cmake_args, source_path, build_dir):
473487
"""Runs CMake if needed, then builds with Ninja."""
474488
cache_path = os.path.join(build_dir, "CMakeCache.txt")
475489
if args.reconfigure or not os.path.isfile(cache_path) or not args.swiftc_path in open(cache_path).read():
@@ -500,8 +514,6 @@ def build_with_cmake(args, cmake_args, source_path, build_dir, targets=[]):
500514
if args.verbose:
501515
ninja_cmd.append("-v")
502516

503-
ninja_cmd += targets
504-
505517
call(ninja_cmd, cwd=build_dir, verbose=args.verbose)
506518

507519
def build_llbuild(args):
@@ -607,26 +619,20 @@ def build_swiftpm_with_cmake(args):
607619
"""Builds SwiftPM using CMake."""
608620
note("Building SwiftPM (with CMake)")
609621

610-
if args.bootstrap:
611-
cmake_flags = [
612-
get_llbuild_cmake_arg(args),
613-
"-DTSC_DIR=" + os.path.join(args.tsc_build_dir, "cmake/modules"),
614-
"-DYams_DIR=" + os.path.join(args.yams_build_dir, "cmake/modules"),
615-
"-DArgumentParser_DIR=" + os.path.join(args.swift_argument_parser_build_dir, "cmake/modules"),
616-
"-DSwiftDriver_DIR=" + os.path.join(args.swift_driver_build_dir, "cmake/modules"),
617-
"-DSwiftCrypto_DIR=" + os.path.join(args.swift_crypto_build_dir, "cmake/modules"),
618-
"-DFIND_PM_DEPS:BOOL=YES",
619-
]
620-
else:
621-
cmake_flags = [ "-DFIND_PM_DEPS:BOOL=NO" ]
622+
cmake_flags = [
623+
get_llbuild_cmake_arg(args),
624+
"-DTSC_DIR=" + os.path.join(args.tsc_build_dir, "cmake/modules"),
625+
"-DYams_DIR=" + os.path.join(args.yams_build_dir, "cmake/modules"),
626+
"-DArgumentParser_DIR=" + os.path.join(args.swift_argument_parser_build_dir, "cmake/modules"),
627+
"-DSwiftDriver_DIR=" + os.path.join(args.swift_driver_build_dir, "cmake/modules"),
628+
"-DSwiftCrypto_DIR=" + os.path.join(args.swift_crypto_build_dir, "cmake/modules"),
629+
]
622630

623631
if platform.system() == 'Darwin':
624632
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
625633
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
626634

627-
targets = [] if args.bootstrap else ["PD4", "PD4_2"]
628-
629-
build_with_cmake(args, cmake_flags, args.project_root, args.bootstrap_dir, targets)
635+
build_with_cmake(args, cmake_flags, args.project_root, args.bootstrap_dir)
630636

631637
if args.llbuild_link_framework:
632638
add_rpath_for_cmake_build(args, args.llbuild_build_dir)
@@ -812,7 +818,8 @@ def get_swiftpm_flags(args):
812818
)
813819

814820
# Don't use GNU strerror_r on Android.
815-
if 'ANDROID_DATA' in os.environ:
821+
if 'ANDROID_DATA' in os.environ or (args.cross_compile_hosts and re.match(
822+
'android-', args.cross_compile_hosts)):
816823
build_flags.extend(["-Xswiftc", "-Xcc", "-Xswiftc", "-U_GNU_SOURCE"])
817824

818825
# On ELF platforms, remove the host toolchain's stdlib absolute rpath from
@@ -824,6 +831,8 @@ def get_swiftpm_flags(args):
824831
cross_compile_hosts = args.cross_compile_hosts
825832
if build_target == 'x86_64-apple-macosx' and "macosx-arm64" in cross_compile_hosts:
826833
build_flags += ["--arch", "x86_64", "--arch", "arm64"]
834+
elif cross_compile_hosts and re.match('android-', cross_compile_hosts):
835+
build_flags.extend(["--destination", args.cross_compile_config])
827836
elif cross_compile_hosts:
828837
error("cannot cross-compile for %s" % cross_compile_hosts)
829838

0 commit comments

Comments
 (0)