/* 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 #include #include "cmGlobalGenerator.h" #include "cmGlobalVisualStudio10Generator.h" #include "cmGlobalVisualStudioGenerator.h" #include "cmStateTypes.h" #include "cmStringAlgorithms.h" #include "cmVisualStudio10TargetGenerator.h" #include "cmXMLParser.h" #include "cmake.h" class cmGeneratorTarget; class cmVS10XMLParser : public cmXMLParser { public: void EndElement(const std::string& /* name */) override {} void CharacterDataHandler(const char* data, int length) override { 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; } } void StartElement(const std::string& name, const char**) override { // once the GUID is found do nothing if (!this->GUID.empty()) { return; } if (name == "ProjectGUID"_s || name == "ProjectGuid"_s) { this->DoGUID = true; } } int InitializeParser() override { 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() = default; void cmLocalVisualStudio10Generator::GenerateTarget(cmGeneratorTarget* target) { if (static_cast(this->GlobalGenerator) ->TargetIsFortranOnly(target)) { this->cmLocalVisualStudio7Generator::GenerateTarget(target); } else { cmVisualStudio10TargetGenerator tg( target, static_cast( this->GetGlobalGenerator())); tg.Generate(); } } 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 = cmStrCat(name, "_GUID_CMAKE"); // save the GUID in the cache this->GlobalGenerator->GetCMakeInstance()->AddCacheEntry( guidStoreName, parser.GUID, "Stored GUID", cmStateEnums::INTERNAL); } const char* cmLocalVisualStudio10Generator::ReportErrorLabel() const { return ":VCEnd"; }