From e5572835c00de78331f06244ae3c5f2934ae1968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Thu, 26 Jan 2023 22:05:40 +0100 Subject: [PATCH] fixed `platforms` lookup / set proper platform type for `unix32-unsigned` and `unix64-unsigned` / copy `platforms` in CMake (#4464) --- CMakeLists.txt | 5 ++++ cli/CMakeLists.txt | 1 + cli/cmdlineparser.cpp | 12 ++++++-- lib/platform.cpp | 60 ++++++++++++++++++++++---------------- lib/platform.h | 3 +- test/CMakeLists.txt | 1 + test/testcmdlineparser.cpp | 35 ++++++++++++++++------ 7 files changed, 80 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a360178b..4d0000bda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,11 @@ add_custom_target(copy_addons ALL "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/addons" COMMENT "Copying addons files to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}") +add_custom_target(copy_platforms ALL + ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/platforms" + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/platforms" + COMMENT "Copying platforms files to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}") + if(USE_BUNDLED_TINYXML2) message(STATUS "Using bundled version of tinyxml2") add_subdirectory(externals/tinyxml2) diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index fa1cbad50..09244298d 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -47,6 +47,7 @@ target_link_libraries(cppcheck ${CMAKE_THREAD_LIBS_INIT}) add_dependencies(cppcheck copy_cfg) add_dependencies(cppcheck copy_addons) +add_dependencies(cppcheck copy_platforms) add_dependencies(cppcheck run-dmake) install(TARGETS cppcheck diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 5e9c27c8c..1fb18b928 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -611,13 +611,21 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) mSettings->platform(Settings::Native); else if (platform == "unspecified") mSettings->platform(Settings::Unspecified); - else if (!mSettings->loadPlatformFile(argv[0], platform)) { + else if (!mSettings->loadPlatformFile(argv[0], platform, mSettings->verbose)) { std::string message("unrecognized platform: \""); message += platform; message += "\"."; printError(message); return false; } + + // TODO: remove + // these are loaded via external files and thus have Settings::PlatformFile set instead. + // override the type so they behave like the regular platforms. + if (platform == "unix32-unsigned") + mSettings->platformType = Settings::Unix32; + else if (platform == "unix64-unsigned") + mSettings->platformType = Settings::Unix64; } // Write results in results.plist @@ -678,7 +686,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) mSettings->platform(Settings::Native); else if (platform == "unspecified" || platform == "Unspecified" || platform.empty()) ; - else if (!mSettings->loadPlatformFile(projectFile.c_str(), platform) && !mSettings->loadPlatformFile(argv[0], platform)) { + else if (!mSettings->loadPlatformFile(projectFile.c_str(), platform, mSettings->verbose) && !mSettings->loadPlatformFile(argv[0], platform, mSettings->verbose)) { std::string message("unrecognized platform: \""); message += platform; message += "\"."; diff --git a/lib/platform.cpp b/lib/platform.cpp index 578a365f1..d74fb4146 100644 --- a/lib/platform.cpp +++ b/lib/platform.cpp @@ -21,6 +21,7 @@ #include "path.h" #include +#include #include #include @@ -156,36 +157,45 @@ bool cppcheck::Platform::platform(cppcheck::Platform::PlatformType type) return false; } -bool cppcheck::Platform::loadPlatformFile(const char exename[], const std::string &filename) +bool cppcheck::Platform::loadPlatformFile(const char exename[], const std::string &filename, bool verbose) { + // TODO: only append .xml if missing + // TODO: use native separators + std::vector filenames; + filenames.push_back(filename); + filenames.push_back(filename + ".xml"); + filenames.push_back("platforms/" + filename); + filenames.push_back("platforms/" + filename + ".xml"); + if (exename && (std::string::npos != Path::fromNativeSeparators(exename).find('/'))) { + filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + filename); + filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + "platforms/" + filename); + filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + "platforms/" + filename + ".xml"); + } +#ifdef FILESDIR + std::string filesdir = FILESDIR; + if (!filesdir.empty() && filesdir[filesdir.size()-1] != '/') + filesdir += '/'; + filenames.push_back(filesdir + ("platforms/" + filename)); + filenames.push_back(filesdir + ("platforms/" + filename + ".xml")); +#endif + // open file.. tinyxml2::XMLDocument doc; - if (doc.LoadFile(filename.c_str()) != tinyxml2::XML_SUCCESS) { - std::vector filenames; - filenames.push_back(filename + ".xml"); - if (exename && (std::string::npos != Path::fromNativeSeparators(exename).find('/'))) { - filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + filename); - filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + filename); - filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + "platforms/" + filename); - filenames.push_back(Path::getPathFromFilename(Path::fromNativeSeparators(exename)) + "platforms/" + filename + ".xml"); + bool success = false; + for (const std::string & f : filenames) { + if (verbose) + std::cout << "try to load platform file '" << f << "' ... "; + if (doc.LoadFile(f.c_str()) == tinyxml2::XML_SUCCESS) { + if (verbose) + std::cout << "Success" << std::endl; + success = true; + break; } -#ifdef FILESDIR - std::string filesdir = FILESDIR; - if (!filesdir.empty() && filesdir[filesdir.size()-1] != '/') - filesdir += '/'; - filenames.push_back(filesdir + ("platforms/" + filename)); - filenames.push_back(filesdir + ("platforms/" + filename + ".xml")); -#endif - bool success = false; - for (const std::string & f : filenames) { - if (doc.LoadFile(f.c_str()) == tinyxml2::XML_SUCCESS) { - success = true; - break; - } - } - if (!success) - return false; + if (verbose) + std::cout << doc.ErrorStr() << std::endl; } + if (!success) + return false; return loadFromXmlDocument(&doc); } diff --git a/lib/platform.h b/lib/platform.h index 3f8d13833..f76415dd8 100644 --- a/lib/platform.h +++ b/lib/platform.h @@ -120,9 +120,10 @@ namespace cppcheck { * load platform file * @param exename application path * @param filename platform filename + * @param verbose log verbose information about the lookup * @return returns true if file was loaded successfully */ - bool loadPlatformFile(const char exename[], const std::string &filename); + bool loadPlatformFile(const char exename[], const std::string &filename, bool verbose = false); /** load platform from xml document, primarily for testing */ bool loadFromXmlDocument(const tinyxml2::XMLDocument *doc); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8690a8071..d5411505d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -35,6 +35,7 @@ if (BUILD_TESTS) add_dependencies(testrunner copy_cfg) add_dependencies(testrunner copy_addons) + add_dependencies(testrunner copy_platforms) add_dependencies(testrunner run-dmake) if (LIBXML2_XMLLINT_EXECUTABLE) diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index e1001710c..2fcac1acc 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -124,10 +124,12 @@ private: TEST_CASE(platformWin32A); TEST_CASE(platformWin32W); TEST_CASE(platformUnix32); + TEST_CASE(platformUnix32Unsigned); TEST_CASE(platformUnix64); + TEST_CASE(platformUnix64Unsigned); TEST_CASE(platformNative); TEST_CASE(platformUnspecified); - //TEST_CASE(platformPlatformFile); + TEST_CASE(platformPlatformFile); TEST_CASE(platformUnknown); TEST_CASE(plistEmpty); TEST_CASE(plistDoesNotExist); @@ -1002,6 +1004,15 @@ private: ASSERT_EQUALS("", GET_REDIRECT_OUTPUT); } + void platformUnix32Unsigned() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--platform=unix32-unsigned", "file.cpp"}; + ASSERT(settings.platform(Settings::Unspecified)); + ASSERT(defParser.parseFromArgs(3, argv)); + ASSERT(settings.platformType == Settings::Unix32); + ASSERT_EQUALS("", GET_REDIRECT_OUTPUT); + } + void platformUnix64() { REDIRECT; const char * const argv[] = {"cppcheck", "--platform=unix64", "file.cpp"}; @@ -1011,6 +1022,15 @@ private: ASSERT_EQUALS("", GET_REDIRECT_OUTPUT); } + void platformUnix64Unsigned() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--platform=unix64-unsigned", "file.cpp"}; + ASSERT(settings.platform(Settings::Unspecified)); + ASSERT(defParser.parseFromArgs(3, argv)); + ASSERT(settings.platformType == Settings::Unix64); + ASSERT_EQUALS("", GET_REDIRECT_OUTPUT); + } + void platformNative() { REDIRECT; const char * const argv[] = {"cppcheck", "--platform=native", "file.cpp"}; @@ -1029,17 +1049,14 @@ private: ASSERT_EQUALS("", GET_REDIRECT_OUTPUT); } - /* - // TODO: the file is not found because of a bug in the lookup code - void platformPlatformFile() { + void platformPlatformFile() { REDIRECT; const char * const argv[] = {"cppcheck", "--platform=avr8", "file.cpp"}; ASSERT(settings.platform(Settings::Unspecified)); - TODO_ASSERT_EQUALS(true, false, defParser.parseFromArgs(3, argv)); - TODO_ASSERT_EQUALS(Settings::PlatformFile, Settings::Unspecified, settings.platformType); - TODO_ASSERT_EQUALS("cppcheck: error: unrecognized platform: \"avr8\".\n", "", GET_REDIRECT_OUTPUT); - } - */ + ASSERT_EQUALS(true, defParser.parseFromArgs(3, argv)); + ASSERT_EQUALS(Settings::PlatformFile, settings.platformType); + ASSERT_EQUALS("", GET_REDIRECT_OUTPUT); + } void platformUnknown() { REDIRECT;