/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmLocalVisualStudio10Generator.h" #include "cmGeneratorTarget.h" #include "cmGlobalVisualStudio10Generator.h" #include "cmMakefile.h" #include "cmVisualStudio10TargetGenerator.h" #include "cmXMLParser.h" #include "cm_expat.h" class cmVS10XMLParser : public cmXMLParser { public: virtual void EndElement(const std::string& /* name */) {} virtual void CharacterDataHandler(const char* data, int length) { if (this->DoGUID) { if (data[0] == '{') { // remove surrounding curly brackets this->GUID.assign(data + 1, length - 2); } else { this->GUID.assign(data, length); } this->DoGUID = false; } } virtual void StartElement(const std::string& name, const char**) { // once the GUID is found do nothing if (!this->GUID.empty()) { return; } if ("ProjectGUID" == name || "ProjectGuid" == name) { 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(this->Parser), "utf-8"); return 1; } std::string GUID; bool DoGUID; }; cmLocalVisualStudio10Generator::cmLocalVisualStudio10Generator( cmGlobalGenerator* gg, cmMakefile* mf) : cmLocalVisualStudio7Generator(gg, mf) { } cmLocalVisualStudio10Generator::~cmLocalVisualStudio10Generator() { } void cmLocalVisualStudio10Generator::Generate() { const std::vector& tgts = this->GetGeneratorTargets(); for (std::vector::const_iterator l = tgts.begin(); l != tgts.end(); ++l) { if ((*l)->GetType() == cmStateEnums::INTERFACE_LIBRARY) { continue; } if (static_cast(this->GlobalGenerator) ->TargetIsFortranOnly(*l)) { this->CreateSingleVCProj((*l)->GetName().c_str(), *l); } else { cmVisualStudio10TargetGenerator tg( *l, static_cast( this->GetGlobalGenerator())); tg.Generate(); } } this->WriteStampFiles(); } void cmLocalVisualStudio10Generator::ReadAndStoreExternalGUID( const std::string& name, const char* path) { cmVS10XMLParser parser; parser.ParseFile(path); // if we can not find a GUID then we will generate one later if (parser.GUID.empty()) { 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", cmStateEnums::INTERNAL); } const char* cmLocalVisualStudio10Generator::ReportErrorLabel() const { return ":VCEnd"; }