Skip to content

[build] Make the new --cross-compile-build-swift-tools flag public #83422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions utils/build_swift/build_swift/driver_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,12 @@ def create_argument_parser():
"for each cross-compiled toolchain's destdir, useful when building "
"multiple toolchains and can be disabled if only cross-compiling one.")

option('--cross-compile-build-swift-tools', toggle_true,
default=True,
help="Cross-compile the Swift compiler, other host tools from the "
"compiler repository, and various macros for each listed "
"--cross-compile-hosts platform.")

option('--stdlib-deployment-targets', store,
type=argparse.ShellSplitType(),
default=None,
Expand Down
2 changes: 2 additions & 0 deletions utils/build_swift/tests/expected_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@
'compiler_vendor': defaults.COMPILER_VENDOR,
'coverage_db': None,
'cross_compile_append_host_target_to_destdir': True,
'cross_compile_build_swift_tools': True,
'cross_compile_deps_path': None,
'cross_compile_hosts': [],
'infer_cross_compile_hosts_on_darwin': False,
Expand Down Expand Up @@ -628,6 +629,7 @@ class BuildScriptImplOption(_BaseOption):
EnableOption('--build-swift-clang-overlays'),
EnableOption('--build-swift-remote-mirror'),
EnableOption('--cross-compile-append-host-target-to-destdir'),
EnableOption('--cross-compile-build-swift-tools'),
EnableOption('--color-in-tests'),
EnableOption('--distcc'),
EnableOption('--sccache'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ def convert_to_impl_arguments(self):
"--cmake-generator", args.cmake_generator,
"--cross-compile-append-host-target-to-destdir", str(
args.cross_compile_append_host_target_to_destdir).lower(),
"--cross-compile-build-swift-tools", str(
args.cross_compile_build_swift_tools).lower(),
"--build-jobs", str(args.build_jobs),
"--lit-jobs", str(args.lit_jobs),
"--common-cmake-options=%s" % ' '.join(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def is_verbose(self):

def build_with_cmake(self, build_targets, build_type, build_args,
prefer_native_toolchain=False,
ignore_extra_cmake_options=False):
ignore_extra_cmake_options=False, build_llvm=True):
assert self.toolchain.cmake is not None
cmake_build = []
_cmake = cmake.CMake(self.args, self.toolchain,
Expand Down Expand Up @@ -73,9 +73,7 @@ def build_with_cmake(self, build_targets, build_type, build_args,
env=env)

is_llvm = self.product_name() == "llvm"
if (not is_llvm and not self.args.skip_build) or (
is_llvm and self.args._build_llvm
):
if (not is_llvm and not self.args.skip_build) or (is_llvm and build_llvm):
cmake_opts = [self.build_dir, "--config", build_type]

shell.call(
Expand Down
12 changes: 9 additions & 3 deletions utils/swift_build_support/swift_build_support/products/llvm.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,13 @@ def build(self, host_target):
# space/time efficient than -g on that platform.
llvm_cmake_options.define('LLVM_USE_SPLIT_DWARF:BOOL', 'YES')

if not self.args._build_llvm:
build = True
if not self.args._build_llvm or (not self.args.cross_compile_build_swift_tools
and self.is_cross_compile_target(host_target)):
# Indicating we don't want to build LLVM at all should
# override everything.
build_targets = []
build = False
elif self.args.skip_build or not self.args.build_llvm:
# We can't skip the build completely because the standalone
# build of Swift depends on these.
Expand Down Expand Up @@ -456,7 +459,8 @@ def build(self, host_target):

self._handle_cxx_headers(host_target, platform)

self.build_with_cmake(build_targets, self.args.llvm_build_variant, [])
self.build_with_cmake(build_targets, self.args.llvm_build_variant, [],
build_llvm=build)

# copy over the compiler-rt builtins for iOS/tvOS/watchOS to ensure
# that Swift's stdlib can use compiler-rt builtins when targeting
Expand Down Expand Up @@ -541,7 +545,9 @@ def should_install(self, host_target):
Whether or not this product should be installed with the given
arguments.
"""
return self.args.install_llvm
return self.args.install_llvm and (
self.args.cross_compile_build_swift_tools or
not self.is_cross_compile_target(host_target))

def install(self, host_target):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,24 @@ def should_clean(self, host_target):
return True

def should_build(self, host_target):
return True
build_macros = not self.is_cross_compile_target(host_target) or \
self.args.cross_compile_build_swift_tools
if not build_macros:
print("Skipping building Testing Macros for %s, because the host tools "
"are not being built" % host_target)
return build_macros

def should_test(self, host_target):
return False

def should_install(self, host_target):
return self.args.install_swift_testing_macros
install_macros = self.args.install_swift_testing_macros and \
(not self.is_cross_compile_target(host_target) or
self.args.cross_compile_build_swift_tools)
if self.args.install_swift_testing_macros and not install_macros:
print("Skipping installing Testing Macros for %s, because the host tools "
"are not being built" % host_target)
return install_macros

def _cmake_product(self, host_target):
build_root = os.path.dirname(self.build_dir)
Expand Down Expand Up @@ -121,3 +132,11 @@ def install(self, host_target):
install_prefix = install_destdir + self.args.install_prefix

self.install_with_cmake(['install'], install_prefix)

@classmethod
def is_build_script_impl_product(cls):
return False

@classmethod
def is_before_build_script_impl_product(cls):
return False
16 changes: 9 additions & 7 deletions validation-test/BuildSystem/android_cross_compile.test
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# REQUIRES: standalone_build
# UNSUPPORTED: OS=macosx
# UNSUPPORTED: OS=ios
# UNSUPPORTED: OS=tvos
# UNSUPPORTED: OS=watchos

# RUN: %empty-directory(%t)
# RUN: SKIP_XCODE_VERSION_CHECK=1 SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --cmake %cmake --libdispatch --cross-compile-hosts=android-aarch64 --skip-local-build --android --android-ndk %t/ndk/ --android-arch aarch64 2>&1 | %FileCheck %s
# RUN: SKIP_XCODE_VERSION_CHECK=1 SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --cmake %cmake --swift-testing --swift-testing-macros --install-swift-testing-macros --install-llvm --cross-compile-hosts=android-aarch64 --cross-compile-build-swift-tools=False --android --android-ndk %t/ndk/ --android-arch aarch64 2>&1 | %FileCheck %s

# CHECK: -DCMAKE_Swift_FLAGS{{.*}}-target {{.*}}unknown-linux-android{{.*}} -sdk
# CHECK: -DCMAKE_SYSTEM_NAME=Android {{.*}} -DCMAKE_ANDROID_NDK
# CHECK: pushd {{.*}}/llvm-android-aarch64
# CHECK-NOT: cmake --build {{.*}}/llvm-android-aarch64 --config
# CHECK-NOT: cmake --build {{.*}}/llvm-android-aarch64 {{.*}} install-llvm
# CHECK: cmake {{.*}}-DSWIFT_INCLUDE_TOOLS:BOOL=FALSE{{.*}}/swift
# CHECK: Skipping building Testing Macros for android-aarch64, because the host tools are not being built
# CHECK: Skipping installing Testing Macros for android-aarch64, because the host tools are not being built
# CHECK: cmake {{.*}}-DCMAKE_TOOLCHAIN_FILE:PATH={{.*}}swifttesting-android-aarch64/BuildScriptToolchain.cmake
# CHECK: -DCMAKE_Swift_FLAGS=-target aarch64-unknown-linux-android{{.*}} -sdk