Explorar o código

VS: Handle AppxManifest sources explicitly in generator

Teach cmGeneratorTarget to extract .appxmanifest sources separately.
Teach cmVisualStudio10TargetGenerator to write them with the
AppxManifest tool in .vcxproj files.  This will allow us to detect
whether the project provides an application manfiest explicitly.
Gilles Khouzam %!s(int64=11) %!d(string=hai) anos
pai
achega
23782171ad

+ 14 - 0
Source/cmGeneratorTarget.cxx

@@ -53,6 +53,7 @@ struct ExternalObjectsTag {};
 struct IDLSourcesTag {};
 struct ResxTag {};
 struct ModuleDefinitionFileTag {};
+struct AppManifestTag{};
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1310
 template<typename Tag, typename OtherTag>
@@ -195,6 +196,10 @@ struct TagVisitor
       {
       DoAccept<IsSameTag<Tag, ResxTag>::Result>::Do(this->Data, sf);
       }
+    else if (ext == "appxmanifest")
+      {
+      DoAccept<IsSameTag<Tag, AppManifestTag>::Result>::Do(this->Data, sf);
+      }
     else if(this->Header.find(sf->GetFullPath().c_str()))
       {
       DoAccept<IsSameTag<Tag, HeaderSourcesTag>::Result>::Do(this->Data, sf);
@@ -428,6 +433,15 @@ void cmGeneratorTarget
   srcs = data.ResxSources;
 }
 
+//----------------------------------------------------------------------------
+void
+cmGeneratorTarget
+::GetAppManifest(std::vector<cmSourceFile const*>& data,
+                 const std::string& config) const
+{
+  IMPLEMENT_VISIT(AppManifest);
+}
+
 //----------------------------------------------------------------------------
 bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir,
                                               const std::string& config) const

+ 2 - 0
Source/cmGeneratorTarget.h

@@ -54,6 +54,8 @@ public:
                          const std::string& config) const;
   void GetExpectedResxHeaders(std::set<std::string>&,
                               const std::string& config) const;
+  void GetAppManifest(std::vector<cmSourceFile const*>&,
+                      const std::string& config) const;
 
   void ComputeObjectMapping();
 

+ 5 - 5
Source/cmVisualStudio10TargetGenerator.cxx

@@ -1022,11 +1022,7 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(cmSourceFile const* sf)
   std::string tool = "None";
   std::string shaderType;
   std::string const& ext = sf->GetExtension();
-  if(ext == "appxmanifest")
-    {
-    tool = "AppxManifest";
-    }
-  else if(ext == "hlsl")
+  if(ext == "hlsl")
     {
     tool = "FXCompile";
     // Figure out the type of shader compiler to use.
@@ -1221,6 +1217,10 @@ void cmVisualStudio10TargetGenerator::WriteAllSources()
       }
     }
 
+  std::vector<cmSourceFile const*> manifestSources;
+  this->GeneratorTarget->GetAppManifest(manifestSources, "");
+  this->WriteSources("AppxManifest", manifestSources);
+
   std::vector<cmSourceFile const*> externalObjects;
   this->GeneratorTarget->GetExternalObjects(externalObjects, "");
   for(std::vector<cmSourceFile const*>::iterator