|
|
@ -98,10 +98,10 @@ void cmGlobalGenerator::FindMakeProgram(cmMakefile* mf) |
|
|
|
|
|
|
|
|
|
|
|
// enable the given language
|
|
|
|
void cmGlobalGenerator::EnableLanguage(const char* lang, |
|
|
|
void cmGlobalGenerator::EnableLanguage(std::vector<std::string>const& languages, |
|
|
|
cmMakefile *mf) |
|
|
|
{ |
|
|
|
if(!lang) |
|
|
|
if(languages.size() == 0) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("EnableLanguage must have a lang specified!"); |
|
|
|
cmSystemTools::SetFatalErrorOccured(); |
|
|
@ -126,7 +126,7 @@ void cmGlobalGenerator::EnableLanguage(const char* lang, |
|
|
|
|
|
|
|
// **** Step 2, Load the CMakeDetermineSystem.cmake file and find out
|
|
|
|
// what platform we are running on
|
|
|
|
if (!isLocal && !this->GetLanguageEnabled(lang)) |
|
|
|
if (!isLocal && !mf->GetDefinition("CMAKE_SYSTEM_NAME")) |
|
|
|
{ |
|
|
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
|
|
/* Windows version number data. */ |
|
|
@ -151,65 +151,72 @@ void cmGlobalGenerator::EnableLanguage(const char* lang, |
|
|
|
fpath += "/CMakeSystem.cmake"; |
|
|
|
mf->ReadListFile(0,fpath.c_str()); |
|
|
|
} |
|
|
|
// **** Step 4, load the CMakeDetermine(LANG)Compiler.cmake file to find
|
|
|
|
// the compiler
|
|
|
|
if(!isLocal && !this->GetLanguageEnabled(lang) ) |
|
|
|
{ |
|
|
|
if (m_CMakeInstance->GetIsInTryCompile()) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("This should not have happen. " |
|
|
|
"If you see this message, you are probably using a " |
|
|
|
"broken CMakeLists.txt file or a problematic release of " |
|
|
|
"CMake"); |
|
|
|
} |
|
|
|
needTestLanguage = true; // must test a language after finding it
|
|
|
|
// read determine LANG compiler
|
|
|
|
std::string determinCompiler = "CMakeDetermine"; |
|
|
|
determinCompiler += lang; |
|
|
|
determinCompiler += "Compiler.cmake"; |
|
|
|
std::string determineFile = mf->GetModulesFile(determinCompiler.c_str()); |
|
|
|
if(!mf->ReadListFile(0,determineFile.c_str())) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", determineFile.c_str()); |
|
|
|
// **** Step 4, foreach language
|
|
|
|
// load the CMakeDetermine(LANG)Compiler.cmake file to find
|
|
|
|
// the compiler
|
|
|
|
for(std::vector<std::string>::const_iterator l = languages.begin(); |
|
|
|
l != languages.end(); ++l) |
|
|
|
{ |
|
|
|
const char* lang = l->c_str(); |
|
|
|
if(!isLocal && !this->GetLanguageEnabled(lang) ) |
|
|
|
{ |
|
|
|
if (m_CMakeInstance->GetIsInTryCompile()) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("This should not have happen. " |
|
|
|
"If you see this message, you are probably using a " |
|
|
|
"broken CMakeLists.txt file or a problematic release of " |
|
|
|
"CMake"); |
|
|
|
} |
|
|
|
needTestLanguage = true; // must test a language after finding it
|
|
|
|
// read determine LANG compiler
|
|
|
|
std::string determinCompiler = "CMakeDetermine"; |
|
|
|
determinCompiler += lang; |
|
|
|
determinCompiler += "Compiler.cmake"; |
|
|
|
std::string determineFile = mf->GetModulesFile(determinCompiler.c_str()); |
|
|
|
if(!mf->ReadListFile(0,determineFile.c_str())) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", determineFile.c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
this->SetLanguageEnabled(lang); |
|
|
|
// put ${CMake_(LANG)_COMPILER_ENV_VAR}=${CMAKE_(LANG)_COMPILER into the
|
|
|
|
// environment, in case user scripts want to run configure, or sub cmakes
|
|
|
|
std::string compilerName = "CMAKE_"; |
|
|
|
compilerName += lang; |
|
|
|
compilerName += "_COMPILER"; |
|
|
|
std::string compilerEnv = "CMAKE_"; |
|
|
|
compilerEnv += lang; |
|
|
|
compilerEnv += "_COMPILER_ENV_VAR"; |
|
|
|
std::string envVar = mf->GetRequiredDefinition(compilerEnv.c_str()); |
|
|
|
std::string envVarValue = mf->GetRequiredDefinition(compilerName.c_str()); |
|
|
|
std::string env = envVar; |
|
|
|
env += "="; |
|
|
|
env += envVarValue; |
|
|
|
cmSystemTools::PutEnv(env.c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
this->SetLanguageEnabled(lang); |
|
|
|
// put ${CMake_(LANG)_COMPILER_ENV_VAR}=${CMAKE_(LANG)_COMPILER into the
|
|
|
|
// environment, in case user scripts want to run configure, or sub cmakes
|
|
|
|
std::string compilerName = "CMAKE_"; |
|
|
|
compilerName += lang; |
|
|
|
compilerName += "_COMPILER"; |
|
|
|
std::string compilerEnv = "CMAKE_"; |
|
|
|
compilerEnv += lang; |
|
|
|
compilerEnv += "_COMPILER_ENV_VAR"; |
|
|
|
std::string envVar = mf->GetRequiredDefinition(compilerEnv.c_str()); |
|
|
|
std::string envVarValue = mf->GetRequiredDefinition(compilerName.c_str()); |
|
|
|
std::string env = envVar; |
|
|
|
env += "="; |
|
|
|
env += envVarValue; |
|
|
|
cmSystemTools::PutEnv(env.c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
// **** Step 5, Load the configured language compiler file, if not loaded.
|
|
|
|
// look to see if CMAKE_(LANG)_COMPILER_LOADED is set,
|
|
|
|
// if not then load the CMake(LANG)Compiler.cmake file from the
|
|
|
|
// binary tree, this is a configured file provided by
|
|
|
|
// CMakeDetermine(LANG)Compiler.cmake
|
|
|
|
std::string loadedLang = "CMAKE_"; |
|
|
|
loadedLang += lang; |
|
|
|
loadedLang += "_COMPILER_LOADED"; |
|
|
|
if(!mf->GetDefinition(loadedLang.c_str())) |
|
|
|
{ |
|
|
|
fpath = rootBin; |
|
|
|
fpath += "/CMake"; |
|
|
|
fpath += lang; |
|
|
|
fpath += "Compiler.cmake"; |
|
|
|
if(!mf->ReadListFile(0,fpath.c_str())) |
|
|
|
// **** Step 5, Load the configured language compiler file, if not loaded.
|
|
|
|
// look to see if CMAKE_(LANG)_COMPILER_LOADED is set,
|
|
|
|
// if not then load the CMake(LANG)Compiler.cmake file from the
|
|
|
|
// binary tree, this is a configured file provided by
|
|
|
|
// CMakeDetermine(LANG)Compiler.cmake
|
|
|
|
std::string loadedLang = "CMAKE_"; |
|
|
|
loadedLang += lang; |
|
|
|
loadedLang += "_COMPILER_LOADED"; |
|
|
|
if(!mf->GetDefinition(loadedLang.c_str())) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", fpath.c_str()); |
|
|
|
fpath = rootBin; |
|
|
|
fpath += "/CMake"; |
|
|
|
fpath += lang; |
|
|
|
fpath += "Compiler.cmake"; |
|
|
|
if(!mf->ReadListFile(0,fpath.c_str())) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", fpath.c_str()); |
|
|
|
} |
|
|
|
this->SetLanguageEnabled(lang); |
|
|
|
} |
|
|
|
this->SetLanguageEnabled(lang); |
|
|
|
} |
|
|
|
|
|
|
|
// **** Step 6, Load the system specific information if not yet loaded
|
|
|
|
if (!mf->GetDefinition("CMAKE_SYSTEM_SPECIFIC_INFORMATION_LOADED")) |
|
|
|
{ |
|
|
@ -219,60 +226,65 @@ void cmGlobalGenerator::EnableLanguage(const char* lang, |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", fpath.c_str()); |
|
|
|
} |
|
|
|
} |
|
|
|
std::string langLoadedVar = "CMAKE_"; |
|
|
|
langLoadedVar += lang; |
|
|
|
langLoadedVar += "_INFORMATION_LOADED"; |
|
|
|
if (!mf->GetDefinition(langLoadedVar.c_str())) |
|
|
|
{ |
|
|
|
fpath = "CMake"; |
|
|
|
fpath += lang; |
|
|
|
fpath += "Information.cmake"; |
|
|
|
fpath = mf->GetModulesFile(fpath.c_str()); |
|
|
|
if(!mf->ReadListFile(0,fpath.c_str())) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", fpath.c_str()); |
|
|
|
for(std::vector<std::string>::const_iterator l = languages.begin(); |
|
|
|
l != languages.end(); ++l) |
|
|
|
{ |
|
|
|
const char* lang = l->c_str(); |
|
|
|
std::string langLoadedVar = "CMAKE_"; |
|
|
|
langLoadedVar += lang; |
|
|
|
langLoadedVar += "_INFORMATION_LOADED"; |
|
|
|
if (!mf->GetDefinition(langLoadedVar.c_str())) |
|
|
|
{ |
|
|
|
fpath = "CMake"; |
|
|
|
fpath += lang; |
|
|
|
fpath += "Information.cmake"; |
|
|
|
fpath = mf->GetModulesFile(fpath.c_str()); |
|
|
|
if(!mf->ReadListFile(0,fpath.c_str())) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", fpath.c_str()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// **** Step 7, Test the compiler for the language just setup
|
|
|
|
// At this point we should have enough info for a try compile
|
|
|
|
// which is used in the backward stuff
|
|
|
|
if(!isLocal) |
|
|
|
{ |
|
|
|
if(needTestLanguage) |
|
|
|
// **** Step 7, Test the compiler for the language just setup
|
|
|
|
// At this point we should have enough info for a try compile
|
|
|
|
// which is used in the backward stuff
|
|
|
|
if(!isLocal) |
|
|
|
{ |
|
|
|
if (!m_CMakeInstance->GetIsInTryCompile()) |
|
|
|
if(needTestLanguage) |
|
|
|
{ |
|
|
|
std::string testLang = "CMakeTest"; |
|
|
|
testLang += lang; |
|
|
|
testLang += "Compiler.cmake"; |
|
|
|
std::string ifpath = mf->GetModulesFile(testLang.c_str()); |
|
|
|
if(!mf->ReadListFile(0,ifpath.c_str())) |
|
|
|
if (!m_CMakeInstance->GetIsInTryCompile()) |
|
|
|
{ |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", ifpath.c_str()); |
|
|
|
} |
|
|
|
// **** Step 8, load backwards compatibility stuff for C and CXX
|
|
|
|
// for old versions of CMake ListFiles C and CXX had some
|
|
|
|
// backwards compatibility files they have to load
|
|
|
|
const char* versionValue |
|
|
|
= mf->GetDefinition("CMAKE_BACKWARDS_COMPATIBILITY"); |
|
|
|
if (atof(versionValue) <= 1.4) |
|
|
|
{ |
|
|
|
if(strcmp(lang, "C") == 0) |
|
|
|
std::string testLang = "CMakeTest"; |
|
|
|
testLang += lang; |
|
|
|
testLang += "Compiler.cmake"; |
|
|
|
std::string ifpath = mf->GetModulesFile(testLang.c_str()); |
|
|
|
if(!mf->ReadListFile(0,ifpath.c_str())) |
|
|
|
{ |
|
|
|
ifpath = mf->GetModulesFile("CMakeBackwardCompatibilityC.cmake"); |
|
|
|
mf->ReadListFile(0,ifpath.c_str()); |
|
|
|
cmSystemTools::Error("Could not find cmake module file:", ifpath.c_str()); |
|
|
|
} |
|
|
|
if(strcmp(lang, "CXX") == 0) |
|
|
|
// **** Step 8, load backwards compatibility stuff for C and CXX
|
|
|
|
// for old versions of CMake ListFiles C and CXX had some
|
|
|
|
// backwards compatibility files they have to load
|
|
|
|
const char* versionValue |
|
|
|
= mf->GetDefinition("CMAKE_BACKWARDS_COMPATIBILITY"); |
|
|
|
if (atof(versionValue) <= 1.4) |
|
|
|
{ |
|
|
|
ifpath = mf->GetModulesFile("CMakeBackwardCompatibilityCXX.cmake"); |
|
|
|
mf->ReadListFile(0,ifpath.c_str()); |
|
|
|
if(strcmp(lang, "C") == 0) |
|
|
|
{ |
|
|
|
ifpath = mf->GetModulesFile("CMakeBackwardCompatibilityC.cmake"); |
|
|
|
mf->ReadListFile(0,ifpath.c_str()); |
|
|
|
} |
|
|
|
if(strcmp(lang, "CXX") == 0) |
|
|
|
{ |
|
|
|
ifpath = mf->GetModulesFile("CMakeBackwardCompatibilityCXX.cmake"); |
|
|
|
mf->ReadListFile(0,ifpath.c_str()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|