Skip to content

Commit 3a551f8

Browse files
authoredApr 15, 2021
[build] allow to specify ninja targets to build for LLVM (#36910)
This is meant to support scenarios in which we need to build as little as LLVM as possible for performance reasons (e.g. when enabling LTO). While LLVM CMake build system offers options in this sense, in our investigation they turned out not to be suitable, since either they are not granular enough (`LLVM_INCLUDE/BUILD` flags) or they require active opt out for any new tool added (`*_BUILD_*_TOOL` flags) When using this mechanism, there is the possibility to specify different targets to use for cross-compile hosts. Supports rdar://32019390
1 parent 55dcccb commit 3a551f8

File tree

6 files changed

+111
-0
lines changed

6 files changed

+111
-0
lines changed
 

‎utils/build-script

+11
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,17 @@ class BuildScriptInvocation(object):
801801
"--skip-clean-llbuild"
802802
]
803803

804+
if args.llvm_ninja_targets:
805+
impl_args += [
806+
"--llvm-ninja-targets=%s" % ' '.join(args.llvm_ninja_targets)
807+
]
808+
809+
if args.llvm_ninja_targets_for_cross_compile_hosts:
810+
impl_args += [
811+
"--llvm-ninja-targets-for-cross-compile-hosts=%s" %
812+
' '.join(args.llvm_ninja_targets_for_cross_compile_hosts)
813+
]
814+
804815
# Compute the set of host-specific variables, which we pass through to
805816
# the build script via environment variables.
806817
host_specific_variables = self.compute_host_specific_variables()

‎utils/build-script-impl

+9
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ KNOWN_SETTINGS=(
179179
llvm-install-components "" "a semicolon-separated list of LLVM components to install"
180180
llvm-lit-args "" "If set, override the lit args passed to LLVM"
181181
enable-llvm-assertions "1" "set to enable llvm assertions"
182+
llvm-ninja-targets "" "list of ninja targets to build for LLVM"
183+
llvm-ninja-targets-for-cross-compile-hosts "" "list of ninja targets to build for LLVM for hosts that are cross-compiled"
182184

183185
## Swift Options
184186
swift-analyze-code-coverage "not-merged" "Code coverage analysis mode for Swift (false, not-merged, merged). Defaults to false if the argument is not present, and not-merged if the argument is present without a modifier."
@@ -1636,6 +1638,13 @@ for host in "${ALL_HOSTS[@]}"; do
16361638
;;
16371639

16381640
llvm)
1641+
if [[ -n "${LLVM_NINJA_TARGETS_FOR_CROSS_COMPILE_HOSTS}" && $(is_cross_tools_host ${host}) ]] ; then
1642+
build_targets=("${LLVM_NINJA_TARGETS_FOR_CROSS_COMPILE_HOSTS[@]}")
1643+
elif [[ -n "${LLVM_NINJA_TARGETS}" ]] ; then
1644+
build_targets=("${LLVM_NINJA_TARGETS[@]}")
1645+
fi
1646+
# indicating we don't want to build LLVM should
1647+
# override any custom ninja target we specified
16391648
if [ "${BUILD_LLVM}" == "0" ] ; then
16401649
build_targets=(clean)
16411650
fi

‎utils/build_swift/build_swift/driver_arguments.py

+15
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,21 @@ def create_argument_parser():
10761076
default='X86;ARM;AArch64;PowerPC;SystemZ;Mips',
10771077
help='LLVM target generators to build')
10781078

1079+
option('--llvm-ninja-targets', append,
1080+
type=argparse.ShellSplitType(),
1081+
help='Space separated list of ninja targets to build for LLVM '
1082+
'instead of the default ones. Only supported when using '
1083+
'ninja to build. Can be called multiple times '
1084+
'to add multiple such options.')
1085+
1086+
option('--llvm-ninja-targets-for-cross-compile-hosts', append,
1087+
type=argparse.ShellSplitType(),
1088+
help='Space separated list of ninja targets to build for LLVM '
1089+
'in cross compile hosts instead of the ones specified in '
1090+
'llvm-ninja-targets (or the default ones). '
1091+
'Can be called multiple times '
1092+
'to add multiple such options.')
1093+
10791094
# -------------------------------------------------------------------------
10801095
in_group('Build settings for Android')
10811096

‎utils/build_swift/tests/expected_options.py

+4
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@
181181
'lldb_build_with_xcode': '0',
182182
'llvm_assertions': True,
183183
'llvm_build_variant': 'Debug',
184+
'llvm_ninja_targets': [],
185+
'llvm_ninja_targets_for_cross_compile_hosts': [],
184186
'llvm_max_parallel_lto_link_jobs':
185187
defaults.LLVM_MAX_PARALLEL_LTO_LINK_JOBS,
186188
'llvm_targets_to_build': 'X86;ARM;AArch64;PowerPC;SystemZ;Mips',
@@ -681,6 +683,8 @@ class BuildScriptImplOption(_BaseOption):
681683
AppendOption('--extra-cmake-options'),
682684
AppendOption('--extra-swift-args'),
683685
AppendOption('--test-paths'),
686+
AppendOption('--llvm-ninja-targets'),
687+
AppendOption('--llvm-ninja-targets-for-cross-compile-hosts'),
684688

