From 0c0172b1dad2ad6b6852e8efdce4553b85beaa43 Mon Sep 17 00:00:00 2001 From: Martin Kosiba Date: Thu, 20 Mar 2025 15:23:00 +0000 Subject: [PATCH 1/2] Make it possible to use llvm-cov with `bazel coverage` --- crosstool/osx_cc_configure.bzl | 28 +++++++++++++++++++++++----- crosstool/setup.bzl | 2 ++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/crosstool/osx_cc_configure.bzl b/crosstool/osx_cc_configure.bzl index e1d01d68..45e46b6e 100644 --- a/crosstool/osx_cc_configure.bzl +++ b/crosstool/osx_cc_configure.bzl @@ -88,6 +88,26 @@ def _generate_system_modulemap(repository_ctx, script, output): def _copy_file(repository_ctx, src, dest): repository_ctx.file(dest, content = repository_ctx.read(src)) +def _get_tool_path(repository_ctx, tool_name, path_env_var): + tool_path = repository_ctx.os.environ.get(path_env_var) + if tool_path != None: + if not tool_path.startswith("/"): + tool_path = repository_ctx.which(tool_path) + return tool_path + else: + env = repository_ctx.os.environ + result = repository_ctx.execute([ + "env", + "-i", + "DEVELOPER_DIR={}".format(env.get("DEVELOPER_DIR", default = "")), + "xcrun", + "--find", + tool_name, + ]) + if result.return_code != 0: + return None + return result.stdout.strip() + def configure_osx_toolchain(repository_ctx): """Configure C++ toolchain on macOS. @@ -153,11 +173,9 @@ def configure_osx_toolchain(repository_ctx): ) tool_paths = {} - gcov_path = repository_ctx.os.environ.get("GCOV") - if gcov_path != None: - if not gcov_path.startswith("/"): - gcov_path = repository_ctx.which(gcov_path) - tool_paths["gcov"] = gcov_path + tool_paths["gcov"] = _get_tool_path(repository_ctx, "llvm-profdata", "GCOV") + tool_paths["llvm-cov"] = _get_tool_path(repository_ctx, "llvm-cov", "BAZEL_LLVM_COV") + tool_paths["llvm-profdata"] = _get_tool_path(repository_ctx, "llvm-profdata", "BAZEL_LLVM_PROFDATA") features = [] if _succeeds(repository_ctx, "ld", "-no_warn_duplicate_libraries", "-v"): diff --git a/crosstool/setup.bzl b/crosstool/setup.bzl index 5e06d70f..3bd394fa 100644 --- a/crosstool/setup.bzl +++ b/crosstool/setup.bzl @@ -56,6 +56,8 @@ _apple_cc_autoconf = repository_rule( _OLD_DISABLE_ENV_VAR, "APPLE_SUPPORT_LAYERING_CHECK_BETA", "BAZEL_ALLOW_NON_APPLICATIONS_XCODE", # Signals to configure_osx_toolchain that some Xcodes may live outside of /Applications and we need to probe further when detecting/configuring them. + "BAZEL_LLVM_COV", # Makes it possible to override the llvm-cov path. + "BAZEL_LLVM_PROFDATA", # Makes it possible to override the llvm-profdata path. "DEVELOPER_DIR", # Used for making sure we use the right Xcode for compiling toolchain binaries "GCOV", # TODO: Remove this "USE_CLANG_CL", # Kept as a hack for those who rely on this invaliding the toolchain From d0ee06dfa5f85ebc2ccbc389aebb0746e4053b14 Mon Sep 17 00:00:00 2001 From: Martin Kosiba Date: Mon, 31 Mar 2025 16:51:25 +0100 Subject: [PATCH 2/2] move code into wrapper scripts --- crosstool/BUILD.tpl | 10 +++++++ crosstool/cov_tool_wrapper.sh.tpl | 3 +++ crosstool/osx_cc_configure.bzl | 44 +++++++++++++++---------------- 3 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 crosstool/cov_tool_wrapper.sh.tpl diff --git a/crosstool/BUILD.tpl b/crosstool/BUILD.tpl index 5413fea3..cb0c672a 100644 --- a/crosstool/BUILD.tpl +++ b/crosstool/BUILD.tpl @@ -122,6 +122,15 @@ filegroup( ], ) +filegroup( + name = "tools_coverage", + srcs = [ + ":gcov.sh", + ":llvm-profdata.sh", + ":llvm-cov.sh", + ], +) + [ cc_toolchain( name = "cc-compiler-" + arch, @@ -129,6 +138,7 @@ filegroup( ar_files = ":tools", as_files = ":tools", compiler_files = ":tools", + coverage_files = ":tools_coverage", dwp_files = ":empty", linker_files = ":tools", objcopy_files = ":empty", diff --git a/crosstool/cov_tool_wrapper.sh.tpl b/crosstool/cov_tool_wrapper.sh.tpl new file mode 100644 index 00000000..11888999 --- /dev/null +++ b/crosstool/cov_tool_wrapper.sh.tpl @@ -0,0 +1,3 @@ +#!/bin/bash + +%{command} "$@" diff --git a/crosstool/osx_cc_configure.bzl b/crosstool/osx_cc_configure.bzl index 45e46b6e..c71670fe 100644 --- a/crosstool/osx_cc_configure.bzl +++ b/crosstool/osx_cc_configure.bzl @@ -88,25 +88,25 @@ def _generate_system_modulemap(repository_ctx, script, output): def _copy_file(repository_ctx, src, dest): repository_ctx.file(dest, content = repository_ctx.read(src)) -def _get_tool_path(repository_ctx, tool_name, path_env_var): - tool_path = repository_ctx.os.environ.get(path_env_var) - if tool_path != None: - if not tool_path.startswith("/"): - tool_path = repository_ctx.which(tool_path) - return tool_path - else: - env = repository_ctx.os.environ - result = repository_ctx.execute([ - "env", - "-i", - "DEVELOPER_DIR={}".format(env.get("DEVELOPER_DIR", default = "")), - "xcrun", - "--find", - tool_name, - ]) - if result.return_code != 0: - return None - return result.stdout.strip() +def _get_tool_wrapper(repository_ctx, wrapper_script_name, tool_name, path_env_var): + cov_tool_wrapper_template = Label("@build_bazel_apple_support//crosstool:cov_tool_wrapper.sh.tpl") + + command = "xcrun --run " + tool_name + + override_path = repository_ctx.os.environ.get(path_env_var) + if override_path: + if not override_path.startswith("/"): + override_path = repository_ctx.which(override_path) + command = '"{}"'.format(override_path) + + repository_ctx.template( + wrapper_script_name, + cov_tool_wrapper_template, + { + "%{command}": command, + }, + ) + return wrapper_script_name def configure_osx_toolchain(repository_ctx): """Configure C++ toolchain on macOS. @@ -173,9 +173,9 @@ def configure_osx_toolchain(repository_ctx): ) tool_paths = {} - tool_paths["gcov"] = _get_tool_path(repository_ctx, "llvm-profdata", "GCOV") - tool_paths["llvm-cov"] = _get_tool_path(repository_ctx, "llvm-cov", "BAZEL_LLVM_COV") - tool_paths["llvm-profdata"] = _get_tool_path(repository_ctx, "llvm-profdata", "BAZEL_LLVM_PROFDATA") + tool_paths["gcov"] = _get_tool_wrapper(repository_ctx, "gcov.sh", "llvm-profdata", "GCOV") + tool_paths["llvm-cov"] = _get_tool_wrapper(repository_ctx, "llvm-cov.sh", "llvm-cov", "BAZEL_LLVM_COV") + tool_paths["llvm-profdata"] = _get_tool_wrapper(repository_ctx, "llvm-profdata.sh", "llvm-profdata", "BAZEL_LLVM_PROFDATA") features = [] if _succeeds(repository_ctx, "ld", "-no_warn_duplicate_libraries", "-v"):