BUG: Fix try_compile during EnableLanguage
- The source-file signature of try_compile looks up the language of the source file using the extension-to-language map so that it knows what language to enable in the generated project. - This map needs to be filled before loading a file specified by CMAKE_USER_MAKE_RULES_OVERRIDE CMAKE_USER_MAKE_RULES_OVERRIDE_<LANG> so that the user file may call the try_compile() source-file signature. - It must still be re-filled after loading CMake<LANG>Information.cmake in case the compiler- or platform-specific files added anything. - See bug #7340.
This commit is contained in:
parent
299a0c826b
commit
2bc9acb1ca
@ -559,6 +559,11 @@ for checking whether the language is already enabled. After setting this
|
|||||||
flag still the values from the cmake variables have to be copied into the
|
flag still the values from the cmake variables have to be copied into the
|
||||||
internal maps, this is done in SetLanguageEnabledMaps() which is called
|
internal maps, this is done in SetLanguageEnabledMaps() which is called
|
||||||
after the system- and compiler specific files have been loaded.
|
after the system- and compiler specific files have been loaded.
|
||||||
|
|
||||||
|
This split was done originally so that compiler-specific configuration
|
||||||
|
files could change the object file extension
|
||||||
|
(CMAKE_<LANG>_OUTPUT_EXTENSION) before the CMake variables were copied
|
||||||
|
to the C++ maps.
|
||||||
*/
|
*/
|
||||||
void cmGlobalGenerator::SetLanguageEnabled(const char* l, cmMakefile* mf)
|
void cmGlobalGenerator::SetLanguageEnabled(const char* l, cmMakefile* mf)
|
||||||
{
|
{
|
||||||
@ -566,9 +571,16 @@ void cmGlobalGenerator::SetLanguageEnabled(const char* l, cmMakefile* mf)
|
|||||||
this->SetLanguageEnabledMaps(l, mf);
|
this->SetLanguageEnabledMaps(l, mf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmGlobalGenerator::SetLanguageEnabledFlag(const char* l, cmMakefile*)
|
void cmGlobalGenerator::SetLanguageEnabledFlag(const char* l, cmMakefile* mf)
|
||||||
{
|
{
|
||||||
this->LanguageEnabled[l] = true;
|
this->LanguageEnabled[l] = true;
|
||||||
|
|
||||||
|
// Fill the language-to-extension map with the current variable
|
||||||
|
// settings to make sure it is available for the try_compile()
|
||||||
|
// command source file signature. In SetLanguageEnabledMaps this
|
||||||
|
// will be done again to account for any compiler- or
|
||||||
|
// platform-specific entries.
|
||||||
|
this->FillExtensionToLanguageMap(l, mf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmGlobalGenerator::SetLanguageEnabledMaps(const char* l, cmMakefile* mf)
|
void cmGlobalGenerator::SetLanguageEnabledMaps(const char* l, cmMakefile* mf)
|
||||||
@ -627,11 +639,29 @@ void cmGlobalGenerator::SetLanguageEnabledMaps(const char* l, cmMakefile* mf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string extensionsVar = std::string("CMAKE_") +
|
// The map was originally filled by SetLanguageEnabledFlag, but
|
||||||
std::string(l) + std::string("_SOURCE_FILE_EXTENSIONS");
|
// since then the compiler- and platform-specific files have been
|
||||||
|
// loaded which might have added more entries.
|
||||||
|
this->FillExtensionToLanguageMap(l, mf);
|
||||||
|
|
||||||
std::string ignoreExtensionsVar = std::string("CMAKE_") +
|
std::string ignoreExtensionsVar = std::string("CMAKE_") +
|
||||||
std::string(l) + std::string("_IGNORE_EXTENSIONS");
|
std::string(l) + std::string("_IGNORE_EXTENSIONS");
|
||||||
std::string ignoreExts = mf->GetSafeDefinition(ignoreExtensionsVar.c_str());
|
std::string ignoreExts = mf->GetSafeDefinition(ignoreExtensionsVar.c_str());
|
||||||
|
std::vector<std::string> extensionList;
|
||||||
|
cmSystemTools::ExpandListArgument(ignoreExts, extensionList);
|
||||||
|
for(std::vector<std::string>::iterator i = extensionList.begin();
|
||||||
|
i != extensionList.end(); ++i)
|
||||||
|
{
|
||||||
|
this->IgnoreExtensions[*i] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmGlobalGenerator::FillExtensionToLanguageMap(const char* l,
|
||||||
|
cmMakefile* mf)
|
||||||
|
{
|
||||||
|
std::string extensionsVar = std::string("CMAKE_") +
|
||||||
|
std::string(l) + std::string("_SOURCE_FILE_EXTENSIONS");
|
||||||
std::string exts = mf->GetSafeDefinition(extensionsVar.c_str());
|
std::string exts = mf->GetSafeDefinition(extensionsVar.c_str());
|
||||||
std::vector<std::string> extensionList;
|
std::vector<std::string> extensionList;
|
||||||
cmSystemTools::ExpandListArgument(exts, extensionList);
|
cmSystemTools::ExpandListArgument(exts, extensionList);
|
||||||
@ -640,13 +670,6 @@ void cmGlobalGenerator::SetLanguageEnabledMaps(const char* l, cmMakefile* mf)
|
|||||||
{
|
{
|
||||||
this->ExtensionToLanguage[*i] = l;
|
this->ExtensionToLanguage[*i] = l;
|
||||||
}
|
}
|
||||||
cmSystemTools::ExpandListArgument(ignoreExts, extensionList);
|
|
||||||
for(std::vector<std::string>::iterator i = extensionList.begin();
|
|
||||||
i != extensionList.end(); ++i)
|
|
||||||
{
|
|
||||||
this->IgnoreExtensions[*i] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmGlobalGenerator::IgnoreFile(const char* l)
|
bool cmGlobalGenerator::IgnoreFile(const char* l)
|
||||||
|
@ -264,6 +264,7 @@ protected:
|
|||||||
projectTargets);
|
projectTargets);
|
||||||
void SetLanguageEnabledFlag(const char* l, cmMakefile* mf);
|
void SetLanguageEnabledFlag(const char* l, cmMakefile* mf);
|
||||||
void SetLanguageEnabledMaps(const char* l, cmMakefile* mf);
|
void SetLanguageEnabledMaps(const char* l, cmMakefile* mf);
|
||||||
|
void FillExtensionToLanguageMap(const char* l, cmMakefile* mf);
|
||||||
|
|
||||||
virtual bool CheckALLOW_DUPLICATE_CUSTOM_TARGETS();
|
virtual bool CheckALLOW_DUPLICATE_CUSTOM_TARGETS();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user