ENH: fix for bug 6102, allow users to change the compiler
This commit is contained in:
parent
3409e0a777
commit
fd33bf93a5
|
@ -63,7 +63,7 @@ void cmGlobalUnixMakefileGenerator3
|
||||||
" not set, after EnableLanguage");
|
" not set, after EnableLanguage");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const char* name = mf->GetRequiredDefinition(langComp.c_str());
|
const char* name = mf->GetRequiredDefinition(langComp.c_str());
|
||||||
if(!cmSystemTools::FileIsFullPath(name))
|
if(!cmSystemTools::FileIsFullPath(name))
|
||||||
{
|
{
|
||||||
path = cmSystemTools::FindProgram(name);
|
path = cmSystemTools::FindProgram(name);
|
||||||
|
@ -87,6 +87,26 @@ void cmGlobalUnixMakefileGenerator3
|
||||||
}
|
}
|
||||||
std::string doc = lang;
|
std::string doc = lang;
|
||||||
doc += " compiler.";
|
doc += " compiler.";
|
||||||
|
const char* cname = this->GetCMakeInstance()->
|
||||||
|
GetCacheManager()->GetCacheValue(langComp.c_str());
|
||||||
|
std::string changeVars;
|
||||||
|
if(cname && (path != cname))
|
||||||
|
{
|
||||||
|
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(),
|
mf->AddCacheDefinition(langComp.c_str(), path.c_str(),
|
||||||
doc.c_str(), cmCacheManager::FILEPATH);
|
doc.c_str(), cmCacheManager::FILEPATH);
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,6 +236,18 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
|
||||||
// write language flags for target
|
// write language flags for target
|
||||||
std::set<cmStdString> languages;
|
std::set<cmStdString> languages;
|
||||||
this->Target->GetLanguages(languages);
|
this->Target->GetLanguages(languages);
|
||||||
|
// put the compiler in the rules.make file so that if it changes
|
||||||
|
// things rebuild
|
||||||
|
for(std::set<cmStdString>::const_iterator l = languages.begin();
|
||||||
|
l != languages.end(); ++l)
|
||||||
|
{
|
||||||
|
cmStdString compiler = "CMAKE_";
|
||||||
|
compiler += *l;
|
||||||
|
compiler += "_COMPILER";
|
||||||
|
*this->FlagFileStream << "# compile " << l->c_str() << " with " <<
|
||||||
|
this->Makefile->GetSafeDefinition(compiler.c_str()) << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
for(std::set<cmStdString>::const_iterator l = languages.begin();
|
for(std::set<cmStdString>::const_iterator l = languages.begin();
|
||||||
l != languages.end(); ++l)
|
l != languages.end(); ++l)
|
||||||
{
|
{
|
||||||
|
|
|
@ -224,7 +224,7 @@ void cmake::CleanupCommandsAndMacros()
|
||||||
for(RegisteredCommandsMap::iterator j = this->Commands.begin();
|
for(RegisteredCommandsMap::iterator j = this->Commands.begin();
|
||||||
j != this->Commands.end(); ++j)
|
j != this->Commands.end(); ++j)
|
||||||
{
|
{
|
||||||
if ( !j->second->IsA("cmMacroHelperCommand") &&
|
if ( !j->second->IsA("cmMacroHelpperCommand") &&
|
||||||
!j->second->IsA("cmFunctionHelperCommand"))
|
!j->second->IsA("cmFunctionHelperCommand"))
|
||||||
{
|
{
|
||||||
commands.push_back(j->second);
|
commands.push_back(j->second);
|
||||||
|
@ -1793,8 +1793,78 @@ int cmake::DoPreConfigureChecks()
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
struct SaveCacheEntry
|
||||||
|
{
|
||||||
|
std::string key;
|
||||||
|
std::string value;
|
||||||
|
std::string help;
|
||||||
|
cmCacheManager::CacheEntryType type;
|
||||||
|
};
|
||||||
|
|
||||||
|
int cmake::HandleDeleteCacheVariables(const char* var)
|
||||||
|
{
|
||||||
|
std::vector<std::string> argsSplit;
|
||||||
|
cmSystemTools::ExpandListArgument(std::string(var), argsSplit);
|
||||||
|
// erase the property to avoid infinite recursion
|
||||||
|
this->SetProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_", "");
|
||||||
|
|
||||||
|
cmCacheManager::CacheIterator ci = this->CacheManager->NewIterator();
|
||||||
|
std::vector<SaveCacheEntry> saved;
|
||||||
|
cmOStringStream warning;
|
||||||
|
warning
|
||||||
|
<< "You have changed variables that require your cache to be deleted.\n"
|
||||||
|
<< "Configure will be re-run and you may have to reset some variables.\n"
|
||||||
|
<< "The following variables have changed:\n";
|
||||||
|
for(std::vector<std::string>::iterator i = argsSplit.begin();
|
||||||
|
i != argsSplit.end(); ++i)
|
||||||
|
{
|
||||||
|
SaveCacheEntry save;
|
||||||
|
save.key = *i;
|
||||||
|
warning << *i << "= ";
|
||||||
|
i++;
|
||||||
|
save.value = *i;
|
||||||
|
warning << *i << "\n";
|
||||||
|
if(ci.Find(save.key.c_str()))
|
||||||
|
{
|
||||||
|
save.type = ci.GetType();
|
||||||
|
save.help = ci.GetProperty("HELPSTRING");
|
||||||
|
}
|
||||||
|
saved.push_back(save);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the cache
|
||||||
|
this->CacheManager->DeleteCache(this->GetStartOutputDirectory());
|
||||||
|
// load the empty cache
|
||||||
|
this->LoadCache();
|
||||||
|
// restore the changed compilers
|
||||||
|
for(std::vector<SaveCacheEntry>::iterator i = saved.begin();
|
||||||
|
i != saved.end(); ++i)
|
||||||
|
{
|
||||||
|
this->AddCacheEntry(i->key.c_str(), i->value.c_str(),
|
||||||
|
i->help.c_str(), i->type);
|
||||||
|
}
|
||||||
|
cmSystemTools::Message(warning.str().c_str());
|
||||||
|
// avoid reconfigure if there were errors
|
||||||
|
if(!cmSystemTools::GetErrorOccuredFlag())
|
||||||
|
{
|
||||||
|
// re-run configure
|
||||||
|
return this->Configure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int cmake::Configure()
|
int cmake::Configure()
|
||||||
|
{
|
||||||
|
int ret = this->ActualConfigure();
|
||||||
|
const char* delCacheVars = this->GetProperty("__CMAKE_DELETE_CACHE_CHANGE_VARS_");
|
||||||
|
if(delCacheVars && delCacheVars[0] != 0)
|
||||||
|
{
|
||||||
|
return this->HandleDeleteCacheVariables(delCacheVars);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmake::ActualConfigure()
|
||||||
{
|
{
|
||||||
// Construct right now our path conversion table before it's too late:
|
// Construct right now our path conversion table before it's too late:
|
||||||
this->UpdateConversionPathTable();
|
this->UpdateConversionPathTable();
|
||||||
|
@ -1955,7 +2025,6 @@ int cmake::Configure()
|
||||||
|
|
||||||
// actually do the configure
|
// actually do the configure
|
||||||
this->GlobalGenerator->Configure();
|
this->GlobalGenerator->Configure();
|
||||||
|
|
||||||
// Before saving the cache
|
// Before saving the cache
|
||||||
// if the project did not define one of the entries below, add them now
|
// if the project did not define one of the entries below, add them now
|
||||||
// so users can edit the values in the cache:
|
// so users can edit the values in the cache:
|
||||||
|
|
|
@ -142,6 +142,7 @@ class cmake
|
||||||
* files for the tree. It will not produce any actual Makefiles, or
|
* files for the tree. It will not produce any actual Makefiles, or
|
||||||
* workspaces. Generate does that. */
|
* workspaces. Generate does that. */
|
||||||
int Configure();
|
int Configure();
|
||||||
|
int ActualConfigure();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the cmMakefiles. This routine will create a GlobalGenerator if
|
* Configure the cmMakefiles. This routine will create a GlobalGenerator if
|
||||||
|
@ -328,6 +329,7 @@ class cmake
|
||||||
static void DefineProperties(cmake *cm);
|
static void DefineProperties(cmake *cm);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
int HandleDeleteCacheVariables(const char* var);
|
||||||
cmPropertyMap Properties;
|
cmPropertyMap Properties;
|
||||||
std::set<std::pair<cmStdString,cmProperty::ScopeType> > AccessedProperties;
|
std::set<std::pair<cmStdString,cmProperty::ScopeType> > AccessedProperties;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue