From 15379e5704672240fa28fe20e390c663bbd0b7cd Mon Sep 17 00:00:00 2001 From: Eric Miotto <1094986+edymtt@users.noreply.github.com> Date: Wed, 31 Mar 2021 13:59:49 -0700 Subject: [PATCH 1/2] [build] Clean llbuild before building by default Introduce a new parameter `--skip-llbuild-clean` to prevent this from happening. This mimicks similar logic in place for `swiftpm`, `swift-driver` (#33563) and `xctest` (#19512) Addresses rdar://75057069 --- utils/build-script | 5 +++++ utils/build-script-impl | 10 ++++++++++ utils/build_swift/build_swift/driver_arguments.py | 2 ++ utils/build_swift/tests/expected_options.py | 2 ++ .../BuildSystem/skip_clean_llbuild.test | 15 +++++++++++++++ 5 files changed, 34 insertions(+) create mode 100644 validation-test/BuildSystem/skip_clean_llbuild.test diff --git a/utils/build-script b/utils/build-script index f3630c6777a62..5525617989a70 100755 --- a/utils/build-script +++ b/utils/build-script @@ -796,6 +796,11 @@ class BuildScriptInvocation(object): "--llvm-install-components=%s" % args.llvm_install_components ] + if not args.clean_llbuild: + impl_args += [ + "--skip-clean-llbuild" + ] + # Compute the set of host-specific variables, which we pass through to # the build script via environment variables. host_specific_variables = self.compute_host_specific_variables() diff --git a/utils/build-script-impl b/utils/build-script-impl index be7415c27a2cf..6de6c0a141305 100755 --- a/utils/build-script-impl +++ b/utils/build-script-impl @@ -162,6 +162,7 @@ KNOWN_SETTINGS=( ## llbuild Options llbuild-enable-assertions "1" "enable assertions in llbuild" + skip-clean-llbuild "0" "skip cleaning up llbuild" ## LLDB Options lldb-assertions "1" "build lldb with assertions enabled" @@ -2189,6 +2190,15 @@ for host in "${ALL_HOSTS[@]}"; do -DSQLite3_INCLUDE_DIR:PATH="$(xcrun -sdk macosx -show-sdk-path)/usr/include" ) fi + + if [[ "${SKIP_CLEAN_LLBUILD}" == "0" ]] + then + # Ensure llbuild will rebuild from scratch, since + # arbitrary changes to the compiler can prevent + # a successful incremental build + echo "Cleaning the llbuild build directory" + call rm -rf "$(build_directory ${host} llbuild)" + fi ;; xctest) XCTEST_BUILD_DIR=$(build_directory ${host} xctest) diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 24df6d456edd0..126815c1b21c9 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -1037,6 +1037,8 @@ def create_argument_parser(): help='skip testing Android device targets on the host machine (the ' 'phone itself)') + option('--skip-clean-llbuild', toggle_false('clean_llbuild'), + help='skip cleaning up llbuild') option('--skip-clean-swiftpm', toggle_false('clean_swiftpm'), help='skip cleaning up swiftpm') option('--skip-clean-swift-driver', toggle_false('clean_swift_driver'), diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index c918e15134555..df858ebbb891f 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -212,6 +212,7 @@ defaults.SWIFT_MAX_PARALLEL_LTO_LINK_JOBS, 'swift_user_visible_version': defaults.SWIFT_USER_VISIBLE_VERSION, 'symbols_package': None, + 'clean_llbuild': True, 'clean_swiftpm': True, 'clean_swift_driver': True, 'test': None, @@ -578,6 +579,7 @@ class BuildScriptImplOption(_BaseOption): dest='build_watchos_device'), DisableOption('--skip-build-watchos-simulator', dest='build_watchos_simulator'), + DisableOption('--skip-clean-llbuild', dest='clean_llbuild'), DisableOption('--skip-clean-swiftpm', dest='clean_swiftpm'), DisableOption('--skip-clean-swift-driver', dest='clean_swift_driver'), DisableOption('--skip-test-android', dest='test_android'), diff --git a/validation-test/BuildSystem/skip_clean_llbuild.test b/validation-test/BuildSystem/skip_clean_llbuild.test new file mode 100644 index 0000000000000..8b62754b004ba --- /dev/null +++ b/validation-test/BuildSystem/skip_clean_llbuild.test @@ -0,0 +1,15 @@ +# REQUIRES: standalone_build + +# RUN: %empty-directory(%t) +# RUN: mkdir -p %t +# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --llbuild --cmake %cmake 2>&1 | %FileCheck --check-prefix=CLEAN-LLBUILD-CHECK %s + +# RUN: %empty-directory(%t) +# RUN: mkdir -p %t +# RUN: SWIFT_BUILD_ROOT=%t %swift_src_root/utils/build-script --dry-run --llbuild --skip-clean-llbuild --cmake %cmake 2>&1 | %FileCheck --check-prefix=SKIP-CLEAN-LLBUILD-CHECK %s + +# CLEAN-LLBUILD-CHECK: Cleaning the llbuild build directory +# CLEAN-LLBUILD-CHECK-NEXT: rm -rf + +# SKIP-CLEAN-LLBUILD-CHECK-NOT: Cleaning the llbuild build directory +# SKIP-CLEAN-LLBUILD-CHECK-NOT: rm -rf {{.*llbuild.*}} From 4be919a338bc886cde7e7a42b5f4592d25a50fce Mon Sep 17 00:00:00 2001 From: Eric Miotto <1094986+edymtt@users.noreply.github.com> Date: Thu, 1 Apr 2021 15:52:51 -0700 Subject: [PATCH 2/2] Refine check for skip-clean-llbuild test --- validation-test/BuildSystem/skip_clean_llbuild.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validation-test/BuildSystem/skip_clean_llbuild.test b/validation-test/BuildSystem/skip_clean_llbuild.test index 8b62754b004ba..20af0a47c0357 100644 --- a/validation-test/BuildSystem/skip_clean_llbuild.test +++ b/validation-test/BuildSystem/skip_clean_llbuild.test @@ -12,4 +12,4 @@ # CLEAN-LLBUILD-CHECK-NEXT: rm -rf # SKIP-CLEAN-LLBUILD-CHECK-NOT: Cleaning the llbuild build directory -# SKIP-CLEAN-LLBUILD-CHECK-NOT: rm -rf {{.*llbuild.*}} +# SKIP-CLEAN-LLBUILD-CHECK-NOT: rm -rf {{.*/llbuild-[^/]*}}