@@ -148,3 +148,102 @@ index fba09416ddb..67b81daba12 100644
148148
149149 android_toolchain_path = self.ndk_toolchain_path(args)
150150
151+ diff --git a/swift/utils/build_swift/build_swift/driver_arguments.py b/swift/utils/build_swift/build_swift/driver_arguments.py
152+ index 2b7d6d07799..e0d04d22825 100644
153+ --- a/swift/utils/build_swift/build_swift/driver_arguments.py
154+ +++ b/swift/utils/build_swift/build_swift/driver_arguments.py
155+ @@ -677,6 +677,12 @@ def create_argument_parser():
156+ "for each cross-compiled toolchain's destdir, useful when building "
157+ "multiple toolchains and can be disabled if only cross-compiling one.")
158+
159+ + option('--cross-compile-build-swift-tools', toggle_true,
160+ + default=True,
161+ + help="Cross-compile the Swift compiler, other host tools from the "
162+ + "compiler repository, and various macros for each listed "
163+ + "--cross-compile-hosts platform.")
164+ +
165+ option('--stdlib-deployment-targets', store,
166+ type=argparse.ShellSplitType(),
167+ default=None,
168+ diff --git a/swift/utils/build_swift/tests/expected_options.py b/swift/utils/build_swift/tests/expected_options.py
169+ index dddb505174e..6052e1f3da6 100644
170+ --- a/swift/utils/build_swift/tests/expected_options.py
171+ +++ b/swift/utils/build_swift/tests/expected_options.py
172+ @@ -156,6 +156,7 @@ EXPECTED_DEFAULTS = {
173+ 'compiler_vendor': defaults.COMPILER_VENDOR,
174+ 'coverage_db': None,
175+ 'cross_compile_append_host_target_to_destdir': True,
176+ + 'cross_compile_build_swift_tools': True,
177+ 'cross_compile_deps_path': None,
178+ 'cross_compile_hosts': [],
179+ 'infer_cross_compile_hosts_on_darwin': False,
180+ @@ -628,6 +629,7 @@ EXPECTED_OPTIONS = [
181+ EnableOption('--build-swift-clang-overlays'),
182+ EnableOption('--build-swift-remote-mirror'),
183+ EnableOption('--cross-compile-append-host-target-to-destdir'),
184+ + EnableOption('--cross-compile-build-swift-tools'),
185+ EnableOption('--color-in-tests'),
186+ EnableOption('--distcc'),
187+ EnableOption('--sccache'),
188+ diff --git a/swift/utils/swift_build_support/swift_build_support/build_script_invocation.py b/swift/utils/swift_build_support/swift_build_support/build_script_invocation.py
189+ index a0289515fd0..355d72fe21f 100644
190+ --- a/swift/utils/swift_build_support/swift_build_support/build_script_invocation.py
191+ +++ b/swift/utils/swift_build_support/swift_build_support/build_script_invocation.py
192+ @@ -119,6 +119,8 @@ class BuildScriptInvocation(object):
193+ "--cmake-generator", args.cmake_generator,
194+ "--cross-compile-append-host-target-to-destdir", str(
195+ args.cross_compile_append_host_target_to_destdir).lower(),
196+ + "--cross-compile-build-swift-tools", str(
197+ + args.cross_compile_build_swift_tools).lower(),
198+ "--build-jobs", str(args.build_jobs),
199+ "--lit-jobs", str(args.lit_jobs),
200+ "--common-cmake-options=%s" % ' '.join(
201+ diff --git a/swift/utils/swift_build_support/swift_build_support/products/llvm.py b/swift/utils/swift_build_support/swift_build_support/products/llvm.py
202+ index ffae1d66702..bc6e00e7ea3 100644
203+ --- a/swift/utils/swift_build_support/swift_build_support/products/llvm.py
204+ +++ b/swift/utils/swift_build_support/swift_build_support/products/llvm.py
205+ @@ -249,7 +249,8 @@ class LLVM(cmake_product.CMakeProduct):
206+ # space/time efficient than -g on that platform.
207+ llvm_cmake_options.define('LLVM_USE_SPLIT_DWARF:BOOL', 'YES')
208+
209+ - if not self.args._build_llvm:
210+ + if not self.args._build_llvm or (not self.args.cross_compile_build_swift_tools and self.is_cross_compile_target(host_target)):
211+ + self.args._build_llvm = False
212+ # Indicating we don't want to build LLVM at all should
213+ # override everything.
214+ build_targets = []
215+ @@ -484,7 +484,7 @@ class LLVM(cmake_product.CMakeProduct):
216+ Whether or not this product should be installed with the given
217+ arguments.
218+ """
219+ - return self.args.install_llvm
220+ + return self.args.install_llvm and (self.args.cross_compile_build_swift_tools or not self.is_cross_compile_target(host_target))
221+
222+ def install(self, host_target):
223+ """
224+ diff --git a/swift/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py b/swift/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py
225+ index ddb3b553de7..7195d921da2 100644
226+ --- a/swift/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py
227+ +++ b/swift/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py
228+ @@ -42,13 +42,19 @@ class SwiftTestingMacros(product.Product):
229+ return True
230+
231+ def should_build(self, host_target):
232+ - return True
233+ + build_macros = not self.is_cross_compile_target(host_target) or self.args.cross_compile_build_swift_tools
234+ + if not build_macros:
235+ + print("Skipping building Testing Macros for %s, because the host tools are not being built", host_target)
236+ + return build_macros
237+
238+ def should_test(self, host_target):
239+ return False
240+
241+ def should_install(self, host_target):
242+ - return self.args.install_swift_testing_macros
243+ + 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)
244+ + if self.args.install_swift_testing_macros and not install_macros:
245+ + print("Skipping installing Testing Macros for %s, because the host tools are not being built", host_target)
246+ + return install_macros
247+
248+ def _cmake_product(self, host_target):
249+ build_root = os.path.dirname(self.build_dir)
0 commit comments