From 0e617f45eab2c5b0af0af9f4ed08b6606c95ca8c Mon Sep 17 00:00:00 2001 From: Alex Jones Date: Thu, 9 Jan 2025 15:02:24 +0000 Subject: [PATCH] [bazel] Patch rules_foreign_cc to clean build logs Move rules_foreign_cc from the root MODULE.bazel to its own `third_party/foreign_cc` directory so that we can patch it to fix an issue that has not yet been supported upstream yet, in the same way as we do for e.g. `rules_rust`. When `rules_foreign_cc` builds using tools such as e.g. Configure+Make, output files Configure.log and BootstrapGNUMake.log are generated and emitted which contain references to the absolute path. When building inside Bazel's sandbox, this produces a non-determinstic output which changes between each run, as a result, rebuilding OpenOCD will then change the inputs of any Bazel actions that use OpenOCD, resulting in a reduced number of cache hits and increasing build times. By making this determinstic, we improve reproducibility and potentially reduce build times. To fix this, this PR introduces a simple patch to completely remove all the content of this logging output, as it is not needed by any later steps as part of the build. Signed-off-by: Alex Jones --- MODULE.bazel | 3 ++- third_party/foreign_cc/BUILD | 5 +++++ third_party/foreign_cc/foreign_cc.MODULE.bazel | 18 ++++++++++++++++++ third_party/foreign_cc/patches/BUILD | 5 +++++ .../rules_foreign_cc.remove_log_output.patch | 13 +++++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 third_party/foreign_cc/BUILD create mode 100644 third_party/foreign_cc/foreign_cc.MODULE.bazel create mode 100644 third_party/foreign_cc/patches/BUILD create mode 100644 third_party/foreign_cc/patches/rules_foreign_cc.remove_log_output.patch diff --git a/MODULE.bazel b/MODULE.bazel index 3b1b342b45967..2c9ef1d9e28af 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,7 +10,6 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "googletest", version = "1.14.0.bcr.1") bazel_dep(name = "platforms", version = "0.0.10") bazel_dep(name = "rules_cc", version = "0.0.14") -bazel_dep(name = "rules_foreign_cc", version = "0.9.0") bazel_dep(name = "rules_fuzzing", version = "0.5.2") bazel_dep(name = "rules_pkg", version = "1.0.1") @@ -35,6 +34,8 @@ include("//third_party/rust:rust.MODULE.bazel") include("//third_party/python:python.MODULE.bazel") +include("//third_party/foreign_cc:foreign_cc.MODULE.bazel") + # Repository rules: bitstreams_repo = use_repo_rule("//rules:bitstreams.bzl", "bitstreams_repo") diff --git a/third_party/foreign_cc/BUILD b/third_party/foreign_cc/BUILD new file mode 100644 index 0000000000000..c85882e64fe2c --- /dev/null +++ b/third_party/foreign_cc/BUILD @@ -0,0 +1,5 @@ +# Copyright lowRISC contributors (OpenTitan project). +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +package(default_visibility = ["//visibility:public"]) diff --git a/third_party/foreign_cc/foreign_cc.MODULE.bazel b/third_party/foreign_cc/foreign_cc.MODULE.bazel new file mode 100644 index 0000000000000..671f6acf3d94e --- /dev/null +++ b/third_party/foreign_cc/foreign_cc.MODULE.bazel @@ -0,0 +1,18 @@ +# Copyright lowRISC contributors (OpenTitan project). +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# Dependencies: +bazel_dep(name = "rules_foreign_cc", version = "0.9.0") + +# Overrides and patches: +single_version_override( + module_name = "rules_foreign_cc", + patches = [ + # Patch to remove all build log file output when using rules_foreign_cc + # toolchains to ensure deterministic Bazel builds. See upstream issue: + # https://github.com/bazel-contrib/rules_foreign_cc/issues/1313 + "//third_party/foreign_cc/patches:rules_foreign_cc.remove_log_output.patch", + ], + version = "0.9.0", +) diff --git a/third_party/foreign_cc/patches/BUILD b/third_party/foreign_cc/patches/BUILD new file mode 100644 index 0000000000000..c85882e64fe2c --- /dev/null +++ b/third_party/foreign_cc/patches/BUILD @@ -0,0 +1,5 @@ +# Copyright lowRISC contributors (OpenTitan project). +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +package(default_visibility = ["//visibility:public"]) diff --git a/third_party/foreign_cc/patches/rules_foreign_cc.remove_log_output.patch b/third_party/foreign_cc/patches/rules_foreign_cc.remove_log_output.patch new file mode 100644 index 0000000000000..f7ef020d62ae6 --- /dev/null +++ b/third_party/foreign_cc/patches/rules_foreign_cc.remove_log_output.patch @@ -0,0 +1,13 @@ +diff --git foreign_cc/private/framework.bzl foreign_cc/private/framework.bzl +index c84c217..f43da2c 100644 +--- foreign_cc/private/framework.bzl ++++ foreign_cc/private/framework.bzl +@@ -561,7 +561,7 @@ def wrap_outputs(ctx, lib_name, configure_name, script_text, build_script_file = + cleanup_on_success_function = create_function( + ctx, + "cleanup_on_success", +- "rm -rf $BUILD_TMPDIR $EXT_BUILD_DEPS", ++ "rm -rf $BUILD_TMPDIR $EXT_BUILD_DEPS && echo > $BUILD_LOG", + ) + cleanup_on_failure_function = create_function( + ctx,