Skip to content

Commit 00c1f4b

Browse files
committed
Android: add cross-compilation flags
In addition to '--cross-compile-hosts', add two new bootstrap flags, '--cross-compile-target-triple' and '--cross-compile-config', that will pass in a target and a JSON file with the destination flags.
1 parent 065536e commit 00c1f4b

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

Utilities/bootstrap

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ 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-target-triple",
149+
help="Swift cross-compilation target triple")
150+
parser.add_argument(
151+
"--cross-compile-config",
152+
help="Swift flags to cross-compile SPM with itself")
147153

148154
def add_test_args(parser):
149155
"""Configures the parser with the arguments necessary for the test action."""
@@ -197,8 +203,14 @@ def parse_build_args(args):
197203
args.clang_path = get_clang_path(args)
198204
args.cmake_path = get_cmake_path(args)
199205
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")
206+
if args.cross_compile_hosts:
207+
if "macosx-arm64" in args.cross_compile_hosts:
208+
# Use XCBuild target directory when building for multiple arches.
209+
args.target_dir = os.path.join(args.build_dir, "apple/Products")
210+
elif re.match('android-', args.cross_compile_hosts):
211+
args.target_dir = os.path.join(
212+
args.build_dir,
213+
get_build_target(args,cross_compile=True))
202214
else:
203215
args.target_dir = os.path.join(args.build_dir, get_build_target(args))
204216
args.bootstrap_dir = os.path.join(args.target_dir, "bootstrap")
@@ -272,10 +284,14 @@ def get_ninja_path(args):
272284
else:
273285
return call_output(["which", "ninja"], verbose=args.verbose)
274286

275-
def get_build_target(args):
287+
def get_build_target(args, cross_compile=False):
276288
"""Returns the target-triple of the current machine."""
277289
try:
278-
target_info_json = subprocess.check_output([args.swiftc_path, '-print-target-info'], stderr=subprocess.PIPE, universal_newlines=True).strip()
290+
command = [args.swiftc_path, '-print-target-info']
291+
if cross_compile:
292+
command += ['-target', args.cross_compile_target_triple]
293+
target_info_json = subprocess.check_output(command,
294+
stderr=subprocess.PIPE, universal_newlines=True).strip()
279295
args.target_info = json.loads(target_info_json)
280296
return args.target_info["target"]["unversionedTriple"]
281297
except Exception as e:
@@ -310,8 +326,8 @@ def build(args):
310326
build_swift_argument_parser(args)
311327
build_swift_driver(args)
312328
build_swift_crypto(args)
329+
build_swiftpm_with_cmake(args)
313330

314-
build_swiftpm_with_cmake(args)
315331
build_swiftpm_with_swiftpm(args,integrated_swift_driver=False)
316332

317333
def test(args):
@@ -469,7 +485,7 @@ def install_binary(args, binary, dest_dir):
469485
# Build functions
470486
# -----------------------------------------------------------
471487

472-
def build_with_cmake(args, cmake_args, source_path, build_dir, targets=[]):
488+
def build_with_cmake(args, cmake_args, source_path, build_dir):
473489
"""Runs CMake if needed, then builds with Ninja."""
474490
cache_path = os.path.join(build_dir, "CMakeCache.txt")
475491
if args.reconfigure or not os.path.isfile(cache_path) or not args.swiftc_path in open(cache_path).read():
@@ -500,8 +516,6 @@ def build_with_cmake(args, cmake_args, source_path, build_dir, targets=[]):
500516
if args.verbose:
501517
ninja_cmd.append("-v")
502518

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

507521
def build_llbuild(args):
@@ -607,26 +621,20 @@ def build_swiftpm_with_cmake(args):
607621
"""Builds SwiftPM using CMake."""
608622
note("Building SwiftPM (with CMake)")
609623

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" ]
624+
cmake_flags = [
625+
get_llbuild_cmake_arg(args),
626+
"-DTSC_DIR=" + os.path.join(args.tsc_build_dir, "cmake/modules"),
627+
"-DYams_DIR=" + os.path.join(args.yams_build_dir, "cmake/modules"),
628+
"-DArgumentParser_DIR=" + os.path.join(args.swift_argument_parser_build_dir, "cmake/modules"),
629+
"-DSwiftDriver_DIR=" + os.path.join(args.swift_driver_build_dir, "cmake/modules"),
630+
"-DSwiftCrypto_DIR=" + os.path.join(args.swift_crypto_build_dir, "cmake/modules"),
631+
]
622632

623633
if platform.system() == 'Darwin':
624634
cmake_flags.append("-DCMAKE_C_FLAGS=-target %s%s" % (get_build_target(args), g_macos_deployment_target))
625635
cmake_flags.append("-DCMAKE_OSX_DEPLOYMENT_TARGET=%s" % g_macos_deployment_target)
626636

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

631639
if args.llbuild_link_framework:
632640
add_rpath_for_cmake_build(args, args.llbuild_build_dir)
@@ -812,7 +820,8 @@ def get_swiftpm_flags(args):
812820
)
813821

814822
# Don't use GNU strerror_r on Android.
815-
if 'ANDROID_DATA' in os.environ:
823+
if 'ANDROID_DATA' in os.environ or (args.cross_compile_hosts and re.match(
824+
'android-', args.cross_compile_hosts)):
816825
build_flags.extend(["-Xswiftc", "-Xcc", "-Xswiftc", "-U_GNU_SOURCE"])
817826

818827
# On ELF platforms, remove the host toolchain's stdlib absolute rpath from
@@ -824,6 +833,8 @@ def get_swiftpm_flags(args):
824833
cross_compile_hosts = args.cross_compile_hosts
825834
if build_target == 'x86_64-apple-macosx' and "macosx-arm64" in cross_compile_hosts:
826835
build_flags += ["--arch", "x86_64", "--arch", "arm64"]
836+
elif cross_compile_hosts and re.match('android-', cross_compile_hosts):
837+
build_flags.extend(["--destination", args.cross_compile_config])
827838
elif cross_compile_hosts:
828839
error("cannot cross-compile for %s" % cross_compile_hosts)
829840

0 commit comments

Comments
 (0)