summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2012-03-19 15:25:21 (GMT)
committerBrad King <brad.king@kitware.com>2012-03-19 21:13:41 (GMT)
commit328c0f65c2a273c6adcdb11f96ee057d80014de2 (patch)
treef96b61b78fe9e94331ebba7c5433fabdbcff9244
parent93d5509b5b1c208f3ed28daf35f9384ab6918441 (diff)
downloadCMake-328c0f65c2a273c6adcdb11f96ee057d80014de2.zip
CMake-328c0f65c2a273c6adcdb11f96ee057d80014de2.tar.gz
CMake-328c0f65c2a273c6adcdb11f96ee057d80014de2.tar.bz2
Simplify cmVisualStudio10TargetGenerator source classification
Combine WriteCLSources and WriteObjSources into a single method. Use the cmGeneratorTarget source classification to simplify tool selection for each source file. Extend the classification to handle .idl files.
-rw-r--r--Source/cmGeneratorTarget.cxx11
-rw-r--r--Source/cmGeneratorTarget.h1
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx143
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h5
4 files changed, 69 insertions, 91 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 4529d1c..7979928 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -37,6 +37,7 @@ void cmGeneratorTarget::ClassifySources()
si != sources.end(); ++si)
{
cmSourceFile* sf = *si;
+ std::string ext = cmSystemTools::LowerCase(sf->GetExtension());
cmTarget::SourceFileFlags tsFlags =
this->Target->GetTargetSourceFileFlags(sf);
if(sf->GetCustomCommand())
@@ -57,16 +58,22 @@ void cmGeneratorTarget::ClassifySources()
this->ExternalObjects.push_back(sf);
if(isObjLib) { badObjLib.push_back(sf); }
}
- else if(cmSystemTools::LowerCase(sf->GetExtension()) == "def")
+ else if(ext == "def")
{
this->ModuleDefinitionFile = sf->GetFullPath();
if(isObjLib) { badObjLib.push_back(sf); }
}
+ else if(ext == "idl")
+ {
+ this->IDLSources.push_back(sf);
+ if(isObjLib) { badObjLib.push_back(sf); }
+ }
else if(this->GlobalGenerator->IgnoreFile(sf->GetExtension().c_str()))
{
// We only get here if a source file is not an external object
// and has an extension that is listed as an ignored file type.
// No message or diagnosis should be given.
+ this->ExtraSources.push_back(sf);
}
else if(sf->GetLanguage())
{
@@ -75,7 +82,7 @@ void cmGeneratorTarget::ClassifySources()
else
{
this->ExtraSources.push_back(sf);
- if(isObjLib && cmSystemTools::LowerCase(sf->GetExtension()) != "txt")
+ if(isObjLib && ext != "txt")
{
badObjLib.push_back(sf);
}
diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h
index 6319d82..3e50656 100644
--- a/Source/cmGeneratorTarget.h
+++ b/Source/cmGeneratorTarget.h
@@ -38,6 +38,7 @@ public:
std::vector<cmSourceFile*> ObjectSources;
std::vector<cmSourceFile*> ExternalObjects;
std::vector<cmSourceFile*> OSXContent;
+ std::vector<cmSourceFile*> IDLSources;
std::string ModuleDefinitionFile;
std::map<cmSourceFile const*, std::string> Objects;
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 054b86b..88ad178 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -253,8 +253,7 @@ void cmVisualStudio10TargetGenerator::Generate()
this->WritePathAndIncrementalLinkOptions();
this->WriteItemDefinitionGroups();
this->WriteCustomCommands();
- this->WriteObjSources();
- this->WriteCLSources();
+ this->WriteAllSources();
this->WriteDotNetReferences();
this->WriteWinRTReferences();
this->WriteProjectReferences();
@@ -795,107 +794,56 @@ WriteGroupSources(const char* name,
this->WriteString("</ItemGroup>\n", 1);
}
-void cmVisualStudio10TargetGenerator::WriteObjSources()
-{
- if(this->Target->GetType() > cmTarget::MODULE_LIBRARY)
- {
- return;
- }
- bool first = true;
- std::vector<cmSourceFile*>const & sources = this->Target->GetSourceFiles();
- for(std::vector<cmSourceFile*>::const_iterator source = sources.begin();
- source != sources.end(); ++source)
- {
- std::string ext =
- cmSystemTools::LowerCase((*source)->GetExtension());
- if(ext == "obj" || ext == "o")
- {
- if(first)
- {
- this->WriteString("<ItemGroup>\n", 1);
- first = false;
- }
- // If an object file is generated, then vs10
- // will use it in the build, and we have to list
- // it as None instead of Object
- if((*source)->GetPropertyAsBool("GENERATED"))
- {
- this->WriteString("<None Include=\"", 2);
- }
- // If it is not a generated object then we have
- // to use the Object type
- else
- {
- this->WriteString("<Object Include=\"", 2);
- }
- (*this->BuildFileStream ) << (*source)->GetFullPath() << "\" />\n";
- }
- }
- if(!first)
+void cmVisualStudio10TargetGenerator::WriteSource(
+ const char* tool, cmSourceFile* sf, bool end)
+{
+ std::string sourceFile = sf->GetFullPath();
+ // do not use a relative path here because it means that you
+ // can not use as long a path to the file.
+ this->ConvertToWindowsSlash(sourceFile);
+ this->WriteString("<", 2);
+ (*this->BuildFileStream ) << tool <<
+ " Include=\"" << sourceFile << (end? "\" />\n" : "\" ");
+}
+
+void cmVisualStudio10TargetGenerator::WriteSources(
+ const char* tool, std::vector<cmSourceFile*> const& sources)
+{
+ for(std::vector<cmSourceFile*>::const_iterator
+ si = sources.begin(); si != sources.end(); ++si)
{
- this->WriteString("</ItemGroup>\n", 1);
+ this->WriteSource(tool, *si);
}
}
-
-void cmVisualStudio10TargetGenerator::WriteCLSources()
+void cmVisualStudio10TargetGenerator::WriteAllSources()
{
if(this->Target->GetType() > cmTarget::UTILITY)
{
return;
}
this->WriteString("<ItemGroup>\n", 1);
- std::vector<cmSourceFile*>const& sources = this->Target->GetSourceFiles();
- for(std::vector<cmSourceFile*>::const_iterator source = sources.begin();
- source != sources.end(); ++source)
- {
- std::string ext = cmSystemTools::LowerCase((*source)->GetExtension());
- if((*source)->GetCustomCommand() || ext == "o" || ext == "obj")
- {
- continue;
- }
- // If it is not a custom command and it is not a pre-built obj file,
- // then add it as a source (c/c++/header/rc/idl) file
- bool header = (*source)->GetPropertyAsBool("HEADER_FILE_ONLY")
- || this->GlobalGenerator->IgnoreFile(ext.c_str());
- const char* lang = (*source)->GetLanguage();
- bool cl = lang && (strcmp(lang, "C") == 0 || strcmp(lang, "CXX") ==0);
- bool rc = lang && (strcmp(lang, "RC") == 0);
- bool idl = ext == "idl";
- std::string sourceFile = (*source)->GetFullPath();
- // do not use a relative path here because it means that you
- // can not use as long a path to the file.
- this->ConvertToWindowsSlash(sourceFile);
- // output the source file
- if(header)
- {
- this->WriteString("<ClInclude Include=\"", 2);
- }
- else if(cl)
- {
- this->WriteString("<ClCompile Include=\"", 2);
- }
- else if(rc)
- {
- this->WriteString("<ResourceCompile Include=\"", 2);
- }
- else if(idl)
- {
- this->WriteString("<Midl Include=\"", 2);
- }
- else
- {
- this->WriteString("<None Include=\"", 2);
- }
- (*this->BuildFileStream ) << sourceFile << "\"";
+
+ this->WriteSources("ClInclude", this->GeneratorTarget->HeaderSources);
+ this->WriteSources("Midl", this->GeneratorTarget->IDLSources);
+
+ for(std::vector<cmSourceFile*>::const_iterator
+ si = this->GeneratorTarget->ObjectSources.begin();
+ si != this->GeneratorTarget->ObjectSources.end(); ++si)
+ {
+ const char* lang = (*si)->GetLanguage();
+ bool cl = strcmp(lang, "C") == 0 || strcmp(lang, "CXX") == 0;
+ bool rc = strcmp(lang, "RC") == 0;
+ const char* tool = cl? "ClCompile" : (rc? "ResourceCompile" : "None");
+ this->WriteSource(tool, *si, false);
// ouput any flags specific to this source file
- if(!header && cl && this->OutputSourceSpecificFlags(*source))
+ if(cl && this->OutputSourceSpecificFlags(*si))
{
// if the source file has specific flags the tag
// is ended on a new line
this->WriteString("</ClCompile>\n", 2);
}
- else if(!header && rc && this->OutputSourceSpecificFlags(*source))
+ else if(rc && this->OutputSourceSpecificFlags(*si))
{
this->WriteString("</ResourceCompile>\n", 2);
}
@@ -905,6 +853,27 @@ void cmVisualStudio10TargetGenerator::WriteCLSources()
}
}
+ for(std::vector<cmSourceFile*>::const_iterator
+ si = this->GeneratorTarget->ExternalObjects.begin();
+ si != this->GeneratorTarget->ExternalObjects.end(); ++si)
+ {
+ // If an object file is generated, then vs10
+ // will use it in the build, and we have to list
+ // it as None instead of Object
+ if((*si)->GetPropertyAsBool("GENERATED"))
+ {
+ this->WriteSource("None", *si);
+ }
+ // If it is not a generated object then we have
+ // to use the Object type
+ else
+ {
+ this->WriteSource("Object", *si);
+ }
+ }
+
+ this->WriteSources("None", this->GeneratorTarget->ExtraSources);
+
// Add object library contents as external objects.
std::vector<std::string> objs;
this->GeneratorTarget->UseObjectLibraries(objs);
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index 64fb124..20a443b 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -47,10 +47,11 @@ private:
void WriteString(const char* line, int indentLevel);
void WriteProjectConfigurations();
void WriteProjectConfigurationValues();
- void WriteCLSources();
+ void WriteSource(const char* tool, cmSourceFile* sf, bool end = true);
+ void WriteSources(const char* tool, std::vector<cmSourceFile*> const&);
+ void WriteAllSources();
void WriteDotNetReferences();
void WriteWinRTReferences();
- void WriteObjSources();
void WritePathAndIncrementalLinkOptions();
void WriteItemDefinitionGroups();
bool ComputeClOptions();