From 1550536754dba8d50fbecc7e472c8289922e1d41 Mon Sep 17 00:00:00 2001 From: Farid Zakaria Date: Thu, 15 Feb 2024 19:34:58 +0000 Subject: [PATCH 1/2] Add support for LLVM toolchain We should strive to make our Bazel builds as hermetic as possible. Bazel has support for toolchains (https://bazel.build/extending/toolchains) which I admit are a bit more advanced than I am familiar with. Fortunately, there seems to be a community contribution, for a toolchain that is provided for LLVM. I picked a version that is quite old (11.1) since some of our developers at Google are on 20.04 LTS. --- .bazelrc | 8 +- MODULE.bazel | 10 ++ MODULE.bazel.lock | 272 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 215 insertions(+), 75 deletions(-) diff --git a/.bazelrc b/.bazelrc index e83d853e0e..ba04a4ffdd 100644 --- a/.bazelrc +++ b/.bazelrc @@ -18,6 +18,8 @@ build --host_cxxopt=-std=c++17 # this only works for Clang toolchain AFAIK # https://github.com/bazelbuild/bazel/pull/11440 build --features=layering_check -# Set the default compiler to the `clang` binary on the `PATH`. -# TODO(fzakaria): Make this a toolchain or hermetic somehow -build --repo_env=CC=clang + +# Make sure we don't pickup the default CPP toolchains +build --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +# Not needed after https://github.com/bazelbuild/bazel/issues/7260 is closed +build --incompatible_enable_cc_toolchain_resolution \ No newline at end of file diff --git a/MODULE.bazel b/MODULE.bazel index 57cf63eb32..412f40a81a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -4,6 +4,7 @@ # # For more details, please check https://github.com/bazelbuild/bazel/issues/18958 ############################################################################### +bazel_dep(name = "toolchains_llvm", version = "0.10.3") bazel_dep(name = "bazel_skylib", version = "1.3.0") bazel_dep(name = "rules_python", version = "0.30.0") @@ -17,3 +18,12 @@ python.toolchain( is_default = True, python_version = "3.10", ) + +# Steps from https://github.com/bazel-contrib/toolchains_llvm/releases/tag/0.10.3 +# Configure and register the toolchain. +llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm") +llvm.toolchain( + llvm_version = "11.1.0", +) +use_repo(llvm, "llvm_toolchain") +register_toolchains("@llvm_toolchain//:all") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 3e59c83764..e81b671cb5 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1,6 +1,6 @@ { "lockFileVersion": 3, - "moduleFileHash": "836f0a7d2276ed93403f104a10008b94ec7e7f81b8d6921cea287f0a6d364efa", + "moduleFileHash": "90489fa64218ffe5f432637a01165ab4864739cdc84374678b6133583449ee88", "flags": { "cmdRegistries": [ "https://bcr.bazel.build/" @@ -22,7 +22,9 @@ "key": "", "repoName": "", "executionPlatformsToRegister": [], - "toolchainsToRegister": [], + "toolchainsToRegister": [ + "@llvm_toolchain//:all" + ], "extensionUsages": [ { "extensionBzlFile": "@rules_python//python/extensions:python.bzl", @@ -39,32 +41,93 @@ { "tagName": "toolchain", "attributeValues": { - "python_version": "3.10", - "is_default": true + "is_default": true, + "python_version": "3.10" }, "devDependency": false, "location": { "file": "@@//:MODULE.bazel", - "line": 12, + "line": 17, "column": 17 } } ], "hasDevUseExtension": false, "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@toolchains_llvm//toolchain/extensions:llvm.bzl", + "extensionName": "llvm", + "usingModule": "", + "location": { + "file": "@@//:MODULE.bazel", + "line": 24, + "column": 21 + }, + "imports": { + "llvm_toolchain": "llvm_toolchain" + }, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "llvm_version": "11.1.0" + }, + "devDependency": false, + "location": { + "file": "@@//:MODULE.bazel", + "line": 25, + "column": 15 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true } ], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "toolchains_llvm": "toolchains_llvm@0.10.3", + "bazel_skylib": "bazel_skylib@1.4.2", "rules_python": "rules_python@0.30.0", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" } }, - "bazel_skylib@1.3.0": { + "toolchains_llvm@0.10.3": { + "name": "toolchains_llvm", + "version": "0.10.3", + "key": "toolchains_llvm@0.10.3", + "repoName": "toolchains_llvm", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.4.2", + "rules_cc": "rules_cc@0.0.9", + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "toolchains_llvm~0.10.3", + "urls": [ + "https://github.com/grailbio/bazel-toolchain/releases/download/0.10.3/toolchains_llvm-0.10.3.tar.gz" + ], + "integrity": "sha256-t80wHvew7OKNINPneGl6XjuBgoOTFQvtBIOMDFKWOgE=", + "strip_prefix": "toolchains_llvm-0.10.3", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "bazel_skylib@1.4.2": { "name": "bazel_skylib", - "version": "1.3.0", - "key": "bazel_skylib@1.3.0", + "version": "1.4.2", + "key": "bazel_skylib@1.4.2", "repoName": "bazel_skylib", "executionPlatformsToRegister": [], "toolchainsToRegister": [ @@ -81,11 +144,11 @@ "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "bazel_skylib~1.3.0", + "name": "bazel_skylib~1.4.2", "urls": [ - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz" + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz" ], - "integrity": "sha256-dNVE2W9KW7Yw1GXKi7z+Ix41lOWq5X4e2/F6brPKJQY=", + "integrity": "sha256-Zv/ZMVZlv6r8lrUiePV8fi3Qn17eJ56m05sr5HHn46o=", "strip_prefix": "", "remote_patches": {}, "remote_patch_strip": 0 @@ -179,7 +242,7 @@ ], "deps": { "bazel_features": "bazel_features@1.1.1", - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "platforms": "platforms@0.0.7", "rules_proto": "rules_proto@5.3.0-21.7", "com_google_protobuf": "protobuf@21.7", @@ -350,6 +413,56 @@ "bazel_tools": "bazel_tools@_" } }, + "rules_cc@0.0.9": { + "name": "rules_cc", + "version": "0.0.9", + "key": "rules_cc@0.0.9", + "repoName": "rules_cc", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@local_config_cc_toolchains//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", + "extensionName": "cc_configure_extension", + "usingModule": "rules_cc@0.0.9", + "location": { + "file": "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel", + "line": 9, + "column": 29 + }, + "imports": { + "local_config_cc_toolchains": "local_config_cc_toolchains" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_cc~0.0.9", + "urls": [ + "https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz" + ], + "integrity": "sha256-IDeHW5pEVtzkp50RKorohbvEqtlo5lh9ym5k86CQDN8=", + "strip_prefix": "rules_cc-0.0.9", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_cc/0.0.9/patches/module_dot_bazel_version.patch": "sha256-mM+qzOI0SgAdaJBlWOSMwMPKpaA9b7R37Hj/tp5bb4g=" + }, + "remote_patch_strip": 0 + } + } + }, "platforms@0.0.7": { "name": "platforms", "version": "0.0.7", @@ -435,7 +548,7 @@ "toolchainsToRegister": [], "extensionUsages": [], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "com_google_protobuf": "protobuf@21.7", "rules_cc": "rules_cc@0.0.9", "bazel_tools": "bazel_tools@_", @@ -507,7 +620,7 @@ } ], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "rules_python": "rules_python@0.30.0", "rules_cc": "rules_cc@0.0.9", "rules_proto": "rules_proto@5.3.0-21.7", @@ -541,56 +654,6 @@ } } }, - "rules_cc@0.0.9": { - "name": "rules_cc", - "version": "0.0.9", - "key": "rules_cc@0.0.9", - "repoName": "rules_cc", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@local_config_cc_toolchains//:all" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", - "extensionName": "cc_configure_extension", - "usingModule": "rules_cc@0.0.9", - "location": { - "file": "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel", - "line": 9, - "column": 29 - }, - "imports": { - "local_config_cc_toolchains": "local_config_cc_toolchains" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "platforms": "platforms@0.0.7", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_cc~0.0.9", - "urls": [ - "https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz" - ], - "integrity": "sha256-IDeHW5pEVtzkp50RKorohbvEqtlo5lh9ym5k86CQDN8=", - "strip_prefix": "rules_cc-0.0.9", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_cc/0.0.9/patches/module_dot_bazel_version.patch": "sha256-mM+qzOI0SgAdaJBlWOSMwMPKpaA9b7R37Hj/tp5bb4g=" - }, - "remote_patch_strip": 0 - } - } - }, "rules_java@7.1.0": { "name": "rules_java", "version": "7.1.0", @@ -671,7 +734,7 @@ "deps": { "platforms": "platforms@0.0.7", "rules_cc": "rules_cc@0.0.9", - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "rules_proto": "rules_proto@5.3.0-21.7", "rules_license": "rules_license@0.0.7", "bazel_tools": "bazel_tools@_", @@ -781,7 +844,7 @@ } ], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "platforms": "platforms@0.0.7", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -811,7 +874,7 @@ "extensionUsages": [], "deps": { "rules_python": "rules_python@0.30.0", - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "rules_license": "rules_license@0.0.7", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -873,7 +936,7 @@ "toolchainsToRegister": [], "extensionUsages": [], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "rules_proto": "rules_proto@5.3.0-21.7", "com_google_protobuf": "protobuf@21.7", "com_google_absl": "abseil-cpp@20211102.0", @@ -963,7 +1026,7 @@ } ], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "io_bazel_stardoc": "stardoc@0.5.1", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -1024,7 +1087,7 @@ "toolchainsToRegister": [], "extensionUsages": [], "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", + "bazel_skylib": "bazel_skylib@1.4.2", "rules_java": "rules_java@7.1.0", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -2080,7 +2143,7 @@ [ "rules_python~0.30.0", "bazel_skylib", - "bazel_skylib~1.3.0" + "bazel_skylib~1.4.2" ], [ "rules_python~0.30.0", @@ -2277,6 +2340,71 @@ ] ] } + }, + "@@toolchains_llvm~0.10.3//toolchain/extensions:llvm.bzl%llvm": { + "general": { + "bzlTransitiveDigest": "BazUosLKBs5ydZiCi9OwI9dYPBph5aEeG/bcpD+yBkM=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "llvm_toolchain": { + "bzlFile": "@@toolchains_llvm~0.10.3//toolchain:rules.bzl", + "ruleClassName": "toolchain", + "attributes": { + "name": "toolchains_llvm~0.10.3~llvm~llvm_toolchain", + "absolute_paths": false, + "compile_flags": {}, + "coverage_compile_flags": {}, + "coverage_link_flags": {}, + "cxx_builtin_include_directories": {}, + "cxx_flags": {}, + "cxx_standard": {}, + "dbg_compile_flags": {}, + "link_flags": {}, + "link_libs": {}, + "llvm_versions": { + "": "11.1.0" + }, + "opt_compile_flags": {}, + "opt_link_flags": {}, + "stdlib": {}, + "sysroot": {}, + "target_settings": {}, + "toolchain_roots": {}, + "unfiltered_compile_flags": {} + } + }, + "llvm_toolchain_llvm": { + "bzlFile": "@@toolchains_llvm~0.10.3//toolchain:rules.bzl", + "ruleClassName": "llvm", + "attributes": { + "name": "toolchains_llvm~0.10.3~llvm~llvm_toolchain_llvm", + "alternative_llvm_sources": [], + "auth_patterns": {}, + "distribution": "auto", + "llvm_mirror": "", + "llvm_version": "11.1.0", + "llvm_versions": {}, + "netrc": "", + "sha256": {}, + "strip_prefix": {}, + "urls": {} + } + } + }, + "recordedRepoMappingEntries": [ + [ + "toolchains_llvm~0.10.3", + "bazel_tools", + "bazel_tools" + ], + [ + "toolchains_llvm~0.10.3", + "toolchains_llvm", + "toolchains_llvm~0.10.3" + ] + ] + } } } } From eb84e3ba79e253c26a15f8721b34b2d24c1b724a Mon Sep 17 00:00:00 2001 From: Farid Zakaria Date: Thu, 15 Feb 2024 19:41:42 +0000 Subject: [PATCH 2/2] Buildifier fix --- MODULE.bazel | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 412f40a81a..370b015a9d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -23,7 +23,8 @@ python.toolchain( # Configure and register the toolchain. llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm") llvm.toolchain( - llvm_version = "11.1.0", + llvm_version = "11.1.0", ) use_repo(llvm, "llvm_toolchain") + register_toolchains("@llvm_toolchain//:all")