diff options
Diffstat (limited to 'Source/cmLocalVisualStudio10Generator.cxx')
-rw-r--r-- | Source/cmLocalVisualStudio10Generator.cxx | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/Source/cmLocalVisualStudio10Generator.cxx b/Source/cmLocalVisualStudio10Generator.cxx new file mode 100644 index 000000000..ace7adfa1 --- /dev/null +++ b/Source/cmLocalVisualStudio10Generator.cxx @@ -0,0 +1,124 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#include "cmLocalVisualStudio10Generator.h" +#include "cmTarget.h" +#include "cmMakefile.h" +#include "cmVisualStudio10TargetGenerator.h" +#include "cmGlobalVisualStudio10Generator.h" +#include <cm_expat.h> +#include "cmXMLParser.h" +class cmVS10XMLParser : public cmXMLParser +{ + public: + virtual void EndElement(const char* /* name */) + { + } + virtual void CharacterDataHandler(const char* data, int length) + { + if(this->DoGUID ) + { + this->GUID.assign(data+1, length-2); + this->DoGUID = false; + } + } + virtual void StartElement(const char* name, const char**) + { + // once the GUID is found do nothing + if(this->GUID.size()) + { + return; + } + if(strcmp("ProjectGUID", name) == 0 || strcmp("ProjectGuid", name) == 0) + { + this->DoGUID = true; + } + } + int InitializeParser() + { + this->DoGUID = false; + int ret = cmXMLParser::InitializeParser(); + if(ret == 0) + { + return ret; + } + // visual studio projects have a strange encoding, but it is + // really utf-8 + XML_SetEncoding(static_cast<XML_Parser>(this->Parser), "utf-8"); + return 1; + } + std::string GUID; + bool DoGUID; +}; + + +//---------------------------------------------------------------------------- +cmLocalVisualStudio10Generator::cmLocalVisualStudio10Generator(VSVersion v): + cmLocalVisualStudio7Generator(v) +{ +} + +cmLocalVisualStudio10Generator::~cmLocalVisualStudio10Generator() +{ +} + +void cmLocalVisualStudio10Generator::Generate() +{ + + cmTargets &tgts = this->Makefile->GetTargets(); + for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l) + { + if(static_cast<cmGlobalVisualStudioGenerator*>(this->GlobalGenerator) + ->TargetIsFortranOnly(l->second)) + { + this->CreateSingleVCProj(l->first.c_str(),l->second); + } + else + { + cmVisualStudio10TargetGenerator tg( + &l->second, static_cast<cmGlobalVisualStudio10Generator*>( + this->GetGlobalGenerator())); + tg.Generate(); + } + } + this->WriteStampFiles(); +} + + +void cmLocalVisualStudio10Generator +::ReadAndStoreExternalGUID(const char* name, + const char* path) +{ + cmVS10XMLParser parser; + parser.ParseFile(path); + + // if we can not find a GUID then create one + if(parser.GUID.empty()) + { + this->GlobalGenerator->CreateGUID(name); + return; + } + + std::string guidStoreName = name; + guidStoreName += "_GUID_CMAKE"; + // save the GUID in the cache + this->GlobalGenerator->GetCMakeInstance()-> + AddCacheEntry(guidStoreName.c_str(), + parser.GUID.c_str(), + "Stored GUID", + cmCacheManager::INTERNAL); +} + +//---------------------------------------------------------------------------- +const char* cmLocalVisualStudio10Generator::ReportErrorLabel() const +{ + return ":VCEnd"; +} |