From 3a86ae106aa9e9dbdab8c9bfcd7c2f50dcd0da05 Mon Sep 17 00:00:00 2001 From: Vaibhav Shukla Date: Fri, 19 Dec 2025 10:22:59 +0000 Subject: [PATCH 1/2] bindgen: Make libclang optional in the toolchain --- extensions/bindgen/private/bindgen.bzl | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/extensions/bindgen/private/bindgen.bzl b/extensions/bindgen/private/bindgen.bzl index 426cdd48d1..dbdf614788 100644 --- a/extensions/bindgen/private/bindgen.bzl +++ b/extensions/bindgen/private/bindgen.bzl @@ -216,8 +216,8 @@ def _rust_bindgen_impl(ctx): toolchain = ctx.toolchains[Label("//:toolchain_type")] bindgen_bin = toolchain.bindgen clang_bin = toolchain.clang - libclang = toolchain.libclang - libstdcxx = toolchain.libstdcxx + libclang = getattr(toolchain, "libclang", None) + libstdcxx = getattr(toolchain, "libstdcxx", None) output = ctx.outputs.out @@ -225,13 +225,15 @@ def _rust_bindgen_impl(ctx): tools = depset(([clang_bin] if clang_bin else []), transitive = [cc_toolchain.all_files]) - # libclang should only have 1 output file - libclang_dir = _get_libs_for_static_executable(libclang).to_list()[0].dirname - env = { - "LIBCLANG_PATH": libclang_dir, "RUST_BACKTRACE": "1", } + + if libclang: + # libclang should only have 1 output file + libclang_dir = _get_libs_for_static_executable(libclang).to_list()[0].dirname + env["LIBCLANG_PATH"] = libclang_dir + if clang_bin: env["CLANG_PATH"] = clang_bin.path @@ -378,8 +380,9 @@ def _rust_bindgen_impl(ctx): [header], transitive = [ cc_lib[CcInfo].compilation_context.headers, - _get_libs_for_static_executable(libclang), ] + ([ + _get_libs_for_static_executable(libclang), + ] if libclang else []) + ([ _get_libs_for_static_executable(libstdcxx), ] if libstdcxx else []), ), @@ -529,6 +532,7 @@ For additional information, see the [Bazel toolchains documentation](https://doc cfg = "exec", providers = [CcInfo], allow_files = True, + mandatory = False, ), "libstdcxx": attr.label( doc = "A cc_library that satisfies libclang's libstdc++ dependency. This is used to make the execution of clang hermetic. If None, system libraries will be used instead.", From 23b3b57abad3e27313faeb565c528ec2239b71a8 Mon Sep 17 00:00:00 2001 From: Vaibhav Shukla Date: Fri, 2 Jan 2026 15:04:16 +0000 Subject: [PATCH 2/2] bindgen: Update libclang attribute documentation Clarify that the libclang attribute in rust_bindgen_toolchain is only optional when the bindgen binary is statically linked. This ensures users are aware that omitting it for dynamically linked binaries may lead to non-hermetic builds by falling back to system libraries. --- extensions/bindgen/private/bindgen.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/bindgen/private/bindgen.bzl b/extensions/bindgen/private/bindgen.bzl index dbdf614788..22eb992a09 100644 --- a/extensions/bindgen/private/bindgen.bzl +++ b/extensions/bindgen/private/bindgen.bzl @@ -528,7 +528,7 @@ For additional information, see the [Bazel toolchains documentation](https://doc default = True, ), "libclang": attr.label( - doc = "A cc_library that provides bindgen's runtime dependency on libclang.", + doc = "A cc_library providing bindgen's runtime dependency on libclang. This attribute is required for hermeticity when bindgen is dynamically linked. If None, bindgen must be statically linked; else, system libraries will be used instead.", cfg = "exec", providers = [CcInfo], allow_files = True,