Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[csolution] Fix: Unsupported registered toolchain causes error in unelated contexts #1976

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions tools/projmgr/include/ProjMgrWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,7 @@ class ProjMgrWorker {
std::vector<ConnectPtrVec>& combinations, const ConnectPtrVec& previous = ConnectPtrVec());
void PushBackUniquely(ConnectionsCollectionVec& vec, const ConnectionsCollection& value);
void PushBackUniquely(std::vector<ToolchainItem>& vec, const ToolchainItem& value);
void GetRegisteredToolchainEnvVars(void);
void GetRegisteredToolchains(void);
bool GetLatestToolchain(ToolchainItem& toolchain);
bool GetToolchainConfig(const std::string& name, const std::string& version, std::string& configPath, std::string& selectedConfigVersion);
Expand Down
43 changes: 25 additions & 18 deletions tools/projmgr/src/ProjMgrWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,7 @@ bool ProjMgrWorker::ProcessToolchain(ContextItem& context) {

context.toolchain = GetToolchain(context.compiler);

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

bool ProjMgrWorker::ListToolchains(vector<ToolchainItem>& toolchains) {
// If list toolchains command is fired
if (m_selectedContexts[0].empty()) {
// list registered toolchains
GetRegisteredToolchains();
if (m_toolchains.empty()) {
return false;
}
toolchains = m_toolchains;
return true;
}

bool allSupported = true;
for (const auto& selectedContext : m_selectedContexts) {
ContextItem& context = m_contexts[selectedContext];
if (selectedContext.empty()) {
// list registered toolchains
GetRegisteredToolchains();
if (m_toolchains.empty()) {
return false;
}
toolchains = m_toolchains;
return true;
}

// list required toolchains for selected contexts
if (!LoadPacks(context)) {
return false;
Expand All @@ -4515,10 +4518,7 @@ bool ProjMgrWorker::ListEnvironment(EnvironmentList& env) {
return true;
}

void ProjMgrWorker::GetRegisteredToolchains(void) {
if (!m_toolchains.empty()) {
return;
}
void ProjMgrWorker::GetRegisteredToolchainEnvVars(void) {
// extract toolchain info from environment variables
static const regex regEx = regex("(\\w+)_TOOLCHAIN_(\\d+)_(\\d+)_(\\d+)=(.*)");
for (const auto& envVar : m_envVars) {
Expand All @@ -4530,6 +4530,17 @@ void ProjMgrWorker::GetRegisteredToolchains(void) {
m_regToolchainsEnvVars[sm[1]][string(sm[2]) + '.' + string(sm[3]) + '.' + string(sm[4])] = sm[5];
}
}

if (m_regToolchainsEnvVars.empty()) {
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");
}
}

void ProjMgrWorker::GetRegisteredToolchains(void) {
if (!m_toolchains.empty()) {
return;
}
GetRegisteredToolchainEnvVars();
// iterate over registered toolchains
for (const auto& [toolchainName, toolchainVersions] : m_regToolchainsEnvVars) {
for (const auto& [toolchainVersion, toolchainRoot] : toolchainVersions) {
Expand All @@ -4542,10 +4553,6 @@ void ProjMgrWorker::GetRegisteredToolchains(void) {
}
}
}

if (m_regToolchainsEnvVars.empty()) {
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");
}
}

bool ProjMgrWorker::GetLatestToolchain(ToolchainItem& toolchain) {
Expand Down
46 changes: 46 additions & 0 deletions tools/projmgr/test/src/ProjMgrUnitTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,52 @@ TEST_F(ProjMgrUnitTests, ListToolchainsSolution) {
EXPECT_EQ(outStr2, expected2);
}

TEST_F(ProjMgrUnitTests, ListToolchains_with_unknown_toolchain) {
StdStreamRedirect streamRedirect;
char* envp[4];
string ac6 = "AC6_TOOLCHAIN_6_18_0=" + testinput_folder;
string gcc = "GCC_TOOLCHAIN_11_3_1=" + testinput_folder;
string unknown = "UNKNOWN_TOOLCHAIN_1_2_3=" + testinput_folder;
envp[0] = (char*)ac6.c_str();
envp[1] = (char*)gcc.c_str();
envp[2] = (char*)unknown.c_str();
envp[3] = (char*)'\0';
char* argv[5];
const string& csolution = testinput_folder + "/TestSolution/toolchain.csolution.yml";
argv[1] = (char*)"list";
argv[2] = (char*)"toolchains";
argv[3] = (char*)"--solution";
argv[4] = (char*)csolution.c_str();

// Test listing required toolchains
EXPECT_EQ(0, RunProjMgr(5, argv, envp));
const string& expected = "AC6@>=0.0.0\nAC6@>=6.18.0\[email protected]\n";
const string& outStr = streamRedirect.GetOutString();
const string& errStr = streamRedirect.GetErrorString();
EXPECT_EQ(outStr, expected);
EXPECT_TRUE(errStr.empty());

// Test with no input solution
streamRedirect.ClearStringStreams();
EXPECT_EQ(1, RunProjMgr(3, argv, envp));
const string& expected2 = "[email protected]\[email protected]\n";
const string& outStr2 = streamRedirect.GetOutString();
const string& errStr2 = streamRedirect.GetErrorString();
EXPECT_EQ(outStr2, expected2);
EXPECT_TRUE(errStr2.find("error csolution: no toolchain cmake files found for 'UNKNOWN' in") != std::string::npos);

// Test with converting the solution
streamRedirect.ClearStringStreams();
argv[1] = (char*)"convert";
argv[2] = (char*)"--solution";
argv[3] = (char*)csolution.c_str();

// Test listing required toolchains
EXPECT_EQ(0, RunProjMgr(4, argv, envp));
const string& errStr3 = streamRedirect.GetErrorString();
EXPECT_TRUE(errStr3.empty());
}

TEST_F(ProjMgrUnitTests, ListLayersUniquelyCompatibleBoard) {
StdStreamRedirect streamRedirect;
char* argv[8];
Expand Down
Loading