From 0e26117868b7dcb926974d4613dca781678792cf Mon Sep 17 00:00:00 2001 From: Corentin Kerisit Date: Thu, 8 Oct 2026 13:22:45 +0200 Subject: [PATCH 1/2] Normalize Clang forwarded system header paths --- cargo/private/cargo_build_script.bzl | 6 +++--- .../cc_args_and_env/BUILD.bazel | 3 +++ .../cc_args_and_env/cc_args_and_env_test.bzl | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cargo/private/cargo_build_script.bzl b/cargo/private/cargo_build_script.bzl index 730ec65f43..cb9f0c518c 100644 --- a/cargo/private/cargo_build_script.bzl +++ b/cargo/private/cargo_build_script.bzl @@ -139,11 +139,11 @@ def _prefix_pwd_to_flag(args, flag_variations): res = [] prefix_next_arg = False for arg in args: - # When expecting a path argument and we see -Xclang, skip over it and + # When expecting a path argument, skip Clang forwarding tokens and # map the next argument instead. # ex: -Xclang -internal-isystem -Xclang path # to: -Xclang -internal-isystem -Xclang ${pwd}/path - if prefix_next_arg and arg == "-Xclang": + if prefix_next_arg and arg in ("-Xclang", "-Xpreprocessor"): res.append(arg) continue @@ -217,7 +217,7 @@ def _pwd_flags_fsanitize_ignorelist(args): def _pwd_flags_isystem(args): """Prefix execroot-relative paths in -isystem-like arguments with ${pwd}.""" - return _prefix_pwd_to_flag(args, ["-isystem", "-isystem-after", "-internal-isystem", "-cxx-isystem", "-stdlib++-isystem", "/imsvc"]) + return _prefix_pwd_to_flag(args, ["-isystem", "-isystem-after", "-internal-isystem", "-internal-externc-isystem", "-cxx-isystem", "-stdlib++-isystem", "/imsvc"]) def _pwd_flags_L(args): """Prefix execroot-relative paths in -L arguments with ${pwd}.""" diff --git a/cargo/tests/cargo_build_script/cc_args_and_env/BUILD.bazel b/cargo/tests/cargo_build_script/cc_args_and_env/BUILD.bazel index a2e39c9855..8966f22194 100644 --- a/cargo/tests/cargo_build_script/cc_args_and_env/BUILD.bazel +++ b/cargo/tests/cargo_build_script/cc_args_and_env/BUILD.bazel @@ -8,6 +8,7 @@ load( "direct_libs_absolute_test", "direct_libs_as_flag_operand_test", "direct_libs_relative_test", + "forwarded_header_paths_test", "fsanitize_ignorelist_absolute_test", "fsanitize_ignorelist_relative_test", "imacros_absolute_test", @@ -91,3 +92,5 @@ direct_libs_relative_test(name = "direct_libs_relative_test") direct_libs_absolute_test(name = "direct_libs_absolute_test") direct_libs_as_flag_operand_test(name = "direct_libs_as_flag_operand_test") + +forwarded_header_paths_test(name = "forwarded_header_paths_test") diff --git a/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl b/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl index 2f492ea49d..18366f5978 100644 --- a/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl +++ b/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl @@ -771,3 +771,21 @@ def direct_libs_as_flag_operand_test(name): target_under_test = "%s/cargo_build_script" % name, expected_cflags = ["-imacros", "${pwd}/test/relative/libfoo.a", "-B", "${pwd}/test/relative/obj.o"], ) + +def forwarded_header_paths_test(name): + for forwarding in ["-Xclang", "-Xpreprocessor"]: + for category in ["-internal-isystem", "-internal-externc-isystem"]: + for kind, path, expected in [ + ("relative", "test/relative/include", "${pwd}/test/relative/include"), + ("absolute", "/test/absolute/include", "/test/absolute/include"), + ]: + case = name + forwarding + category + "_" + kind + cargo_build_script_with_extra_cc_compile_flags( + name = case + "/cargo_build_script", + extra_cc_compile_flags = [forwarding, category, forwarding, path, "-DKEEP=1"], + ) + cc_args_and_env_analysis_test( + name = case, + target_under_test = case + "/cargo_build_script", + expected_cflags = [forwarding, category, forwarding, expected, "-DKEEP=1"], + ) From b192590e28027285b78e7a4f559cc773cd453835 Mon Sep 17 00:00:00 2001 From: Corentin Kerisit Date: Thu, 8 Oct 2026 13:25:52 +0200 Subject: [PATCH 2/2] Document forwarded header test macro --- .../cc_args_and_env/cc_args_and_env_test.bzl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl b/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl index 18366f5978..b80ccaf37a 100644 --- a/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl +++ b/cargo/tests/cargo_build_script/cc_args_and_env/cc_args_and_env_test.bzl @@ -773,6 +773,11 @@ def direct_libs_as_flag_operand_test(name): ) def forwarded_header_paths_test(name): + """Tests path rewriting through Clang forwarding options. + + Args: + name: Prefix for the generated analysis tests. + """ for forwarding in ["-Xclang", "-Xpreprocessor"]: for category in ["-internal-isystem", "-internal-externc-isystem"]: for kind, path, expected in [