summaryrefslogtreecommitdiffstats
path: root/Source/cmLocalVisualStudioGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2006-07-11 15:41:38 (GMT)
committerBrad King <brad.king@kitware.com>2006-07-11 15:41:38 (GMT)
commit9bf5af6e32570195b06df594c1cb07f8c7a6a83e (patch)
treead72b8722793ae974c26b9b2138547f3cab62aae /Source/cmLocalVisualStudioGenerator.cxx
parentc05b8fb993a4e92fded0d735a66063bb8b265630 (diff)
downloadCMake-9bf5af6e32570195b06df594c1cb07f8c7a6a83e.zip
CMake-9bf5af6e32570195b06df594c1cb07f8c7a6a83e.tar.gz
CMake-9bf5af6e32570195b06df594c1cb07f8c7a6a83e.tar.bz2
ENH: Moved unique object file name computation from cmLocalUnixMakefileGenerator3 up to cmLocalGenerator for use by all generators. Created cmLocalVisualStudioGenerator as superclass for all VS generators. Implemented on-demand unique object file name computation for VS 7 generator to avoid slow compiles when all sources are in subdirectories.
Diffstat (limited to 'Source/cmLocalVisualStudioGenerator.cxx')
-rw-r--r--Source/cmLocalVisualStudioGenerator.cxx89
1 files changed, 89 insertions, 0 deletions
diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx
new file mode 100644
index 0000000..344fcc6
--- /dev/null
+++ b/Source/cmLocalVisualStudioGenerator.cxx
@@ -0,0 +1,89 @@
+/*=========================================================================
+
+ Program: CMake - Cross-Platform Makefile Generator
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
+ See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmLocalVisualStudioGenerator.h"
+
+#include "cmMakefile.h"
+#include "cmSourceFile.h"
+#include "cmSystemTools.h"
+
+//----------------------------------------------------------------------------
+cmLocalVisualStudioGenerator::cmLocalVisualStudioGenerator()
+{
+}
+
+//----------------------------------------------------------------------------
+cmLocalVisualStudioGenerator::~cmLocalVisualStudioGenerator()
+{
+}
+
+//----------------------------------------------------------------------------
+void
+cmLocalVisualStudioGenerator
+::ComputeObjectNameRequirements(std::vector<cmSourceGroup> const& sourceGroups)
+{
+ // Clear the current set of requirements.
+ this->NeedObjectName.clear();
+
+ // Count the number of object files with each name.
+ std::map<cmStdString, int> objectNameCounts;
+ for(unsigned int i = 0; i < sourceGroups.size(); ++i)
+ {
+ cmSourceGroup sg = sourceGroups[i];
+ std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles();
+ for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin();
+ s != srcs.end(); ++s)
+ {
+ const cmSourceFile& sf = *(*s);
+ if(!sf.GetCustomCommand() &&
+ !sf.GetPropertyAsBool("HEADER_FILE_ONLY") &&
+ !sf.GetPropertyAsBool("EXTERNAL_OBJECT"))
+ {
+ std::string objectName =
+ cmSystemTools::GetFilenameWithoutLastExtension(
+ sf.GetFullPath().c_str());
+ objectName += ".obj";
+ objectNameCounts[objectName] += 1;
+ }
+ }
+ }
+
+ // For all source files producing duplicate names we need unique
+ // object name computation.
+ for(unsigned int i = 0; i < sourceGroups.size(); ++i)
+ {
+ cmSourceGroup sg = sourceGroups[i];
+ std::vector<const cmSourceFile*> const& srcs = sg.GetSourceFiles();
+ for(std::vector<const cmSourceFile*>::const_iterator s = srcs.begin();
+ s != srcs.end(); ++s)
+ {
+ const cmSourceFile* sf = *s;
+ if(!sf->GetCustomCommand() &&
+ !sf->GetPropertyAsBool("HEADER_FILE_ONLY") &&
+ !sf->GetPropertyAsBool("EXTERNAL_OBJECT"))
+ {
+ std::string objectName =
+ cmSystemTools::GetFilenameWithoutLastExtension(
+ sf->GetFullPath().c_str());
+ objectName += ".obj";
+ if(objectNameCounts[objectName] > 1)
+ {
+ this->NeedObjectName.insert(sf);
+ }
+ }
+ }
+ }
+}