Skip to content

Commit 3256e32

Browse files
[csolution] Fix: Unsupported registered toolchain causes error in unelated contexts (#1976)
1 parent 98f8b4e commit 3256e32

File tree

3 files changed

+72
-18
lines changed

3 files changed

+72
-18
lines changed

tools/projmgr/include/ProjMgrWorker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,7 @@ class ProjMgrWorker {
897897
std::vector<ConnectPtrVec>& combinations, const ConnectPtrVec& previous = ConnectPtrVec());
898898
void PushBackUniquely(ConnectionsCollectionVec& vec, const ConnectionsCollection& value);
899899
void PushBackUniquely(std::vector<ToolchainItem>& vec, const ToolchainItem& value);
900+
void GetRegisteredToolchainEnvVars(void);
900901
void GetRegisteredToolchains(void);
901902
bool GetLatestToolchain(ToolchainItem& toolchain);
902903
bool GetToolchainConfig(const std::string& name, const std::string& version, std::string& configPath, std::string& selectedConfigVersion);

tools/projmgr/src/ProjMgrWorker.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,7 +1723,7 @@ bool ProjMgrWorker::ProcessToolchain(ContextItem& context) {
17231723

17241724
context.toolchain = GetToolchain(context.compiler);
17251725

1726-
GetRegisteredToolchains();
1726+
GetRegisteredToolchainEnvVars();
17271727
if (!m_regToolchainsEnvVars.empty()) {
17281728
// check if the required environment variable is set
17291729
auto itr = std::find_if(m_regToolchainsEnvVars.begin(), m_regToolchainsEnvVars.end(), [&context](const auto& item) {
@@ -4480,18 +4480,21 @@ bool ProjMgrWorker::IsContextSelected(const string& context) {
44804480
}
44814481

44824482
bool ProjMgrWorker::ListToolchains(vector<ToolchainItem>& toolchains) {
4483+
// If list toolchains command is fired
4484+
if (m_selectedContexts[0].empty()) {
4485+
// list registered toolchains
4486+
GetRegisteredToolchains();
4487+
if (m_toolchains.empty()) {
4488+
return false;
4489+
}
4490+
toolchains = m_toolchains;
4491+
return true;
4492+
}
4493+
44834494
bool allSupported = true;
44844495
for (const auto& selectedContext : m_selectedContexts) {
44854496
ContextItem& context = m_contexts[selectedContext];
4486-
if (selectedContext.empty()) {
4487-
// list registered toolchains
4488-
GetRegisteredToolchains();
4489-
if (m_toolchains.empty()) {
4490-
return false;
4491-
}
4492-
toolchains = m_toolchains;
4493-
return true;
4494-
}
4497+
44954498
// list required toolchains for selected contexts
44964499
if (!LoadPacks(context)) {
44974500
return false;
@@ -4515,10 +4518,7 @@ bool ProjMgrWorker::ListEnvironment(EnvironmentList& env) {
45154518
return true;
45164519
}
45174520

4518-
void ProjMgrWorker::GetRegisteredToolchains(void) {
4519-
if (!m_toolchains.empty()) {
4520-
return;
4521-
}
4521+
void ProjMgrWorker::GetRegisteredToolchainEnvVars(void) {
45224522
// extract toolchain info from environment variables
45234523
static const regex regEx = regex("(\\w+)_TOOLCHAIN_(\\d+)_(\\d+)_(\\d+)=(.*)");
45244524
for (const auto& envVar : m_envVars) {
@@ -4530,6 +4530,17 @@ void ProjMgrWorker::GetRegisteredToolchains(void) {
45304530
m_regToolchainsEnvVars[sm[1]][string(sm[2]) + '.' + string(sm[3]) + '.' + string(sm[4])] = sm[5];
45314531
}
45324532
}
4533+
4534+
if (m_regToolchainsEnvVars.empty()) {
4535+
m_toolchainErrors[MessageType::Warning].insert("no compiler registered. Add path to compiler 'bin' directory with environment variable <name>_TOOLCHAIN_<major>_<minor>_<patch>. <name> is one of AC6, GCC, IAR, CLANG");
4536+
}
4537+
}
4538+
4539+
void ProjMgrWorker::GetRegisteredToolchains(void) {
4540+
if (!m_toolchains.empty()) {
4541+
return;
4542+
}
4543+
GetRegisteredToolchainEnvVars();
45334544
// iterate over registered toolchains
45344545
for (const auto& [toolchainName, toolchainVersions] : m_regToolchainsEnvVars) {
45354546
for (const auto& [toolchainVersion, toolchainRoot] : toolchainVersions) {
@@ -4542,10 +4553,6 @@ void ProjMgrWorker::GetRegisteredToolchains(void) {
45424553
}
45434554
}
45444555
}
4545-
4546-
if (m_regToolchainsEnvVars.empty()) {
4547-
m_toolchainErrors[MessageType::Warning].insert("no compiler registered. Add path to compiler 'bin' directory with environment variable <name>_TOOLCHAIN_<major>_<minor>_<patch>. <name> is one of AC6, GCC, IAR, CLANG");
4548-
}
45494556
}
45504557

45514558
bool ProjMgrWorker::GetLatestToolchain(ToolchainItem& toolchain) {

tools/projmgr/test/src/ProjMgrUnitTests.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,52 @@ TEST_F(ProjMgrUnitTests, ListToolchainsSolution) {
19261926
EXPECT_EQ(outStr2, expected2);
19271927
}
19281928

1929+
TEST_F(ProjMgrUnitTests, ListToolchains_with_unknown_toolchain) {
1930+
StdStreamRedirect streamRedirect;
1931+
char* envp[4];
1932+
string ac6 = "AC6_TOOLCHAIN_6_18_0=" + testinput_folder;
1933+
string gcc = "GCC_TOOLCHAIN_11_3_1=" + testinput_folder;
1934+
string unknown = "UNKNOWN_TOOLCHAIN_1_2_3=" + testinput_folder;
1935+
envp[0] = (char*)ac6.c_str();
1936+
envp[1] = (char*)gcc.c_str();
1937+
envp[2] = (char*)unknown.c_str();
1938+
envp[3] = (char*)'\0';
1939+
char* argv[5];
1940+
const string& csolution = testinput_folder + "/TestSolution/toolchain.csolution.yml";
1941+
argv[1] = (char*)"list";
1942+
argv[2] = (char*)"toolchains";
1943+
argv[3] = (char*)"--solution";
1944+
argv[4] = (char*)csolution.c_str();
1945+
1946+
// Test listing required toolchains
1947+
EXPECT_EQ(0, RunProjMgr(5, argv, envp));
1948+
const string& expected = "AC6@>=0.0.0\nAC6@>=6.18.0\n[email protected]\n";
1949+
const string& outStr = streamRedirect.GetOutString();
1950+
const string& errStr = streamRedirect.GetErrorString();
1951+
EXPECT_EQ(outStr, expected);
1952+
EXPECT_TRUE(errStr.empty());
1953+
1954+
// Test with no input solution
1955+
streamRedirect.ClearStringStreams();
1956+
EXPECT_EQ(1, RunProjMgr(3, argv, envp));
1957+
const string& expected2 = "[email protected]\n[email protected]\n";
1958+
const string& outStr2 = streamRedirect.GetOutString();
1959+
const string& errStr2 = streamRedirect.GetErrorString();
1960+
EXPECT_EQ(outStr2, expected2);
1961+
EXPECT_TRUE(errStr2.find("error csolution: no toolchain cmake files found for 'UNKNOWN' in") != std::string::npos);
1962+
1963+
// Test with converting the solution
1964+
streamRedirect.ClearStringStreams();
1965+
argv[1] = (char*)"convert";
1966+
argv[2] = (char*)"--solution";
1967+
argv[3] = (char*)csolution.c_str();
1968+
1969+
// Test listing required toolchains
1970+
EXPECT_EQ(0, RunProjMgr(4, argv, envp));
1971+
const string& errStr3 = streamRedirect.GetErrorString();
1972+
EXPECT_TRUE(errStr3.empty());
1973+
}
1974+
19291975
TEST_F(ProjMgrUnitTests, ListLayersUniquelyCompatibleBoard) {
19301976
StdStreamRedirect streamRedirect;
19311977
char* argv[8];

0 commit comments

Comments
 (0)