Merge topic 'add-cppcheck'

311b7b1a Add properties to run cppcheck along with the compiler

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !1147
This commit is contained in:
Brad King
2017-08-30 14:54:43 +00:00
committed by Kitware Robot
24 changed files with 184 additions and 12 deletions
+10 -2
View File
@@ -633,7 +633,10 @@ void cmMakefileTargetGenerator::WriteObjectBuildFile(
const char* tidy = this->GeneratorTarget->GetProperty(tidy_prop);
std::string const cpplint_prop = lang + "_CPPLINT";
const char* cpplint = this->GeneratorTarget->GetProperty(cpplint_prop);
if ((iwyu && *iwyu) || (tidy && *tidy) || (cpplint && *cpplint)) {
std::string const cppcheck_prop = lang + "_CPPCHECK";
const char* cppcheck = this->GeneratorTarget->GetProperty(cppcheck_prop);
if ((iwyu && *iwyu) || (tidy && *tidy) || (cpplint && *cpplint) ||
(cppcheck && *cppcheck)) {
std::string run_iwyu = "$(CMAKE_COMMAND) -E __run_iwyu";
if (iwyu && *iwyu) {
run_iwyu += " --iwyu=";
@@ -647,7 +650,12 @@ void cmMakefileTargetGenerator::WriteObjectBuildFile(
run_iwyu += " --cpplint=";
run_iwyu += this->LocalGenerator->EscapeForShell(cpplint);
}
if ((tidy && *tidy) || (cpplint && *cpplint)) {
if (cppcheck && *cppcheck) {
run_iwyu += " --cppcheck=";
run_iwyu += this->LocalGenerator->EscapeForShell(cppcheck);
}
if ((tidy && *tidy) || (cpplint && *cpplint) ||
(cppcheck && *cppcheck)) {
run_iwyu += " --source=";
run_iwyu += sourceFile;
}
+10 -2
View File
@@ -617,7 +617,10 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang)
const char* tidy = this->GeneratorTarget->GetProperty(tidy_prop);
std::string const cpplint_prop = lang + "_CPPLINT";
const char* cpplint = this->GeneratorTarget->GetProperty(cpplint_prop);
if ((iwyu && *iwyu) || (tidy && *tidy) || (cpplint && *cpplint)) {
std::string const cppcheck_prop = lang + "_CPPCHECK";
const char* cppcheck = this->GeneratorTarget->GetProperty(cppcheck_prop);
if ((iwyu && *iwyu) || (tidy && *tidy) || (cpplint && *cpplint) ||
(cppcheck && *cppcheck)) {
std::string run_iwyu = this->GetLocalGenerator()->ConvertToOutputFormat(
cmSystemTools::GetCMakeCommand(), cmOutputConverter::SHELL);
run_iwyu += " -E __run_iwyu";
@@ -633,7 +636,12 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang)
run_iwyu += " --cpplint=";
run_iwyu += this->GetLocalGenerator()->EscapeForShell(cpplint);
}
if ((tidy && *tidy) || (cpplint && *cpplint)) {
if (cppcheck && *cppcheck) {
run_iwyu += " --cppcheck=";
run_iwyu += this->GetLocalGenerator()->EscapeForShell(cppcheck);
}
if ((tidy && *tidy) || (cpplint && *cpplint) ||
(cppcheck && *cppcheck)) {
run_iwyu += " --source=$in";
}
run_iwyu += " -- ";
+2
View File
@@ -262,6 +262,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
this->SetPropertyDefault("C_CLANG_TIDY", nullptr);
this->SetPropertyDefault("C_COMPILER_LAUNCHER", nullptr);
this->SetPropertyDefault("C_CPPLINT", nullptr);
this->SetPropertyDefault("C_CPPCHECK", nullptr);
this->SetPropertyDefault("C_INCLUDE_WHAT_YOU_USE", nullptr);
this->SetPropertyDefault("LINK_WHAT_YOU_USE", nullptr);
this->SetPropertyDefault("C_STANDARD", nullptr);
@@ -270,6 +271,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
this->SetPropertyDefault("CXX_CLANG_TIDY", nullptr);
this->SetPropertyDefault("CXX_COMPILER_LAUNCHER", nullptr);
this->SetPropertyDefault("CXX_CPPLINT", nullptr);
this->SetPropertyDefault("CXX_CPPCHECK", nullptr);
this->SetPropertyDefault("CXX_INCLUDE_WHAT_YOU_USE", nullptr);
this->SetPropertyDefault("CXX_STANDARD", nullptr);
this->SetPropertyDefault("CXX_STANDARD_REQUIRED", nullptr);
+60 -7
View File
@@ -297,6 +297,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
std::string sourceFile;
std::string lwyu;
std::string cpplint;
std::string cppcheck;
for (std::string::size_type cc = 2; cc < args.size(); cc++) {
std::string const& arg = args[cc];
if (arg == "--") {
@@ -311,6 +312,8 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
lwyu = arg.substr(7);
} else if (doing_options && cmHasLiteralPrefix(arg, "--cpplint=")) {
cpplint = arg.substr(10);
} else if (doing_options && cmHasLiteralPrefix(arg, "--cppcheck=")) {
cppcheck = arg.substr(11);
} else if (doing_options) {
std::cerr << "__run_iwyu given unknown argument: " << arg << "\n";
return 1;
@@ -318,14 +321,16 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
orig_cmd.push_back(arg);
}
}
if (tidy.empty() && iwyu.empty() && lwyu.empty() && cpplint.empty()) {
std::cerr << "__run_iwyu missing --cpplint=, --iwyu=, --lwyu=, and/or"
" --tidy=\n";
if (tidy.empty() && iwyu.empty() && lwyu.empty() && cpplint.empty() &&
cppcheck.empty()) {
std::cerr << "__run_iwyu missing --cpplint=, --iwyu=, --lwyu=, "
"--cppcheck= and/or --tidy=\n";
return 1;
}
if ((!cpplint.empty() || !tidy.empty()) && sourceFile.empty()) {
std::cerr << "__run_iwyu --cpplint= and/or __run_iwyu --tidy="
" require --source=\n";
if ((!cpplint.empty() || !tidy.empty() || !cppcheck.empty()) &&
sourceFile.empty()) {
std::cerr << "__run_iwyu --cpplint=, __run_iwyu --tidy="
", __run_iwyu --cppcheck require --source=\n";
return 1;
}
if (orig_cmd.empty() && lwyu.empty()) {
@@ -445,8 +450,56 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string>& args)
}
}
if (!cppcheck.empty()) {
// Construct the cpplint command line.
std::vector<std::string> cppcheck_cmd;
cmSystemTools::ExpandListArgument(cppcheck, cppcheck_cmd, true);
// extract all the -D, -U, and -I options from the compile line
for (size_t i = 0; i < orig_cmd.size(); i++) {
std::string& opt = orig_cmd[i];
if (opt.size() > 2) {
if ((opt[0] == '-') &&
((opt[1] == 'D') || (opt[1] == 'I') || (opt[1] == 'U'))) {
cppcheck_cmd.push_back(opt);
#if defined(_WIN32)
} else if ((opt[0] == '/') &&
((opt[1] == 'D') || (opt[1] == 'I') ||
(opt[1] == 'U'))) {
std::string optcopy = opt;
optcopy[0] = '-';
cppcheck_cmd.push_back(optcopy);
#endif
}
}
}
// add the source file
cppcheck_cmd.push_back(sourceFile);
// Run the cpplint command line. Capture its output.
std::string stdOut;
if (!cmSystemTools::RunSingleCommand(cppcheck_cmd, &stdOut, &stdOut,
&ret, nullptr,
cmSystemTools::OUTPUT_NONE)) {
std::cerr << "Error running '" << cppcheck_cmd[0] << "': " << stdOut
<< "\n";
return 1;
}
// Output the output from cpplint to stderr
if (stdOut.find("(error)") != std::string::npos ||
stdOut.find("(warning)") != std::string::npos ||
stdOut.find("(style)") != std::string::npos ||
stdOut.find("(performance)") != std::string::npos ||
stdOut.find("(portability)") != std::string::npos ||
stdOut.find("(information)") != std::string::npos) {
std::cerr << "Warning: cppcheck reported diagnostics:\n";
}
std::cerr << stdOut;
}
// ignore the cppcheck error code because it is likely to have them
// from bad -D stuff
ret = 0;
// Now run the real compiler command and return its result value.
// Now run the real compiler command and return its result value
// unless we are lwyu
if (lwyu.empty() &&
!cmSystemTools::RunSingleCommand(
orig_cmd, nullptr, nullptr, &ret, nullptr,