From 2ba9658e304d6cb82af17cf5c56fce9b01bc018d Mon Sep 17 00:00:00 2001 From: grasci <86058054+grasci-arm@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:35:03 +0100 Subject: [PATCH] [projmgr] Add `--cbuild2cmake` option --- tools/projmgr/include/ProjMgr.h | 1 + tools/projmgr/include/ProjMgrWorker.h | 9 ++++- tools/projmgr/src/ProjMgr.cpp | 39 ++++++++++++--------- tools/projmgr/src/ProjMgrWorker.cpp | 19 ++++++++-- tools/projmgr/test/src/ProjMgrUnitTests.cpp | 14 +++++--- 5 files changed, 57 insertions(+), 25 deletions(-) diff --git a/tools/projmgr/include/ProjMgr.h b/tools/projmgr/include/ProjMgr.h index bc14c1f7b..5663dbcad 100644 --- a/tools/projmgr/include/ProjMgr.h +++ b/tools/projmgr/include/ProjMgr.h @@ -141,6 +141,7 @@ class ProjMgr { bool m_contextSet; bool m_relativePaths; bool m_frozenPacks; + bool m_cbuild2cmake; bool m_updateIdx; GroupNode m_files; std::vector m_processedContexts; diff --git a/tools/projmgr/include/ProjMgrWorker.h b/tools/projmgr/include/ProjMgrWorker.h index 672e7092e..d4ec9b24f 100644 --- a/tools/projmgr/include/ProjMgrWorker.h +++ b/tools/projmgr/include/ProjMgrWorker.h @@ -517,6 +517,12 @@ class ProjMgrWorker { */ void SetDryRun(bool dryRun); + /** + * @brief set cbuild2cmake mode + * @param boolean cbuild2cmake + */ + void SetCbuild2Cmake(bool cbuild2cmake); + /** * @brief set printing paths relative to project or ${CMSSIS_PACK_ROOT} * @param boolean bRelativePaths @@ -692,6 +698,7 @@ class ProjMgrWorker { bool m_debug; bool m_dryRun; bool m_relativePaths; + bool m_cbuild2cmake; std::set m_undefLayerVars; StrMap m_packMetadata; std::map m_executes; @@ -799,7 +806,7 @@ class ProjMgrWorker { void SetFilesDependencies(const GroupNode& group, const std::string& ouput, StrVec& dependsOn, const std::string& dep, const std::string& outDir); void SetBuildOutputDependencies(const OutputTypes& outputTypes, const std::string& input, StrVec& dependsOn, const std::string& dep, const std::string& outDir); void SetExecutesDependencies(const std::string& output, const std::string& dep, const std::string& outDir); - void ValidateComponentSources(ContextItem& context); + bool ValidateComponentSources(ContextItem& context); void ProcessSelectableCompilers(); }; diff --git a/tools/projmgr/src/ProjMgr.cpp b/tools/projmgr/src/ProjMgr.cpp index 86deeabde..2e838daf7 100644 --- a/tools/projmgr/src/ProjMgr.cpp +++ b/tools/projmgr/src/ProjMgr.cpp @@ -157,12 +157,13 @@ int ProjMgr::ParseCommandLine(int argc, char** argv) { cxxopts::Option frozenPacks("frozen-packs", "The list of packs from cbuild-pack.yml is frozen and raises error if not up-to-date", cxxopts::value()->default_value("false")); cxxopts::Option updateIdx("update-idx", "Update cbuild-idx file with layer info", cxxopts::value()->default_value("false")); cxxopts::Option quiet("q,quiet", "Run silently, printing only error messages", cxxopts::value()->default_value("false")); + cxxopts::Option cbuild2cmake("cbuild2cmake", "Generate build information files only for cbuild2cmake backend", cxxopts::value()->default_value("false")); // command options dictionary map>> optionsDict = { // command, optional args, options {"update-rte", { false, {context, contextSet, debug, load, quiet, schemaCheck, toolchain, verbose, frozenPacks}}}, - {"convert", { false, {context, contextSet, debug, exportSuffix, load, quiet, schemaCheck, noUpdateRte, output, toolchain, verbose, frozenPacks}}}, + {"convert", { false, {context, contextSet, debug, exportSuffix, load, quiet, schemaCheck, noUpdateRte, output, toolchain, verbose, frozenPacks, cbuild2cmake}}}, {"run", { false, {context, contextSet, debug, generator, load, quiet, schemaCheck, verbose, dryRun}}}, {"list packs", { true, {context, debug, filter, load, missing, quiet, schemaCheck, toolchain, verbose, relativePaths}}}, {"list boards", { true, {context, debug, filter, load, quiet, schemaCheck, toolchain, verbose}}}, @@ -183,7 +184,7 @@ int ProjMgr::ParseCommandLine(int argc, char** argv) { solution, context, contextSet, filter, generator, load, clayerSearchPath, missing, schemaCheck, noUpdateRte, output, help, version, verbose, debug, dryRun, exportSuffix, toolchain, ymlOrder, - relativePaths, frozenPacks, updateIdx, quiet + relativePaths, frozenPacks, updateIdx, quiet, cbuild2cmake }); options.parse_positional({ "positional" }); @@ -205,6 +206,8 @@ int ProjMgr::ParseCommandLine(int argc, char** argv) { m_relativePaths = parseResult.count("relative-paths"); m_worker.SetPrintRelativePaths(m_relativePaths); m_frozenPacks = parseResult.count("frozen-packs"); + m_cbuild2cmake = parseResult.count("cbuild2cmake"); + m_worker.SetCbuild2Cmake(m_cbuild2cmake); ProjMgrLogger::m_quiet = parseResult.count("quiet"); vector positionalArguments; @@ -645,24 +648,26 @@ bool ProjMgr::RunConvert(void) { Success &= GenerateYMLConfigurationFiles(); // Generate Cprjs - for (auto& contextItem : m_processedContexts) { - const string filename = RteFsUtils::MakePathCanonical(contextItem->directories.cprj + "/" + contextItem->name + ".cprj"); - RteFsUtils::CreateDirectories(contextItem->directories.cprj); - if (m_generator.GenerateCprj(*contextItem, filename)) { - ProjMgrLogger::Info(filename, "file generated successfully"); - } else { - ProjMgrLogger::Error(filename, "file cannot be written"); - return false; - } - if (!m_export.empty()) { - // Generate non-locked Cprj - const string exportfilename = RteFsUtils::MakePathCanonical(contextItem->directories.cprj + "/" + contextItem->name + m_export + ".cprj"); - if (m_generator.GenerateCprj(*contextItem, exportfilename, true)) { - ProjMgrLogger::Info(exportfilename, "export file generated successfully"); + if (!m_cbuild2cmake) { + for (auto& contextItem : m_processedContexts) { + const string filename = RteFsUtils::MakePathCanonical(contextItem->directories.cprj + "/" + contextItem->name + ".cprj"); + RteFsUtils::CreateDirectories(contextItem->directories.cprj); + if (m_generator.GenerateCprj(*contextItem, filename)) { + ProjMgrLogger::Info(filename, "file generated successfully"); } else { - ProjMgrLogger::Error(exportfilename, "export file cannot be written"); + ProjMgrLogger::Error(filename, "file cannot be written"); return false; } + if (!m_export.empty()) { + // Generate non-locked Cprj + const string exportfilename = RteFsUtils::MakePathCanonical(contextItem->directories.cprj + "/" + contextItem->name + m_export + ".cprj"); + if (m_generator.GenerateCprj(*contextItem, exportfilename, true)) { + ProjMgrLogger::Info(exportfilename, "export file generated successfully"); + } else { + ProjMgrLogger::Error(exportfilename, "export file cannot be written"); + return false; + } + } } } diff --git a/tools/projmgr/src/ProjMgrWorker.cpp b/tools/projmgr/src/ProjMgrWorker.cpp index d1e806bfd..d0b876553 100644 --- a/tools/projmgr/src/ProjMgrWorker.cpp +++ b/tools/projmgr/src/ProjMgrWorker.cpp @@ -236,6 +236,10 @@ void ProjMgrWorker::SetDryRun(bool dryRun) { m_dryRun = dryRun; } +void ProjMgrWorker::SetCbuild2Cmake(bool cbuild2cmake) { + m_cbuild2cmake = cbuild2cmake; +} + void ProjMgrWorker::SetPrintRelativePaths(bool bRelativePaths) { m_relativePaths = bRelativePaths; } @@ -2119,12 +2123,15 @@ bool ProjMgrWorker::ProcessComponentFiles(ContextItem& context) { } } } - ValidateComponentSources(context); + if (!ValidateComponentSources(context)) { + return false; + } return true; } -void ProjMgrWorker::ValidateComponentSources(ContextItem& context) { +bool ProjMgrWorker::ValidateComponentSources(ContextItem& context) { // find multiple defined sources + bool error = false; StrSet sources, multipleDefinedSources; for (const auto& [componentID, files] : context.componentFiles) { for (const auto& file : files) { @@ -2148,9 +2155,15 @@ void ProjMgrWorker::ValidateComponentSources(ContextItem& context) { } } } - ProjMgrLogger::Warn(errMsg); + if (m_cbuild2cmake) { + ProjMgrLogger::Error(errMsg); + error = true; + } else { + ProjMgrLogger::Warn(errMsg); + } } } + return !error; } void ProjMgrWorker::SetFilesDependencies(const GroupNode& group, const string& ouput, StrVec& dependsOn, const string& dep, const string& outDir) { diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index df59401ff..ea8548f2b 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -5930,7 +5930,7 @@ TEST_F(ProjMgrUnitTests, SelectableToolchains) { TEST_F(ProjMgrUnitTests, SourcesAddedByMultipleComponents) { StdStreamRedirect streamRedirect; - char* argv[5]; + char* argv[6]; const string& csolution = testinput_folder + "/TestSolution/ComponentSources/components.csolution.yml"; argv[1] = (char*)"convert"; argv[2] = (char*)csolution.c_str(); @@ -5938,8 +5938,8 @@ TEST_F(ProjMgrUnitTests, SourcesAddedByMultipleComponents) { argv[4] = (char*)testoutput_folder.c_str();; EXPECT_EQ(0, RunProjMgr(5, argv, m_envp)); - const string expected = "\ -warning csolution: source modules added by multiple components:\n\ + const string& expected = "\ +(warning|error) csolution: source modules added by multiple components:\n\ filename: .*/ARM/RteTest/0.1.0/Dummy/dummy.c\n\ - component: ARM::RteTest:DupFilename@0.9.9\n\ from-pack: ARM::RteTest@0.1.0\n\ @@ -5947,6 +5947,12 @@ warning csolution: source modules added by multiple components:\n\ from-pack: ARM::RteTest@0.1.0\n\ "; - const string& errStr = streamRedirect.GetErrorString(); + string errStr = streamRedirect.GetErrorString(); + EXPECT_TRUE(regex_search(errStr, regex(expected))); + + argv[5] = (char*)"--cbuild2cmake"; + streamRedirect.ClearStringStreams(); + EXPECT_EQ(1, RunProjMgr(6, argv, m_envp)); + errStr = streamRedirect.GetErrorString(); EXPECT_TRUE(regex_search(errStr, regex(expected))); }