diff --git a/src/clang.bzl b/src/clang.bzl index 121a458f..bf88b983 100644 --- a/src/clang.bzl +++ b/src/clang.bzl @@ -1,5 +1,9 @@ load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") +load( + "@default_codechecker_tools//:defs.bzl", + "CCACHE_DISABLE" +) CLANG_TIDY_WRAPPER_SCRIPT = """#!/usr/bin/env bash CLANG_TIDY=$1 @@ -176,12 +180,19 @@ def _run_analyzer( direct = input_files, transitive = [compilation_context.headers], ) + + # Have it None by default to avoid overwriting use_default_shell_env + env_var = {} + if CCACHE_DISABLE == "1": + env_var["CCACHE_DISABLE"] = CCACHE_DISABLE + ctx.actions.run( inputs = inputs, outputs = [outfile], executable = wrapper, arguments = [args], mnemonic = "ClangAnalyzer", + env = env_var, use_default_shell_env = True, progress_message = "Run clang -analyze on {}".format(infile.short_path), ) diff --git a/src/clang_ctu.bzl b/src/clang_ctu.bzl index c18b4147..c188ebab 100644 --- a/src/clang_ctu.bzl +++ b/src/clang_ctu.bzl @@ -1,5 +1,9 @@ load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") +load( + "@default_codechecker_tools//:defs.bzl", + "CCACHE_DISABLE" +) CLANG_CTU_WRAPPER_SCRIPT = """#!/usr/bin/env bash #set -x @@ -99,6 +103,11 @@ def _run_clang_ctu( args.add(src.path) args.add_all(arguments) + # Have it None by default to avoid overwriting use_default_shell_env + env_var = None + if CCACHE_DISABLE == 1: + env_var = {"CCACHE_DISABLE": CCACHE_DISABLE} + # Action to run CodeChecker for a file ctx.actions.run( inputs = inputs, @@ -106,6 +115,7 @@ def _run_clang_ctu( executable = wrapper, arguments = [args], mnemonic = "ClangCTU", + env = env_var, use_default_shell_env = True, progress_message = "clang -analyze +CTU {}".format(src.short_path), ) diff --git a/src/codechecker.bzl b/src/codechecker.bzl index 187e04e6..c7a6df0d 100644 --- a/src/codechecker.bzl +++ b/src/codechecker.bzl @@ -9,6 +9,7 @@ load( load( "@default_codechecker_tools//:defs.bzl", "CODECHECKER_BIN_PATH", + "CCACHE_DISABLE" ) load( "per_file.bzl", @@ -102,6 +103,11 @@ def _codechecker_impl(ctx): if compile_commands != ctx.outputs.compile_commands: fail("Seems compile_commands.json file is incorrect!") + # Have it None by default to avoid overwriting use_default_shell_env + env_var = {} + if CCACHE_DISABLE == "1": + env_var["CCACHE_DISABLE"] = CCACHE_DISABLE + # Convert flacc calls to clang in compile_commands.json # and save to codechecker_commands.json ctx.actions.run( @@ -115,6 +121,7 @@ def _codechecker_impl(ctx): ], mnemonic = "CodeCheckerConvertFlaccToClang", progress_message = "Filtering %s" % str(ctx.label), + env = env_var, # use_default_shell_env = True, ) @@ -199,6 +206,7 @@ def _codechecker_impl(ctx): arguments = [], mnemonic = "CodeChecker", progress_message = "CodeChecker %s" % str(ctx.label), + env = env_var, # use_default_shell_env = True, ) diff --git a/src/per_file.bzl b/src/per_file.bzl index cfb76621..d4243911 100644 --- a/src/per_file.bzl +++ b/src/per_file.bzl @@ -3,6 +3,10 @@ load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") +load( + "@default_codechecker_tools//:defs.bzl", + "CCACHE_DISABLE" +) CODE_CHECKER_WRAPPER_SCRIPT = """#!/usr/bin/env bash #set -x @@ -94,6 +98,11 @@ def _run_code_checker( args.add("--output=" + data_dir) args.add("--file=*/" + src.path) + # Have it None by default to avoid overwriting use_default_shell_env + env_var = {} + if CCACHE_DISABLE == "1": + env_var["CCACHE_DISABLE"] = CCACHE_DISABLE + # Action to run CodeChecker for a file ctx.actions.run( inputs = inputs, @@ -101,6 +110,7 @@ def _run_code_checker( executable = wrapper, arguments = [args], mnemonic = "CodeChecker", + env = env_var, use_default_shell_env = True, progress_message = "CodeChecker analyze {}".format(src.short_path), ) diff --git a/src/tools.bzl b/src/tools.bzl index 32ad4207..baa0698c 100644 --- a/src/tools.bzl +++ b/src/tools.bzl @@ -82,7 +82,46 @@ def _codechecker_local_repository_impl(repository_ctx): if not codechecker_bin_path: fail("ERROR! CodeChecker is not detected") - defs = "CODECHECKER_BIN_PATH = '{}'\n".format(codechecker_bin_path) + # In future versions use repository_ctx.getenv() + ccache_disable = repository_ctx.os.environ.get("CCACHE_DISABLE", 0) + + analyzers = repository_ctx.execute([codechecker_bin_path, "analyzers"]) + + parsed_analyzers = {} + + lines = analyzers.stdout.strip().split('\n') + for line in lines: + parts_dirty = line.split(" ") + parts = [] + for fragment in parts_dirty: + if fragment != "": + parts.append(fragment) + tool_name = parts[0] + if 'NOT' not in parts: + path = parts[1] + version = parts[2] + parsed_analyzers[tool_name] = {'path': path, 'version': version} + bash_bin = repository_ctx.which("bash") + clang_ccache = repository_ctx.execute( + [ + bash_bin, "-c", + "{} -xc -c - --ccache-skip