Просмотр исходного кода

cmVisualStudio10TargetGenerator: Prepare to handle C# projects

Generalize some internal infrastructure to prepare for generating
either `.vcxproj` or `.csproj` files.

- Add member string for project file extension
- Add member enum for project type
- Add member flag for in-source build
- Add member flag for managed build
- Rename PathToVcxproj to PathToProjectFile
Michael Stürmer 9 лет назад
Родитель
Сommit
66bd8a3cf2
2 измененных файлов с 50 добавлено и 8 удалено
  1. 41 7
      Source/cmVisualStudio10TargetGenerator.cxx
  2. 9 1
      Source/cmVisualStudio10TargetGenerator.h

+ 41 - 7
Source/cmVisualStudio10TargetGenerator.cxx

@@ -59,6 +59,16 @@ static bool cmVS10IsTargetsFile(std::string const& path)
   return cmSystemTools::Strucmp(ext.c_str(), ".targets") == 0;
   return cmSystemTools::Strucmp(ext.c_str(), ".targets") == 0;
 }
 }
 
 
+static std::string computeProjectFileExtension(cmGeneratorTarget const* t)
+{
+  std::string res;
+  res = ".vcxproj";
+  if (cmGlobalVisualStudioGenerator::TargetIsCSharpOnly(t)) {
+    res = ".csproj";
+  }
+  return res;
+}
+
 cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator(
 cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator(
   cmGeneratorTarget* target, cmGlobalVisualStudio10Generator* gg)
   cmGeneratorTarget* target, cmGlobalVisualStudio10Generator* gg)
 {
 {
@@ -79,12 +89,16 @@ cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator(
          &this->NsightTegraVersion[0], &this->NsightTegraVersion[1],
          &this->NsightTegraVersion[0], &this->NsightTegraVersion[1],
          &this->NsightTegraVersion[2], &this->NsightTegraVersion[3]);
          &this->NsightTegraVersion[2], &this->NsightTegraVersion[3]);
   this->MSTools = !this->NsightTegra;
   this->MSTools = !this->NsightTegra;
+  this->Managed = false;
   this->TargetCompileAsWinRT = false;
   this->TargetCompileAsWinRT = false;
   this->BuildFileStream = 0;
   this->BuildFileStream = 0;
   this->IsMissingFiles = false;
   this->IsMissingFiles = false;
   this->DefaultArtifactDir =
   this->DefaultArtifactDir =
     this->LocalGenerator->GetCurrentBinaryDirectory() + std::string("/") +
     this->LocalGenerator->GetCurrentBinaryDirectory() + std::string("/") +
     this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
     this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
+  this->InSourceBuild =
+    (strcmp(this->Makefile->GetCurrentSourceDirectory(),
+            this->Makefile->GetCurrentBinaryDirectory()) == 0);
 }
 }
 
 
 cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
 cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
@@ -101,7 +115,7 @@ cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
     return;
     return;
   }
   }
   if (this->BuildFileStream->Close()) {
   if (this->BuildFileStream->Close()) {
-    this->GlobalGenerator->FileReplacedDuringGenerate(this->PathToVcxproj);
+    this->GlobalGenerator->FileReplacedDuringGenerate(this->PathToProjectFile);
   }
   }
   delete this->BuildFileStream;
   delete this->BuildFileStream;
 }
 }
@@ -152,11 +166,20 @@ void cmVisualStudio10TargetGenerator::Generate()
       this->GeneratorTarget->GetProperty("EXTERNAL_MSPROJECT")) {
       this->GeneratorTarget->GetProperty("EXTERNAL_MSPROJECT")) {
     return;
     return;
   }
   }
+  this->ProjectFileExtension =
+    computeProjectFileExtension(this->GeneratorTarget);
+  if (this->ProjectFileExtension == ".vcxproj") {
+    this->ProjectType = vcxproj;
+    this->Managed = false;
+  } else if (this->ProjectFileExtension == ".csproj") {
+    this->ProjectType = csproj;
+    this->Managed = true;
+  }
   // Tell the global generator the name of the project file
   // Tell the global generator the name of the project file
   this->GeneratorTarget->Target->SetProperty("GENERATOR_FILE_NAME",
   this->GeneratorTarget->Target->SetProperty("GENERATOR_FILE_NAME",
                                              this->Name.c_str());
                                              this->Name.c_str());
