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
This commit is contained in:
Michael Stürmer
2016-12-01 12:07:03 +01:00
committed by Brad King
parent 7b6f6d9e67
commit 66bd8a3cf2
2 changed files with 50 additions and 8 deletions

View File

@@ -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", this->GeneratorTarget->Target->SetProperty(
".vcxproj"); "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())

View File

@@ -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;