cmake: Report if the <LANG>_CLANG_TIDY tool exits with non-zero

When using `<LANG>_CLANG_TIDY` our internal launcher for the tool must
capture its return code and stderr and report them on failure.
Otherwise incorrect command lines silently fail.

Closes: #16435
This commit is contained in:
Brad King
2016-11-17 11:36:04 -05:00
parent ce1abfa414
commit 80ebc55a7c
7 changed files with 29 additions and 3 deletions

View File

@@ -0,0 +1,6 @@
capture-clang-tidy-errors
-------------------------
* If a command specified by the :prop_tgt:`<LANG>_CLANG_TIDY` target property
returns non-zero at build time this is now treated as an error instead of
silently ignored.

View File

@@ -358,14 +358,21 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
// Run the tidy command line. Capture its stdout and hide its stderr.
std::string stdOut;
if (!cmSystemTools::RunSingleCommand(tidy_cmd, &stdOut, CM_NULLPTR,
&ret, CM_NULLPTR,
std::string stdErr;
if (!cmSystemTools::RunSingleCommand(tidy_cmd, &stdOut, &stdErr, &ret,
CM_NULLPTR,
cmSystemTools::OUTPUT_NONE)) {
std::cerr << "Error running '" << tidy_cmd[0] << "'\n";
std::cerr << "Error running '" << tidy_cmd[0] << "': " << stdErr
<< "\n";
return 1;
}
// Output the stdout from clang-tidy to stderr
std::cerr << stdOut;
// If clang-tidy exited with an error do the same.
if (ret != 0) {
std::cerr << stdErr;
return ret;
}
}
if (!lwyu.empty()) {
// Construct the ldd -r -u (link what you use lwyu) command line

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1,2 @@
stdout from bad command line arg '-bad'
stderr from bad command line arg '-bad'

View File

@@ -0,0 +1,3 @@
enable_language(C)
set(CMAKE_C_CLANG_TIDY "${PSEUDO_TIDY}" -bad)
add_executable(main main.c)

View File

@@ -20,3 +20,4 @@ if (NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_tidy(C-launch)
run_tidy(CXX-launch)
endif()
run_tidy(C-bad)

View File

@@ -1,9 +1,15 @@
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int i;
for (i = 1; i < argc; ++i) {
if (strcmp(argv[i], "-bad") == 0) {
fprintf(stdout, "stdout from bad command line arg '-bad'\n");
fprintf(stderr, "stderr from bad command line arg '-bad'\n");
return 1;
}
if (argv[i][0] != '-') {
fprintf(stdout, "%s:0:0: warning: message [checker]\n", argv[i]);
break;