-  this->GeneratorTarget->Target->SetProperty("GENERATOR_FILE_NAME_EXT",
-                                             ".vcxproj");
+  this->GeneratorTarget->Target->SetProperty(
+    "GENERATOR_FILE_NAME_EXT", this->ProjectFileExtension.c_str());
   if (this->GeneratorTarget->GetType() <= cmStateEnums::OBJECT_LIBRARY) {
   if (this->GeneratorTarget->GetType() <= cmStateEnums::OBJECT_LIBRARY) {
     if (!this->ComputeClOptions()) {
     if (!this->ComputeClOptions()) {
       return;
       return;
@@ -177,9 +200,9 @@ void cmVisualStudio10TargetGenerator::Generate()
   std::string path = this->LocalGenerator->GetCurrentBinaryDirectory();
   std::string path = this->LocalGenerator->GetCurrentBinaryDirectory();
   path += "/";
   path += "/";
   path += this->Name;
   path += this->Name;
-  path += ".vcxproj";
+  path += this->ProjectFileExtension;
   this->BuildFileStream = new cmGeneratedFileStream(path.c_str());
   this->BuildFileStream = new cmGeneratedFileStream(path.c_str());
-  this->PathToVcxproj = path;
+  this->PathToProjectFile = path;
   this->BuildFileStream->SetCopyIfDifferent(true);
   this->BuildFileStream->SetCopyIfDifferent(true);
 
 
   // Write the encoding header into the file
   // Write the encoding header into the file
@@ -871,7 +894,8 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
   std::string path = this->LocalGenerator->GetCurrentBinaryDirectory();
   std::string path = this->LocalGenerator->GetCurrentBinaryDirectory();
   path += "/";
   path += "/";
   path += this->Name;
   path += this->Name;
-  path += ".vcxproj.filters";
+  path += computeProjectFileExtension(this->GeneratorTarget);
+  path += ".filters";
   cmGeneratedFileStream fout(path.c_str());
   cmGeneratedFileStream fout(path.c_str());
   fout.SetCopyIfDifferent(true);
   fout.SetCopyIfDifferent(true);
   char magic[] = { char(0xEF), char(0xBB), char(0xBF) };
   char magic[] = { char(0xEF), char(0xBB), char(0xBF) };
@@ -1739,6 +1763,15 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
     }
     }
   }
   }
 
 
+  if (csproj != this->ProjectType && clOptions.IsManaged()) {
+    this->Managed = true;
+    std::string managedType = clOptions.GetFlag("CompileAsManaged");
+    if (managedType == "Safe") {
+      // force empty calling convention if safe clr is used
+      clOptions.AddFlag("CallingConvention", "");
+    }
+  }
+
   this->ClOptions[configName] = pOptions.release();
   this->ClOptions[configName] = pOptions.release();
   return true;
   return true;
 }
 }
@@ -2650,8 +2683,9 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
       path = lg->GetCurrentBinaryDirectory();
       path = lg->GetCurrentBinaryDirectory();
       path += "/";
       path += "/";
       path += dt->GetName();
       path += dt->GetName();
-      path += ".vcxproj";
+      path += computeProjectFileExtension(dt);
     }
     }
+    this->ConvertToWindowsSlash(path);
     (*this->BuildFileStream) << cmVS10EscapeXML(path) << "\">\n";
     (*this->BuildFileStream) << cmVS10EscapeXML(path) << "\">\n";
     this->WriteString("<Project>", 3);
     this->WriteString("<Project>", 3);
     (*this->BuildFileStream) << this->GlobalGenerator->GetGUID(name.c_str())
     (*this->BuildFileStream) << this->GlobalGenerator->GetGUID(name.c_str())

+ 9 - 1
Source/cmVisualStudio10TargetGenerator.h

@@ -145,7 +145,14 @@ private:
   OptionsMap RcOptions;
   OptionsMap RcOptions;
   OptionsMap MasmOptions;
   OptionsMap MasmOptions;
   OptionsMap LinkOptions;
   OptionsMap LinkOptions;
-  std::string PathToVcxproj;
+  std::string PathToProjectFile;
+  std::string ProjectFileExtension;
+  enum VsProjectType
+  {
+    vcxproj,
+    csproj
+  } ProjectType;
+  bool InSourceBuild;
   std::vector<std::string> Configurations;
   std::vector<std::string> Configurations;
   std::vector<TargetsFileAndConfigs> TargetsFileAndConfigsVec;
   std::vector<TargetsFileAndConfigs> TargetsFileAndConfigsVec;
   cmGeneratorTarget* GeneratorTarget;
   cmGeneratorTarget* GeneratorTarget;
@@ -154,6 +161,7 @@ private:
   std::string GUID;
   std::string GUID;
   std::string Name;
   std::string Name;
   bool MSTools;
   bool MSTools;
+  bool Managed;
   bool NsightTegra;
   bool NsightTegra;
   int NsightTegraVersion[4];
   int NsightTegraVersion[4];
   bool TargetCompileAsWinRT;
   bool TargetCompileAsWinRT;