685689
UnsupportedOption('--build-jobs'),
686690
UnsupportedOption('--common-cmake-options'),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# REQUIRES: standalone_build
2+
# REQUIRES: OS=macosx
3+
4+
# RUN: %empty-directory(%t)
5+
# RUN: mkdir -p %t
6+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --llvm-ninja-targets="lib/all clangDependencyScanning" --cross-compile-hosts=iphoneos-arm64e --cmake %cmake 2>&1 | %FileCheck --check-prefix=LLVM-NINJA-TARGETS-APPLY-TO-CROSS-COMPILE-HOSTS-TOO-CHECK %s
7+
8+
# LLVM-NINJA-TARGETS-APPLY-TO-CROSS-COMPILE-HOSTS-TOO-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} lib/all clangDependencyScanning
9+
# LLVM-NINJA-TARGETS-APPLY-TO-CROSS-COMPILE-HOSTS-TOO-CHECK: cmake --build {{.*}}/llvm-iphoneos-arm64e {{.*}} lib/all clangDependencyScanning
10+
11+
12+
# RUN: %empty-directory(%t)
13+
# RUN: mkdir -p %t
14+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --llvm-ninja-targets="lib/all clangDependencyScanning" --llvm-ninja-targets-for-cross-compile-hosts="bin/clang" --cross-compile-hosts=iphoneos-arm64e --cmake %cmake 2>&1 | %FileCheck --check-prefix=LLVM-NINJA-TARGETS-FOR-CROSS-COMPILE-HOSTS-CHECK %s
15+
16+
# LLVM-NINJA-TARGETS-FOR-CROSS-COMPILE-HOSTS-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} lib/all clangDependencyScanning
17+
# LLVM-NINJA-TARGETS-FOR-CROSS-COMPILE-HOSTS-CHECK: cmake --build {{.*}}/llvm-iphoneos-arm64e {{.*}} bin/clang
18+
19+
20+
# RUN: %empty-directory(%t)
21+
# RUN: mkdir -p %t
22+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --llvm-ninja-targets-for-cross-compile-hosts="bin/clang" --cross-compile-hosts=iphoneos-arm64e --cmake %cmake 2>&1 | %FileCheck --check-prefix=ONLY-LLVM-NINJA-TARGETS-FOR-CROSS-COMPILE-HOSTS-CHECK %s
23+
24+
# ONLY-LLVM-NINJA-TARGETS-FOR-CROSS-COMPILE-HOSTS-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} all
25+
# ONLY-LLVM-NINJA-TARGETS-FOR-CROSS-COMPILE-HOSTS-CHECK: cmake --build {{.*}}/llvm-iphoneos-arm64e {{.*}} bin/clang
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# REQUIRES: standalone_build
2+
3+
# RUN: %empty-directory(%t)
4+
# RUN: mkdir -p %t
5+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --build-llvm=0 --cmake %cmake 2>&1 | %FileCheck --check-prefix=BUILD-LLVM-0-CHECK %s
6+
7+
# RUN: %empty-directory(%t)
8+
# RUN: mkdir -p %t
9+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --build-llvm=0 --llvm-ninja-targets="lib/all clangDependencyScanning" --cmake %cmake 2>&1 | %FileCheck --check-prefix=BUILD-LLVM-0-CHECK %s
10+
11+
# BUILD-LLVM-0-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} clean
12+
13+
14+
# RUN: %empty-directory(%t)
15+
# RUN: mkdir -p %t
16+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --skip-build --cmake %cmake 2>&1 | %FileCheck --check-prefix=SKIP-BUILD-CHECK %s
17+
18+
# RUN: %empty-directory(%t)
19+
# RUN: mkdir -p %t
20+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --skip-build --llvm-ninja-targets="lib/all bin/clang" --cmake %cmake 2>&1 | %FileCheck --check-prefix=SKIP-BUILD-CHECK %s
21+
22+
# RUN: %empty-directory(%t)
23+
# RUN: mkdir -p %t
24+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --skip-build-llvm --cmake %cmake 2>&1 | %FileCheck --check-prefix=SKIP-BUILD-CHECK %s
25+
26+
# RUN: %empty-directory(%t)
27+
# RUN: mkdir -p %t
28+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --skip-build-llvm --llvm-ninja-targets="bin/clang clangDependencyScanning" --cmake %cmake 2>&1 | %FileCheck --check-prefix=SKIP-BUILD-CHECK %s
29+
30+
# SKIP-BUILD-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} llvm-tblgen clang-resource-headers intrinsics_gen clang-tablegen-targets
31+
# SKIP-BUILD-CHECK-SAME: FileCheck not llvm-nm
32+
33+
34+
# RUN: %empty-directory(%t)
35+
# RUN: mkdir -p %t
36+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --skip-build-llvm --build-toolchain-only=1 --cmake %cmake 2>&1 | %FileCheck --check-prefix=SKIP-BUILD-LLVM-BUILD-TOOLCHAIN-ONLY-CHECK %s
37+
38+
# SKIP-BUILD-LLVM-BUILD-TOOLCHAIN-ONLY-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} llvm-tblgen clang-resource-headers intrinsics_gen clang-tablegen-targets
39+
# SKIP-BUILD-LLVM-BUILD-TOOLCHAIN-ONLY-CHECK-NOT: FileCheck not llvm-nm
40+
41+
42+
# RUN: %empty-directory(%t)
43+
# RUN: mkdir -p %t
44+
# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --llvm-ninja-targets="lib/all clangDependencyScanning" --cmake %cmake 2>&1 | %FileCheck --check-prefix=LLVM-NINJA-TARGETS-CHECK %s
45+
46+
# LLVM-NINJA-TARGETS-CHECK: cmake --build {{.*}}/llvm-{{[^/]*}} lib/all clangDependencyScanning
47+

0 commit comments

Comments
 (0)