Introduce a cmGlobalGenerator::ResolveLanguageCompiler function
It is factored out of cmGlobalUnixMakefileGenerator3::EnableLanguage, and may be used by other generators to resolve CMAKE_*_COMPILER settings.
This commit is contained in:
parent
5b114c9bee
commit
557956f348
|
@ -77,6 +77,79 @@ cmGlobalGenerator::~cmGlobalGenerator()
|
||||||
this->ClearExportSets();
|
this->ClearExportSets();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmGlobalGenerator::ResolveLanguageCompiler(const std::string &lang,
|
||||||
|
cmMakefile *mf,
|
||||||
|
bool optional) {
|
||||||
|
std::string langComp = "CMAKE_";
|
||||||
|
langComp += lang;
|
||||||
|
langComp += "_COMPILER";
|
||||||
|
|
||||||
|
if(!mf->GetDefinition(langComp.c_str()))
|
||||||
|
{
|
||||||
|
if(!optional)
|
||||||
|
{
|
||||||
|
cmSystemTools::Error(langComp.c_str(),
|
||||||
|
" not set, after EnableLanguage");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const char* name = mf->GetRequiredDefinition(langComp.c_str());
|
||||||
|
std::string path;
|
||||||
|
if(!cmSystemTools::FileIsFullPath(name))
|
||||||
|
{
|
||||||
|
path = cmSystemTools::FindProgram(name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path = name;
|
||||||
|
}
|
||||||
|
if((path.size() == 0 || !cmSystemTools::FileExists(path.c_str()))
|
||||||
|
&& (optional==false))
|
||||||
|
{
|
||||||
|
std::string message = "your ";
|
||||||
|
message += lang;
|
||||||
|
message += " compiler: \"";
|
||||||
|
message += name;
|
||||||
|
message += "\" was not found. Please set ";
|
||||||
|
message += langComp;
|
||||||
|
message += " to a valid compiler path or name.";
|
||||||
|
cmSystemTools::Error(message.c_str());
|
||||||
|
path = name;
|
||||||
|
}
|
||||||
|
std::string doc = lang;
|
||||||
|
doc += " compiler.";
|
||||||
|
const char* cname = this->GetCMakeInstance()->
|
||||||
|
GetCacheManager()->GetCacheValue(langComp.c_str());
|
||||||
|
std::string changeVars;
|
||||||
|
if(cname && (path != cname) && (optional==false))
|
||||||
|
{
|
||||||
|
std::string cnameString = cname;
|
||||||
|
std::string pathString = path;
|
||||||
|
// get rid of potentially multiple slashes:
|
||||||
|
cmSystemTools::ConvertToUnixSlashes(cnameString);
|
||||||
|
cmSystemTools::ConvertToUnixSlashes(pathString);
|
||||||
|
if (cnameString != pathString)
|
||||||
|
{
|
||||||
|
const char* cvars =
|
||||||
|
this->GetCMakeInstance()->GetProperty(
|
||||||
|
"__CMAKE_DELETE_CACHE_CHANGE_VARS_");
|
||||||
|
if(cvars)
|
||||||
|
{
|
||||||
|
changeVars += cvars;
|
||||||
|
changeVars += ";";
|
||||||
|
}
|
||||||
|
changeVars += langComp;
|
||||||
|
changeVars += ";";
|
||||||
|
changeVars += cname;
|
||||||
|
this->GetCMakeInstance()->SetProperty(
|
||||||
|
"__CMAKE_DELETE_CACHE_CHANGE_VARS_",
|
||||||
|
changeVars.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mf->AddCacheDefinition(langComp.c_str(), path.c_str(),
|
||||||
|
doc.c_str(), cmCacheManager::FILEPATH);
|
||||||
|
}
|
||||||
|
|
||||||
// Find the make program for the generator, required for try compiles
|
// Find the make program for the generator, required for try compiles
|
||||||
void cmGlobalGenerator::FindMakeProgram(cmMakefile* mf)
|
void cmGlobalGenerator::FindMakeProgram(cmMakefile* mf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -76,6 +76,13 @@ public:
|
||||||
virtual void EnableLanguage(std::vector<std::string>const& languages,
|
virtual void EnableLanguage(std::vector<std::string>const& languages,
|
||||||
cmMakefile *, bool optional);
|
cmMakefile *, bool optional);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve the CMAKE_<lang>_COMPILER setting for the given language.
|
||||||
|
* Intended to be called from EnableLanguage.
|
||||||
|
*/
|
||||||
|
void ResolveLanguageCompiler(const std::string &lang, cmMakefile *mf,
|
||||||
|
bool optional);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to determine system infomation, get it from another generator
|
* Try to determine system infomation, get it from another generator
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -39,7 +39,6 @@ void cmGlobalUnixMakefileGenerator3
|
||||||
bool optional)
|
bool optional)
|
||||||
{
|
{
|
||||||
this->cmGlobalGenerator::EnableLanguage(languages, mf, optional);
|
this->cmGlobalGenerator::EnableLanguage(languages, mf, optional);
|
||||||
std::string path;
|
|
||||||
for(std::vector<std::string>::const_iterator l = languages.begin();
|
for(std::vector<std::string>::const_iterator l = languages.begin();
|
||||||
l != languages.end(); ++l)
|
l != languages.end(); ++l)
|
||||||
{
|
{
|
||||||
|
@ -47,74 +46,7 @@ void cmGlobalUnixMakefileGenerator3
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const char* lang = l->c_str();
|
this->ResolveLanguageCompiler(*l, mf, optional);
|
||||||
std::string langComp = "CMAKE_";
|
|
||||||
langComp += lang;
|
|
||||||
langComp += "_COMPILER";
|
|
||||||
|
|
||||||
if(!mf->GetDefinition(langComp.c_str()))
|
|
||||||
{
|
|
||||||
if(!optional)
|
|
||||||
{
|
|
||||||
cmSystemTools::Error(langComp.c_str(),
|
|
||||||
" not set, after EnableLanguage");
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const char* name = mf->GetRequiredDefinition(langComp.c_str());
|
|
||||||
if(!cmSystemTools::FileIsFullPath(name))
|
|
||||||
{
|
|
||||||
path = cmSystemTools::FindProgram(name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
path = name;
|
|
||||||
}
|
|
||||||
if((path.size() == 0 || !cmSystemTools::FileExists(path.c_str()))
|
|
||||||
&& (optional==false))
|
|
||||||
{
|
|
||||||
std::string message = "your ";
|
|
||||||
message += lang;
|
|
||||||
message += " compiler: \"";
|
|
||||||
message += name;
|
|
||||||
message += "\" was not found. Please set ";
|
|
||||||
message += langComp;
|
|
||||||
message += " to a valid compiler path or name.";
|
|
||||||
cmSystemTools::Error(message.c_str());
|
|
||||||
path = name;
|
|
||||||
}
|
|
||||||
std::string doc = lang;
|
|
||||||
doc += " compiler.";
|
|
||||||
const char* cname = this->GetCMakeInstance()->
|
|
||||||
GetCacheManager()->GetCacheValue(langComp.c_str());
|
|
||||||
std::string changeVars;
|
|
||||||
if(cname && (path != cname) && (optional==false))
|
|
||||||
{
|
|
||||||
std::string cnameString = cname;
|
|
||||||
std::string pathString = path;
|
|
||||||
// get rid of potentially multiple slashes:
|
|
||||||
cmSystemTools::ConvertToUnixSlashes(cnameString);
|
|
||||||
cmSystemTools::ConvertToUnixSlashes(pathString);
|
|
||||||
if (cnameString != pathString)
|
|
||||||
{
|
|
||||||
const char* cvars =
|
|
||||||
this->GetCMakeInstance()->GetProperty(
|
|
||||||
"__CMAKE_DELETE_CACHE_CHANGE_VARS_");
|
|
||||||
if(cvars)
|
|
||||||
{
|
|
||||||
changeVars += cvars;
|
|
||||||
changeVars += ";";
|
|
||||||
}
|
|
||||||
changeVars += langComp;
|
|
||||||
changeVars += ";";
|
|
||||||
changeVars += cname;
|
|
||||||
this->GetCMakeInstance()->SetProperty(
|
|
||||||
"__CMAKE_DELETE_CACHE_CHANGE_VARS_",
|
|
||||||
changeVars.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mf->AddCacheDefinition(langComp.c_str(), path.c_str(),
|
|
||||||
doc.c_str(), cmCacheManager::FILEPATH);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue