Clang import; Allow Clang import without a Cppcheck build dir

This commit is contained in:
Daniel Marjamäki 2020-04-21 22:26:34 +02:00
parent 1af959af2c
commit 05dcb9a435
2 changed files with 13 additions and 19 deletions

View File

@ -919,14 +919,6 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
} }
} }
if (mSettings->clang) {
if (mSettings->buildDir.empty()) {
printMessage("If --clang is used then --cppcheck-build-dir must be specified also");
return false;
}
}
// Default template format.. // Default template format..
if (mSettings->templateFormat.empty()) { if (mSettings->templateFormat.empty()) {
mSettings->templateFormat = "{file}:{line}:{column}: {severity}:{inconclusive:inconclusive:} {message} [{id}]\\n{code}"; mSettings->templateFormat = "{file}:{line}:{column}: {severity}:{inconclusive:inconclusive:} {message} [{id}]\\n{code}";

View File

@ -274,12 +274,13 @@ unsigned int CppCheck::check(const std::string &path)
if (!mSettings.quiet) if (!mSettings.quiet)
mErrorLogger.reportOut(std::string("Checking ") + path + "..."); mErrorLogger.reportOut(std::string("Checking ") + path + "...");
const std::string clang = Path::isCPP(path) ? "clang++" : "clang"; const std::string tempFile = ".";
const std::string temp = mSettings.buildDir + (Path::isCPP(path) ? "/__temp__.cpp" : "/__temp__.c"); const std::string lang = Path::isCPP(path) ? "-x c++" : "-x c";
const std::string clangcmd = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, path, "") + ".clang-cmd"; const std::string analyzerInfo = mSettings.buildDir.empty() ? std::string() : AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, path, "");
const std::string clangStderr = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, path, "") + ".clang-stderr"; const std::string clangcmd = analyzerInfo + ".clang-cmd";
const std::string clangStderr = analyzerInfo + ".clang-stderr";
const std::string cmd1 = clang + " -v -fsyntax-only " + temp + " 2>&1"; const std::string cmd1 = "clang -v -fsyntax-only " + lang + " " + tempFile + " 2>&1";
const std::pair<bool, std::string> &result1 = executeCommand(cmd1); const std::pair<bool, std::string> &result1 = executeCommand(cmd1);
if (!result1.first || result1.second.find(" -cc1 ") == std::string::npos) { if (!result1.first || result1.second.find(" -cc1 ") == std::string::npos) {
mErrorLogger.reportOut("Failed to execute '" + cmd1 + "':" + result1.second); mErrorLogger.reportOut("Failed to execute '" + cmd1 + "':" + result1.second);
@ -287,7 +288,7 @@ unsigned int CppCheck::check(const std::string &path)
} }
std::istringstream details(result1.second); std::istringstream details(result1.second);
std::string line; std::string line;
std::string flags; std::string flags(lang + " ");
while (std::getline(details, line)) { while (std::getline(details, line)) {
if (line.find(" -internal-isystem ") == std::string::npos) if (line.find(" -internal-isystem ") == std::string::npos)
continue; continue;
@ -303,10 +304,11 @@ unsigned int CppCheck::check(const std::string &path)
for (const std::string &i: mSettings.includePaths) for (const std::string &i: mSettings.includePaths)
flags += "-I" + i + " "; flags += "-I" + i + " ";
const std::string cmd = clang + " -cc1 -ast-dump " + flags + path + " 2> " + clangStderr; const std::string cmd = "clang -cc1 -ast-dump " + flags + path + (analyzerInfo.empty() ? std::string(" 2>&1") : (" 2> " + clangStderr));
std::ofstream fout(clangcmd); if (!mSettings.buildDir.empty()) {
fout << cmd << std::endl; std::ofstream fout(clangcmd);
fout.close(); fout << cmd << std::endl;
}
const std::pair<bool, std::string> &result2 = executeCommand(cmd); const std::pair<bool, std::string> &result2 = executeCommand(cmd);
if (!result2.first || result2.second.find("TranslationUnitDecl") == std::string::npos) { if (!result2.first || result2.second.find("TranslationUnitDecl") == std::string::npos) {
@ -315,7 +317,7 @@ unsigned int CppCheck::check(const std::string &path)
} }
// Ensure there are not syntax errors... // Ensure there are not syntax errors...
{ if (!mSettings.buildDir.empty()) {
std::ifstream fin(clangStderr); std::ifstream fin(clangStderr);
while (std::getline(fin, line)) { while (std::getline(fin, line)) {
std::string::size_type pos3 = line.find(": error: "); std::string::size_type pos3 = line.find(": error: ");