From d42a85233c65401f2bb93974b40aae48004e4830 Mon Sep 17 00:00:00 2001 From: Andrew Bradshaw Date: Wed, 30 Jul 2025 13:54:02 -0700 Subject: [PATCH] SERVER-107805 Add option to not download c++ toolchain for faster python builds (#39355) GitOrigin-RevId: a2d449d33df132abb0d6086bcd7f600f5708bb58 --- bazel/toolchains/cc/mongo_linux/mongo_toolchain.bzl | 9 +++++++++ bazel/wrapper_hook/install_modules.py | 10 +++++++++- bazel/wrapper_hook/post_bazel_hook.py | 2 +- bazel/wrapper_hook/wrapper_hook.py | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/bazel/toolchains/cc/mongo_linux/mongo_toolchain.bzl b/bazel/toolchains/cc/mongo_linux/mongo_toolchain.bzl index 3e4d98fd7a1..c0f76e42b02 100644 --- a/bazel/toolchains/cc/mongo_linux/mongo_toolchain.bzl +++ b/bazel/toolchains/cc/mongo_linux/mongo_toolchain.bzl @@ -2,9 +2,17 @@ load("//bazel:utils.bzl", "generate_noop_toolchain", "get_toolchain_subs", "retr load("//bazel/toolchains/cc/mongo_linux:mongo_toolchain_version.bzl", "TOOLCHAIN_MAP") load("//bazel/toolchains/cc/mongo_linux:mongo_mold.bzl", "MOLD_MAP") +SKIP_TOOLCHAIN_ENVIRONMENT_VARIABLE = "no_c++_toolchain" + def _toolchain_download(ctx): distro, arch, substitutions = get_toolchain_subs(ctx) + skip_toolchain = ctx.os.environ.get(SKIP_TOOLCHAIN_ENVIRONMENT_VARIABLE, None) + if skip_toolchain: + generate_noop_toolchain(ctx, substitutions) + print("Skipping c++ toolchain download and defining noop toolchain due to " + SKIP_TOOLCHAIN_ENVIRONMENT_VARIABLE + " being defined.") + return None + toolchain_key = "{distro}_{arch}".format(distro = distro, arch = arch) if toolchain_key in TOOLCHAIN_MAP[ctx.attr.version]: @@ -50,6 +58,7 @@ def _toolchain_download(ctx): toolchain_download = repository_rule( implementation = _toolchain_download, + environ = [SKIP_TOOLCHAIN_ENVIRONMENT_VARIABLE], attrs = { "os": attr.string( values = ["macos", "linux", "windows"], diff --git a/bazel/wrapper_hook/install_modules.py b/bazel/wrapper_hook/install_modules.py index d2a3d1b02e7..b723dc8d98d 100644 --- a/bazel/wrapper_hook/install_modules.py +++ b/bazel/wrapper_hook/install_modules.py @@ -88,8 +88,12 @@ def search_for_modules(deps, deps_installed, lockfile_changed=False): wrapper_debug(f"deps_not_found: {deps_not_found}") return deps_not_found +def skip_cplusplus_toolchain(args): + if any("no_c++_toolchain" in arg for arg in args): + return True + return False -def install_modules(bazel): +def install_modules(bazel, args): need_to_install = False pwd_hash = hashlib.md5(str(REPO_ROOT).encode()).hexdigest() lockfile_hash_file = pathlib.Path(tempfile.gettempdir()) / f"{pwd_hash}_lockfile_hash" @@ -123,6 +127,10 @@ def install_modules(bazel): bazel, "build", ] + ["@poetry//:library_" + dep.replace("-", "_") for dep in deps_needed] + + if skip_cplusplus_toolchain(args): + cmd += ["--repo_env=no_c++_toolchain=1"] + proc = subprocess.run( cmd + [ diff --git a/bazel/wrapper_hook/post_bazel_hook.py b/bazel/wrapper_hook/post_bazel_hook.py index 102463d432a..2d314d66ecd 100644 --- a/bazel/wrapper_hook/post_bazel_hook.py +++ b/bazel/wrapper_hook/post_bazel_hook.py @@ -13,7 +13,7 @@ BAZEL_CI_NAMESPACE = "ci-prod" def main(): - install_modules(sys.argv[1]) + install_modules(sys.argv[1], sys.argv[1:]) from bazel.wrapper_hook.flag_sync import sync_flags diff --git a/bazel/wrapper_hook/wrapper_hook.py b/bazel/wrapper_hook/wrapper_hook.py index 8e2f5ac9204..fa87c6cd567 100644 --- a/bazel/wrapper_hook/wrapper_hook.py +++ b/bazel/wrapper_hook/wrapper_hook.py @@ -16,7 +16,7 @@ wrapper_debug(f"wrapper hook script is using {sys.executable}") def main(): - install_modules(sys.argv[1]) + install_modules(sys.argv[1], sys.argv[1:]) from bazel.wrapper_hook.autogenerated_targets import autogenerate_targets from bazel.wrapper_hook.engflow_check import engflow_auth