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