diff --git a/tests/scripts/bazel.sh b/tests/scripts/bazel.sh index a7db03c7f..ed498b92a 100644 --- a/tests/scripts/bazel.sh +++ b/tests/scripts/bazel.sh @@ -50,6 +50,7 @@ common_test_args=( "--keep_going" "--test_output=errors" "--features=layering_check" + "--process_headers_in_dependencies" ) # Do not run autoconf to configure local CC toolchains. diff --git a/toolchain/cc_toolchain_config.bzl b/toolchain/cc_toolchain_config.bzl index 487af0009..2107286b1 100644 --- a/toolchain/cc_toolchain_config.bzl +++ b/toolchain/cc_toolchain_config.bzl @@ -348,6 +348,7 @@ def cc_toolchain_config( # https://cs.opensource.google/bazel/bazel/+/master:src/main/starlark/builtins_bzl/common/cc/cc_toolchain_provider_helper.bzl;l=75;drc=f0150efd1cca473640269caaf92b5a23c288089d # https://cs.opensource.google/bazel/bazel/+/master:src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java;l=1257;drc=6743d76f9ecde726d592e88d8914b9db007b1c43 # https://cs.opensource.google/bazel/bazel/+/refs/tags/7.0.0:tools/cpp/unix_cc_toolchain_config.bzl;l=192,201;drc=044a14cca2747aeff258fc71eaeb153c08cb34d5 + # https://github.com/bazelbuild/rules_cc/blob/fe41fc4ea219c9d3680ee536bba6681f3baf838e/cc/private/toolchain/unix_cc_toolchain_config.bzl#L1887 # NOTE: Ensure these are listed in toolchain_tools in toolchain/internal/common.bzl. tool_paths = { "ar": tools_path_prefix + ("llvm-ar" if not use_libtool else "libtool"), @@ -362,6 +363,7 @@ def cc_toolchain_config( "objcopy": tools_path_prefix + "llvm-objcopy", "objdump": tools_path_prefix + "llvm-objdump", "strip": tools_path_prefix + "llvm-strip", + "parse_headers": wrapper_bin_prefix + "cc_wrapper.sh", } # Start-end group linker support: diff --git a/toolchain/cc_wrapper.sh.tpl b/toolchain/cc_wrapper.sh.tpl index 16c24eff4..8a23f1218 100644 --- a/toolchain/cc_wrapper.sh.tpl +++ b/toolchain/cc_wrapper.sh.tpl @@ -82,6 +82,18 @@ if [[ ! -f ${toolchain_path_prefix}bin/clang ]]; then exit 5 fi +OUTPUT= + +function parse_option() { + local -r opt="$1" + if [[ "${OUTPUT}" = "1" ]]; then + OUTPUT=${opt} + elif [[ "${opt}" = "-o" ]]; then + # output is coming + OUTPUT=1 + fi +} + function sanitize_option() { local -r opt=$1 if [[ ${opt} == */cc_wrapper.sh ]]; then @@ -106,6 +118,7 @@ for ((i = 0; i <= $#; i++)); do set -e sanitize_option "${opt}" )" + parse_option "${opt}" echo "${opt}" >>"${tmpfile}" done <"${!i:1}" cmd+=("@${tmpfile}") @@ -114,9 +127,15 @@ for ((i = 0; i <= $#; i++)); do set -e sanitize_option "${!i}" )" + parse_option "${opt}" cmd+=("${opt}") fi done # Call the C++ compiler. "${cmd[@]}" + +# Generate an empty file if header processing succeeded. +if [[ "${OUTPUT}" == *.h.processed ]]; then + echo -n >"${OUTPUT}" +fi diff --git a/toolchain/internal/configure.bzl b/toolchain/internal/configure.bzl index 4ce00c51d..3467f9291 100644 --- a/toolchain/internal/configure.bzl +++ b/toolchain/internal/configure.bzl @@ -531,6 +531,7 @@ cc_toolchain( strip_files = "strip-files-{suffix}", toolchain_config = "local-{suffix}", module_map = "module-{suffix}", + supports_header_parsing = True, ) """ diff --git a/toolchain/osx_cc_wrapper.sh.tpl b/toolchain/osx_cc_wrapper.sh.tpl index 6363eb43a..1ab90a05c 100755 --- a/toolchain/osx_cc_wrapper.sh.tpl +++ b/toolchain/osx_cc_wrapper.sh.tpl @@ -183,6 +183,11 @@ fi # Call the C++ compiler. "${cmd[@]}" +# Generate an empty file if header processing succeeded. +if [[ "${OUTPUT}" == *.h.processed ]]; then + echo -n >"${OUTPUT}" +fi + function get_library_path() { for libdir in ${LIB_DIRS}; do if [[ -f "${libdir}/lib$1".so ]]; then