diff --git a/MODULE.bazel b/MODULE.bazel index 8612e105..f9def28e 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -40,3 +40,21 @@ codechecker_extension = use_extension( "module_register_default_codechecker", ) use_repo(codechecker_extension, "default_codechecker_tools") + + +bazel_dep(name = "toolchains_llvm", version = "1.7.0") + +# Configure and register the toolchain. +llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm") +llvm.toolchain( + name = "llvm_toolchain", + llvm_version = "20.1.4", + extra_llvm_distributions = { + "LLVM-20.1.4-Linux-ARM64.tar.xz": "4de80a332eecb06bf55097fd3280e1c69ed80f222e5bdd556221a6ceee02721a", + "LLVM-20.1.4-Linux-X64.tar.xz": "113b54c397adb2039fa45e38dc8107b9ec5a0baead3a3bac8ccfbb65b2340caa", + "LLVM-20.1.4-macOS-ARM64.tar.xz": "debb43b7b364c5cf864260d84ba1b201d49b6460fe84b76eaa65688dfadf19d2", + "clang+llvm-20.1.4-x86_64-pc-windows-msvc.tar.xz": "2b12ac1a0689e29a38a7c98c409cbfa83f390aea30c60b7a06e4ed73f82d2457", + }, +) + +use_repo(llvm, "llvm_toolchain_llvm") diff --git a/src/codechecker.bzl b/src/codechecker.bzl index 505532d0..f20b8f3b 100644 --- a/src/codechecker.bzl +++ b/src/codechecker.bzl @@ -116,6 +116,8 @@ def _codechecker_impl(ctx): }, ) + llvm_bin_dir = ctx.files._llvm_toolchain[0].dirname + ctx.actions.run( inputs = depset( [ @@ -123,14 +125,14 @@ def _codechecker_impl(ctx): ctx.outputs.codechecker_commands, ctx.outputs.codechecker_skipfile, config_file, - ] + source_files, + ] + source_files + ctx.files._llvm_toolchain, ), outputs = [ codechecker_files, ctx.outputs.codechecker_log, ], executable = ctx.outputs.codechecker_script, - arguments = [], + arguments = [llvm_bin_dir], # executable = python_path(ctx), # arguments = [ctx.outputs.codechecker_script.path], mnemonic = "CodeChecker", @@ -176,6 +178,10 @@ codechecker = rule( default = None, doc = "CodeChecker configuration", ), + "_llvm_toolchain": attr.label( + default = "@llvm_toolchain_llvm//:bin", + doc = "If the llvm_toolchain is obtained through bazel, provide the PATH to its bin directory here (e.g. @llvm_toolchain_llvm//:bin)", + ), "skip": attr.string_list( default = [], doc = "List of skip/ignore file rules. " + @@ -261,6 +267,10 @@ _codechecker_test = rule( cfg = platforms_transition, doc = "CodeChecker configuration", ), + "_llvm_toolchain": attr.label( + default = "@llvm_toolchain_llvm//:bin", + doc = "If the llvm_toolchain is obtained through bazel, provide the PATH to its bin directory here (e.g. @llvm_toolchain_llvm//:bin)", + ), "platform": attr.string( default = "", #"@platforms//os:linux", doc = "Platform to build for", diff --git a/src/codechecker_script.py b/src/codechecker_script.py index ce63f26b..275935c3 100644 --- a/src/codechecker_script.py +++ b/src/codechecker_script.py @@ -186,6 +186,8 @@ def analyze(): env.update(codechecker_env) if "PATH" not in env: env["PATH"] = "/bin" # NOTE: this is workaround for CodeChecker 6.24.4 + if sys.argv[1] != "": + env["PATH"] = os.path.abspath(sys.argv[1]) + os.pathsep + env["PATH"] logging.debug("env: %s", str(env)) output = execute(f"{CODECHECKER_PATH} analyzers --details", env=env) @@ -198,6 +200,8 @@ def analyze(): # This can be removed once codechecker 6.16.0 is used. # command += " --keep-gcc-intrin" logging.info("Running CodeChecker analyze...") + output = execute(f"{CODECHECKER_PATH} analyzers", env=env) + logging.info("Output:\n\n%s\n", output) output = execute(command, env=env) logging.info("Output:\n\n%s\n", output) if output.find("- Failed to analyze") != -1: