summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-04-29 18:17:42 (GMT)
committerBrad King <brad.king@kitware.com>2008-04-29 18:17:42 (GMT)
commit3344ce9197926f262fa4eed30f085d72b08af744 (patch)
treebdf69c8d44f3f03a2b8609f7d4f11235beae6e59 /Source
parent19aafdb35526cbb2cf6b16cd8e264cb06cc15650 (diff)
downloadCMake-3344ce9197926f262fa4eed30f085d72b08af744.zip
CMake-3344ce9197926f262fa4eed30f085d72b08af744.tar.gz
CMake-3344ce9197926f262fa4eed30f085d72b08af744.tar.bz2
ENH: In cmSourceFile::GetLanguage use the file extension (if not ambiguous) to determine the language without requiring the source file to exist.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmSourceFile.cxx37
-rw-r--r--Source/cmSourceFile.h1
2 files changed, 34 insertions, 4 deletions
diff --git a/Source/cmSourceFile.cxx b/Source/cmSourceFile.cxx
index 7b32235..0a848f6 100644
--- a/Source/cmSourceFile.cxx
+++ b/Source/cmSourceFile.cxx
@@ -46,10 +46,28 @@ std::string const& cmSourceFile::GetExtension() const
//----------------------------------------------------------------------------
const char* cmSourceFile::GetLanguage()
{
- // Compute the final location of the file if necessary.
- if(this->FullPath.empty())
+ // If the language was set explicitly by the user then use it.
+ if(const char* lang = this->GetProperty("LANGUAGE"))
{
- this->GetFullPath();
+ return lang;
+ }
+
+ // Perform computation needed to get the language if necessary.
+ if(this->FullPath.empty() && this->Language.empty())
+ {
+ if(this->Location.ExtensionIsAmbiguous())
+ {
+ // Finalize the file location to get the extension and set the
+ // language.
+ this->GetFullPath();
+ }
+ else
+ {
+ // Use the known extension to get the language if possible.
+ std::string ext =
+ cmSystemTools::GetFilenameLastExtension(this->Location.GetName());
+ this->CheckLanguage(ext);
+ }
}
// Now try to determine the language.
@@ -252,8 +270,19 @@ void cmSourceFile::CheckExtension()
}
// Try to identify the source file language from the extension.
+ if(this->Language.empty())
+ {
+ this->CheckLanguage(this->Extension);
+ }
+}
+
+//----------------------------------------------------------------------------
+void cmSourceFile::CheckLanguage(std::string const& ext)
+{
+ // Try to identify the source file language from the extension.
+ cmMakefile* mf = this->Location.GetMakefile();
cmGlobalGenerator* gg = mf->GetLocalGenerator()->GetGlobalGenerator();
- if(const char* l = gg->GetLanguageFromExtension(this->Extension.c_str()))
+ if(const char* l = gg->GetLanguageFromExtension(ext.c_str()))
{
this->Language = l;
}
diff --git a/Source/cmSourceFile.h b/Source/cmSourceFile.h
index 1eca56e..59cb7db 100644
--- a/Source/cmSourceFile.h
+++ b/Source/cmSourceFile.h
@@ -116,6 +116,7 @@ private:
bool FindFullPath();
bool TryFullPath(const char* tryPath, const char* ext);
void CheckExtension();
+ void CheckLanguage(std::string const& ext);
std::vector<std::string> Depends;
};