1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #include "cmLocalVisualStudio10Generator.h"
4 
5 #include <cmext/algorithm>
6 
7 #include <cm3p/expat.h>
8 
9 #include "cmAlgorithms.h"
10 #include "cmGeneratorTarget.h"
11 #include "cmGlobalVisualStudio10Generator.h"
12 #include "cmMakefile.h"
13 #include "cmVisualStudio10TargetGenerator.h"
14 #include "cmXMLParser.h"
15 #include "cmake.h"
16 
17 class cmVS10XMLParser : public cmXMLParser
18 {
19 public:
EndElement(const std::string &)20   virtual void EndElement(const std::string& /* name */) {}
CharacterDataHandler(const char * data,int length)21   virtual void CharacterDataHandler(const char* data, int length)
22   {
23     if (this->DoGUID) {
24       if (data[0] == '{') {
25         // remove surrounding curly brackets
26         this->GUID.assign(data + 1, length - 2);
27       } else {
28         this->GUID.assign(data, length);
29       }
30       this->DoGUID = false;
31     }
32   }
StartElement(const std::string & name,const char **)33   virtual void StartElement(const std::string& name, const char**)
34   {
35     // once the GUID is found do nothing
36     if (!this->GUID.empty()) {
37       return;
38     }
39     if ("ProjectGUID" == name || "ProjectGuid" == name) {
40       this->DoGUID = true;
41     }
42   }
InitializeParser()43   int InitializeParser()
44   {
45     this->DoGUID = false;
46     int ret = cmXMLParser::InitializeParser();
47     if (ret == 0) {
48       return ret;
49     }
50     // visual studio projects have a strange encoding, but it is
51     // really utf-8
52     XML_SetEncoding(static_cast<XML_Parser>(this->Parser), "utf-8");
53     return 1;
54   }
55   std::string GUID;
56   bool DoGUID;
57 };
58 
cmLocalVisualStudio10Generator(cmGlobalGenerator * gg,cmMakefile * mf)59 cmLocalVisualStudio10Generator::cmLocalVisualStudio10Generator(
60   cmGlobalGenerator* gg, cmMakefile* mf)
61   : cmLocalVisualStudio7Generator(gg, mf)
62 {
63 }
64 
~cmLocalVisualStudio10Generator()65 cmLocalVisualStudio10Generator::~cmLocalVisualStudio10Generator()
66 {
67 }
68 
GenerateTarget(cmGeneratorTarget * target)69 void cmLocalVisualStudio10Generator::GenerateTarget(cmGeneratorTarget* target)
70 {
71   if (static_cast<cmGlobalVisualStudioGenerator*>(this->GlobalGenerator)
72         ->TargetIsFortranOnly(target)) {
73     this->cmLocalVisualStudio7Generator::GenerateTarget(target);
74   } else {
75     cmVisualStudio10TargetGenerator tg(
76       target,
77       static_cast<cmGlobalVisualStudio10Generator*>(
78         this->GetGlobalGenerator()));
79     tg.Generate();
80   }
81 }
82 
ReadAndStoreExternalGUID(const std::string & name,const char * path)83 void cmLocalVisualStudio10Generator::ReadAndStoreExternalGUID(
84   const std::string& name, const char* path)
85 {
86   cmVS10XMLParser parser;
87   parser.ParseFile(path);
88 
89   // if we can not find a GUID then we will generate one later
90   if (parser.GUID.empty()) {
91     return;
92   }
93 
94   std::string guidStoreName = cmStrCat(name, "_GUID_CMAKE");
95   // save the GUID in the cache
96   this->GlobalGenerator->GetCMakeInstance()->AddCacheEntry(
97     guidStoreName, parser.GUID.c_str(), "Stored GUID", cmStateEnums::INTERNAL);
98 }
99 
ReportErrorLabel() const100 const char* cmLocalVisualStudio10Generator::ReportErrorLabel() const
101 {
102   return ":VCEnd";
103 }
104