Skip to content

Commit 8e2cbcb

Browse files
committed
added (undocumented) --no-cppcheck-build-dir command-line option to indicate that tests should not inject a build dir
1 parent 7a5d5fc commit 8e2cbcb

3 files changed

Lines changed: 49 additions & 12 deletions

File tree

cli/cmdlineparser.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -530,14 +530,14 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
530530
}
531531

532532
else if (std::strncmp(argv[i], "--cppcheck-build-dir=", 21) == 0) {
533-
mSettings.buildDir = Path::fromNativeSeparators(argv[i] + 21);
534-
if (endsWith(mSettings.buildDir, '/'))
535-
mSettings.buildDir.pop_back();
536-
537-
if (!Path::isDirectory(mSettings.buildDir)) {
538-
mLogger.printError("Directory '" + mSettings.buildDir + "' specified by --cppcheck-build-dir argument has to be existent.");
533+
std::string path = Path::fromNativeSeparators(argv[i] + 21);
534+
if (path.empty()) {
535+
mLogger.printError("no path has been specified for --cppcheck-build-dir");
539536
return Result::Fail;
540537
}
538+
mSettings.buildDir = std::move(path);
539+
if (endsWith(mSettings.buildDir, '/'))
540+
mSettings.buildDir.pop_back();
541541
}
542542

543543
else if (std::strcmp(argv[i], "--cpp-header-probe") == 0) {
@@ -913,6 +913,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
913913
mSettings.maxCtuDepth = temp;
914914
}
915915

916+
// undocumented option for usage in Python tests to indicate that no build dir should be injected
917+
else if (std::strcmp(argv[i], "--no-cppcheck-build-dir") == 0) {
918+
mSettings.buildDir.clear();
919+
}
920+
916921
else if (std::strcmp(argv[i], "--no-cpp-header-probe") == 0) {
917922
mSettings.cppHeaderProbe = false;
918923
}
@@ -1457,6 +1462,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
14571462
return Result::Fail;
14581463
}
14591464

1465+
if (!mSettings.buildDir.empty() && !Path::isDirectory(mSettings.buildDir)) {
1466+
mLogger.printError("Directory '" + mSettings.buildDir + "' specified by --cppcheck-build-dir argument has to be existent.");
1467+
return Result::Fail;
1468+
}
1469+
14601470
// Print error only if we have "real" command and expect files
14611471
if (mPathNames.empty() && project.guiProject.pathNames.empty() && project.fileSettings.empty()) {
14621472
// TODO: this message differs from the one reported in fillSettingsFromArgs()

test/cli/testutils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ def cppcheck_ex(args, env=None, remove_checkers_report=True, cwd=None, cppcheck_
194194
if 'TEST_CPPCHECK_INJECT_BUILDDIR' in os.environ:
195195
found_builddir = False
196196
for arg in args:
197-
if arg.startswith('--cppcheck-build-dir='):
197+
if arg.startswith('--cppcheck-build-dir=') or arg == '--no-cppcheck-build-dir':
198198
found_builddir = True
199199
break
200200
if not found_builddir:

test/testcmdlineparser.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,9 @@ class TestCmdlineParser : public TestFixture {
436436
TEST_CASE(cppcheckBuildDirExistent);
437437
TEST_CASE(cppcheckBuildDirNonExistent);
438438
TEST_CASE(cppcheckBuildDirEmpty);
439+
TEST_CASE(cppcheckBuildDirMultiple);
440+
TEST_CASE(noCppcheckBuildDir);
441+
TEST_CASE(noCppcheckBuildDir2);
439442

440443
TEST_CASE(invalidCppcheckCfg);
441444
}
@@ -2962,20 +2965,44 @@ class TestCmdlineParser : public TestFixture {
29622965
REDIRECT;
29632966
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=.", "file.cpp"};
29642967
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
2968+
ASSERT_EQUALS(".", settings->buildDir);
29652969
}
29662970

29672971
void cppcheckBuildDirNonExistent() {
29682972
REDIRECT;
2969-
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path"};
2970-
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(2, argv));
2973+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path", "file.cpp"};
2974+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
29712975
ASSERT_EQUALS("cppcheck: error: Directory 'non-existent-path' specified by --cppcheck-build-dir argument has to be existent.\n", logger->str());
29722976
}
29732977

29742978
void cppcheckBuildDirEmpty() {
29752979
REDIRECT;
2976-
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir="};
2977-
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(2, argv));
2978-
ASSERT_EQUALS("cppcheck: error: Directory '' specified by --cppcheck-build-dir argument has to be existent.\n", logger->str());
2980+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=", "file.cpp"};
2981+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
2982+
ASSERT_EQUALS("cppcheck: error: no path has been specified for --cppcheck-build-dir\n", logger->str());
2983+
}
2984+
2985+
void cppcheckBuildDirMultiple() {
2986+
REDIRECT;
2987+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path", "--cppcheck-build-dir=.", "file.cpp"};
2988+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
2989+
ASSERT_EQUALS(".", settings->buildDir);
2990+
}
2991+
2992+
void noCppcheckBuildDir()
2993+
{
2994+
REDIRECT;
2995+
const char * const argv[] = {"cppcheck", "--no-cppcheck-build-dir", "file.cpp"};
2996+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
2997+
ASSERT(settings->buildDir.empty());
2998+
}
2999+
3000+
void noCppcheckBuildDir2()
3001+
{
3002+
REDIRECT;
3003+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=b1", "--no-cppcheck-build-dir", "file.cpp"};
3004+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
3005+
ASSERT(settings->buildDir.empty());
29793006
}
29803007

29813008
void invalidCppcheckCfg() {

0 commit comments

Comments
 (0)