diff --git a/lint/clang_tidy.bzl b/lint/clang_tidy.bzl index 59c0bc34..c822f04c 100644 --- a/lint/clang_tidy.bzl +++ b/lint/clang_tidy.bzl @@ -309,29 +309,53 @@ def clang_tidy_action(ctx, compilation_context, executable, srcs, stdout, exit_c outputs = [stdout] env = _get_env(ctx, srcs) - env["CLANG_TIDY__STDOUT_STDERR_OUTPUT_FILE"] = stdout.path if exit_code: - env["CLANG_TIDY__EXIT_CODE_OUTPUT_FILE"] = exit_code.path outputs.append(exit_code) # pass compiler args via a params file. The command line may already be long due to # sources, which can't go the params file, so materialize it always. - clang_tidy_args = _get_args(ctx, compilation_context, srcs) - compiler_args = ctx.actions.args() - compiler_args.add_all(_get_compiler_args(ctx, compilation_context, srcs)) - compiler_args.use_param_file("--config %s", use_always = True) + intermediate_outputs_stdout = [] + intermediate_outputs_exit_code = [] + # create an action for each file + for src in srcs: + out_intermediate_stdout = ctx.actions.declare_file(stdout.short_path+".{}.stdout".format(len(intermediate_outputs_stdout))) + env["CLANG_TIDY__STDOUT_STDERR_OUTPUT_FILE"] = out_intermediate_stdout.path + if exit_code: + out_intermediate_exit_code = ctx.actions.declare_file(exit_code.short_path+".{}.exit_code".format(len(intermediate_outputs_exit_code))) + env["CLANG_TIDY__EXIT_CODE_OUTPUT_FILE"] = out_intermediate_exit_code.path + clang_tidy_args = _get_args(ctx, compilation_context, [src]) + compiler_args = ctx.actions.args() + compiler_args.add_all(_get_compiler_args(ctx, compilation_context, [src])) + compiler_args.use_param_file("--config %s", use_always = True) + + ctx.actions.run_shell( + inputs = _gather_inputs(ctx, compilation_context, [src]), + outputs = [out_intermediate_stdout,]+([out_intermediate_exit_code] if exit_code else []), + tools = [executable._clang_tidy_wrapper, executable._clang_tidy, find_cpp_toolchain(ctx).all_files], + command = executable._clang_tidy_wrapper.path + " $@", + arguments = [executable._clang_tidy.path] + clang_tidy_args + ["--", compiler_args], + env = env, + mnemonic = _MNEMONIC, + progress_message = "Linting %{label} with clang-tidy", + ) + intermediate_outputs_stdout.append(out_intermediate_stdout) + if exit_code: + intermediate_outputs_exit_code.append(out_intermediate_exit_code) + + # emit ctx.actions.run_shell( - inputs = _gather_inputs(ctx, compilation_context, srcs), - outputs = outputs, - tools = [executable._clang_tidy_wrapper, executable._clang_tidy, find_cpp_toolchain(ctx).all_files], - command = executable._clang_tidy_wrapper.path + " $@", - arguments = [executable._clang_tidy.path] + clang_tidy_args + ["--", compiler_args], - env = env, - mnemonic = _MNEMONIC, - progress_message = "Linting %{label} with clang-tidy", + inputs = intermediate_outputs_stdout, + outputs = [stdout], + command = "cat {} > {}".format(" ".join([f.path for f in intermediate_outputs_stdout]),stdout.path) ) + if exit_code: + ctx.actions.run_shell( + inputs = intermediate_outputs_exit_code, + outputs = [exit_code], + command = "cat {} | sort -nr | head -n 1 > {}".format(" ".join([f.path for f in intermediate_outputs_exit_code]),exit_code.path) + ) def clang_tidy_fix(ctx, compilation_context, executable, srcs, patch, stdout, exit_code): """Create a Bazel Action that spawns clang-tidy with --fix.