summaryrefslogtreecommitdiffstats
path: root/Source/cmVisualStudio10TargetGenerator.cxx
diff options
context:
space:
mode:
authorMichael Stürmer <michael.stuermer@schaeffler.com>2016-12-01 11:07:03 (GMT)
committerBrad King <brad.king@kitware.com>2016-12-01 15:36:43 (GMT)
commit66bd8a3cf2f401f5d37bb8eff6da711824adea91 (patch)
tree46114e2cef46f1082f2cba2a94ab563e9b328c66 /Source/cmVisualStudio10TargetGenerator.cxx
parent7b6f6d9e67431cdcdd9a8f1de92c66651768814c (diff)
downloadCMake-66bd8a3cf2f401f5d37bb8eff6da711824adea91.zip
CMake-66bd8a3cf2f401f5d37bb8eff6da711824adea91.tar.gz
CMake-66bd8a3cf2f401f5d37bb8eff6da711824adea91.tar.bz2
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
Diffstat (limited to 'Source/cmVisualStudio10TargetGenerator.cxx')
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx48
1 files changed, 41 insertions, 7 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 5b99007..22c3024 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -59,6 +59,16 @@ static bool cmVS10IsTargetsFile(std::string const& path)
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(
cmGeneratorTarget* target, cmGlobalVisualStudio10Generator* gg)
{
@@ -79,12 +89,16 @@ cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator(
&this->NsightTegraVersion[0], &this->NsightTegraVersion[1],
&this->NsightTegraVersion[2], &this->NsightTegraVersion[3]);
this->MSTools = !this->NsightTegra;
+ this->Managed = false;
this->TargetCompileAsWinRT = false;
this->BuildFileStream = 0;
this->IsMissingFiles = false;
this->DefaultArtifactDir =
this->LocalGenerator->GetCurrentBinaryDirectory() + std::string("/") +
this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
+ this->InSourceBuild =
+ (strcmp(this->Makefile->GetCurrentSourceDirectory(),
+ this->Makefile->GetCurrentBinaryDirectory()) == 0);
}
cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
@@ -101,7 +115,7 @@ cmVisualStudio10TargetGenerator::~cmVisualStudio10TargetGenerator()
return;
}
if (this->BuildFileStream->Close()) {
- this->GlobalGenerator->FileReplacedDuringGenerate(this->PathToVcxproj);
+ this->GlobalGenerator->FileReplacedDuringGenerate(this->PathToProjectFile);
}
delete this->BuildFileStream;
}
@@ -152,11 +166,20 @@ void cmVisualStudio10TargetGenerator::Generate()
this->GeneratorTarget->GetProperty("EXTERNAL_MSPROJECT")) {
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
this->GeneratorTarget->Target->SetProperty("GENERATOR_FILE_NAME",
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->ComputeClOptions()) {
return;
@@ -177,9 +200,9 @@ void cmVisualStudio10TargetGenerator::Generate()
std::string path = this->LocalGenerator->GetCurrentBinaryDirectory();
path += "/";
path += this->Name;
- path += ".vcxproj";
+ path += this->ProjectFileExtension;
this->BuildFileStream = new cmGeneratedFileStream(path.c_str());
- this->PathToVcxproj = path;
+ this->PathToProjectFile = path;
this->BuildFileStream->SetCopyIfDifferent(true);
// Write the encoding header into the file
@@ -871,7 +894,8 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
std::string path = this->LocalGenerator->GetCurrentBinaryDirectory();
path += "/";
path += this->Name;
- path += ".vcxproj.filters";
+ path += computeProjectFileExtension(this->GeneratorTarget);
+ path += ".filters";
cmGeneratedFileStream fout(path.c_str());
fout.SetCopyIfDifferent(true);
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();
return true;
}
@@ -2650,8 +2683,9 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
path = lg->GetCurrentBinaryDirectory();
path += "/";
path += dt->GetName();
- path += ".vcxproj";
+ path += computeProjectFileExtension(dt);
}
+ this->ConvertToWindowsSlash(path);
(*this->BuildFileStream) << cmVS10EscapeXML(path) << "\">\n";
this->WriteString("<Project>", 3);
(*this->BuildFileStream) << this->GlobalGenerator->GetGUID(name.c_str())