From 289932ded083a9ba9a3bedd18db5312e5c6f742c Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 22 Jul 2022 12:50:12 -0400 Subject: VS: Revert "Write ZERO_CHECK.proj for VS19 and above" Revert commit a334f1b906 (VS: Write ZERO_CHECK.proj for VS19 and above, 2021-12-24, v3.24.0-rc1~607^2) and a supporting change from commit 7219988b00 (VS: Exclude ZERO_CHECK.proj from .sln for include_external_msproject, 2022-07-15, v3.24.0-rc4~1^2). The change was made to support `dotnet` tooling in addition to `msbuild`. However, not having `ZERO_CHECK` in the `.sln` breaks common interactive workflows. Revert the change for now. Later it can be re-introduced behind some kind of option that enables `dotnet` support. Fixes: #23726 Issue: #20227 --- Source/cmGlobalVisualStudio10Generator.cxx | 16 -- Source/cmGlobalVisualStudio10Generator.h | 4 - Source/cmVisualStudio10TargetGenerator.cxx | 255 ++++------------------------- Source/cmVisualStudio10TargetGenerator.h | 10 -- 4 files changed, 34 insertions(+), 251 deletions(-) diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index dec0858..29eeb5a 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -1286,22 +1286,6 @@ cmGlobalVisualStudio10Generator::GenerateBuildCommand( return makeCommands; } -bool cmGlobalVisualStudio10Generator::IsInSolution( - const cmGeneratorTarget* gt) const -{ - return gt->IsInBuildSystem() && - !(this->Version >= cmGlobalVisualStudioGenerator::VSVersion::VS16 && - gt->GetName() == CMAKE_CHECK_BUILD_SYSTEM_TARGET); -} - -bool cmGlobalVisualStudio10Generator::IsDepInSolution( - const std::string& targetName) const -{ - return !targetName.empty() && - !(this->Version >= cmGlobalVisualStudioGenerator::VSVersion::VS16 && - targetName == CMAKE_CHECK_BUILD_SYSTEM_TARGET); -} - bool cmGlobalVisualStudio10Generator::Find64BitTools(cmMakefile* mf) { if (this->DefaultPlatformToolset == "v100") { diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h index 12fd7a8..4977a84 100644 --- a/Source/cmGlobalVisualStudio10Generator.h +++ b/Source/cmGlobalVisualStudio10Generator.h @@ -118,10 +118,6 @@ public: return this->WindowsTargetPlatformVersion; } - bool IsInSolution(const cmGeneratorTarget* gt) const override; - - bool IsDepInSolution(const std::string& targetName) const override; - /** Return true if building for WindowsCE */ bool TargetsWindowsCE() const override { return this->SystemIsWindowsCE; } diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index c79331c..9f3d620 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -50,24 +50,6 @@ #include "cmValue.h" #include "cmVisualStudioGeneratorOptions.h" -namespace { -std::string getProjectFileExtension(VsProjectType projectType) -{ - switch (projectType) { - case VsProjectType::csproj: - return ".csproj"; - case VsProjectType::proj: - return ".proj"; - case VsProjectType::vcxproj: - return ".vcxproj"; - // Valid inputs shouldn't reach here. This default is needed so that all - // paths return value (C4715). - default: - return ""; - } -} -} - struct cmIDEFlagTable; static void ConvertToWindowsSlash(std::string& s); @@ -253,6 +235,31 @@ static bool cmVS10IsTargetsFile(std::string const& path) return cmSystemTools::Strucmp(ext.c_str(), ".targets") == 0; } +static VsProjectType computeProjectType(cmGeneratorTarget const* t) +{ + if (t->IsCSharpOnly()) { + return VsProjectType::csproj; + } + return VsProjectType::vcxproj; +} + +static std::string computeProjectFileExtension(VsProjectType projectType) +{ + switch (projectType) { + case VsProjectType::csproj: + return ".csproj"; + case VsProjectType::proj: + return ".proj"; + default: + return ".vcxproj"; + } +} + +static std::string computeProjectFileExtension(cmGeneratorTarget const* t) +{ + return computeProjectFileExtension(computeProjectType(t)); +} + cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator( cmGeneratorTarget* target, cmGlobalVisualStudio10Generator* gg) : GeneratorTarget(target) @@ -347,10 +354,10 @@ std::ostream& cmVisualStudio10TargetGenerator::Elem::WriteString( void cmVisualStudio10TargetGenerator::Generate() { - this->ProjectType = this->ComputeProjectType(this->GeneratorTarget); + this->ProjectType = computeProjectType(this->GeneratorTarget); this->Managed = this->ProjectType == VsProjectType::csproj; const std::string ProjectFileExtension = - getProjectFileExtension(this->ProjectType); + computeProjectFileExtension(this->ProjectType); if (this->ProjectType == VsProjectType::csproj && this->GeneratorTarget->GetType() == cmStateEnums::STATIC_LIBRARY) { @@ -411,12 +418,10 @@ void cmVisualStudio10TargetGenerator::Generate() char magic[] = { char(0xEF), char(0xBB), char(0xBF) }; BuildFileStream.write(magic, 3); - if (this->ProjectType == VsProjectType::proj) { - this->WriteZeroCheckProj(BuildFileStream); - } else if (this->ProjectType == VsProjectType::csproj && - this->GeneratorTarget->IsDotNetSdkTarget() && - this->GlobalGenerator->GetVersion() >= - cmGlobalVisualStudioGenerator::VSVersion::VS16) { + if (this->ProjectType == VsProjectType::csproj && + this->GeneratorTarget->IsDotNetSdkTarget() && + this->GlobalGenerator->GetVersion() >= + cmGlobalVisualStudioGenerator::VSVersion::VS16) { this->WriteSdkStyleProjectFile(BuildFileStream); } else { this->WriteClassicMsBuildProjectFile(BuildFileStream); @@ -961,45 +966,6 @@ void cmVisualStudio10TargetGenerator::WriteSdkStyleProjectFile( this->WriteProjectReferences(e0); } -void cmVisualStudio10TargetGenerator::WriteZeroCheckProj( - cmGeneratedFileStream& BuildFileStream) -{ - // ZERO_CHECK.proj is an XML file without any imports or targets. This is a - // ProjectReference for other targets and therefore, it needs to follow the - // ProjectReference protocol as documented here: - // https://github.com/dotnet/msbuild/blob/main/documentation/ProjectReference-Protocol.md - // - // We implement MSBuild target Build from WriteCustomCommand which calls - // WriteZeroCheckBuildTarget after setting up the command generator. MSBuild - // target Clean is a no-op as we do all the work for ZERO_CHECK on Build. - // MSBuild target GetTargetPath is needed and is no-op. - // MSBuild targets GetNativeManifest and GetCopyToOutputDirectoryItems are - // needed for MSBuild versions below 15.7 and are no-op. MSBuild target - // BeforeBuild is needed for supporting GLOBs. - BuildFileStream << "GlobalGenerator->Encoding() << "\"?>"; - { - Elem e0(BuildFileStream, "Project"); - e0.Attribute("DefaultTargets", "Build"); - e0.Attribute("ToolsVersion", this->GlobalGenerator->GetToolsVersion()); - e0.Attribute("xmlns", - "http://schemas.microsoft.com/developer/msbuild/2003"); - - this->WriteCustomCommands(e0); - - for (const char* targetName : - { "Clean", "GetTargetPath", "GetNativeManifest", - "GetCopyToOutputDirectoryItems" }) { - { - Elem e1(e0, "Target"); - e1.Attribute("Name", targetName); - } - } - - this->WriteZeroCheckBeforeBuildTarget(e0); - } -} - void cmVisualStudio10TargetGenerator::WriteCommonPropertyGroupGlobals(Elem& e1) { e1.Attribute("Label", "Globals"); @@ -1719,16 +1685,11 @@ void cmVisualStudio10TargetGenerator::WriteCustomRule( } } } - if (this->ProjectType == VsProjectType::proj) { - this->WriteZeroCheckBuildTarget(e0, command, source); - return; - } - cmLocalVisualStudio7Generator* lg = this->LocalGenerator; std::unique_ptr spe1; std::unique_ptr spe2; - if (this->ProjectType == VsProjectType::vcxproj) { + if (this->ProjectType != VsProjectType::csproj) { spe1 = cm::make_unique(e0, "ItemGroup"); spe2 = cm::make_unique(*spe1, "CustomBuild"); this->WriteSource(*spe2, source); @@ -1926,7 +1887,7 @@ void cmVisualStudio10TargetGenerator::WriteGroups() // Write out group file std::string path = cmStrCat( this->LocalGenerator->GetCurrentBinaryDirectory(), '/', this->Name, - this->ComputeProjectFileExtension(this->GeneratorTarget), ".filters"); + computeProjectFileExtension(this->GeneratorTarget), ".filters"); cmGeneratedFileStream fout(path); fout.SetCopyIfDifferent(true); char magic[] = { char(0xEF), char(0xBB), char(0xBF) }; @@ -3081,134 +3042,6 @@ void cmVisualStudio10TargetGenerator::OutputLinkIncremental( } } -void cmVisualStudio10TargetGenerator::WriteZeroCheckBuildTarget( - cmVisualStudio10TargetGenerator::Elem& e0, const cmCustomCommand& command, - const cmSourceFile* source) -{ - cmLocalVisualStudio7Generator* lg = this->LocalGenerator; - - Elem e1(e0, "Target"); - e1.Attribute("Name", "Build"); - - std::string noConfig{}; - cmCustomCommandGenerator ccg{ command, noConfig, lg, true }; - std::string comment = lg->ConstructComment(ccg); - comment = cmVS10EscapeComment(comment); - std::string script = lg->ConstructScript(ccg); - bool symbolic = false; - // input files for custom command - std::stringstream additional_inputs; - { - const char* sep = ""; - if (this->ProjectType == VsProjectType::proj) { - // List explicitly the path to primary input. - std::string sourceFullPath = source->GetFullPath(); - ConvertToWindowsSlash(sourceFullPath); - additional_inputs << sourceFullPath; - sep = ";"; - } - - // Avoid listing an input more than once. - std::set unique_inputs; - // The source is either implicitly an input or has been added above. - unique_inputs.insert(source->GetFullPath()); - - for (std::string const& d : ccg.GetDepends()) { - std::string dep; - if (lg->GetRealDependency(d, noConfig, dep)) { - if (!unique_inputs.insert(dep).second) { - // already listed - continue; - } - ConvertToWindowsSlash(dep); - additional_inputs << sep << dep; - sep = ";"; - if (!symbolic) { - if (cmSourceFile* sf = this->Makefile->GetSource( - dep, cmSourceFileLocationKind::Known)) { - symbolic = sf->GetPropertyAsBool("SYMBOLIC"); - } - } - } - } - } - // output files for custom command - std::stringstream outputs; - { - const char* sep = ""; - for (std::string const& o : ccg.GetOutputs()) { - std::string out = o; - ConvertToWindowsSlash(out); - outputs << sep << out; - sep = ";"; - if (!symbolic) { - if (cmSourceFile* sf = - this->Makefile->GetSource(o, cmSourceFileLocationKind::Known)) { - symbolic = sf->GetPropertyAsBool("SYMBOLIC"); - } - } - } - } - script += lg->FinishConstructScript(this->ProjectType); - - e1.Attribute("Inputs", cmVS10EscapeAttr(additional_inputs.str())); - e1.Attribute("Outputs", cmVS10EscapeAttr(outputs.str())); - - e1.SetHasElements(); - - if (!comment.empty()) { - Elem(e1, "Message").Attribute("Text", comment); - } - Elem(e1, "Exec").Attribute("Command", script); -} - -void cmVisualStudio10TargetGenerator::WriteZeroCheckBeforeBuildTarget( - cmVisualStudio10TargetGenerator::Elem& e0) -{ - const auto& commands = this->GeneratorTarget->GetPreBuildCommands(); - if (commands.empty()) { - return; - } - - { - Elem e1(e0, "Target"); - e1.Attribute("Name", "BeforeBuild"); - e1.Attribute("BeforeTargets", "Build"); - - cmLocalVisualStudio7Generator* lg = this->LocalGenerator; - std::string script; - const char* pre = ""; - std::string comment; - for (cmCustomCommand const& cc : commands) { - cmCustomCommandGenerator ccg(cc, std::string{}, lg); - if (!ccg.HasOnlyEmptyCommandLines()) { - comment += pre; - comment += lg->ConstructComment(ccg); - script += pre; - pre = "\n"; - script += lg->ConstructScript(ccg); - } - } - - if (script.empty()) { - return; - } - - script += lg->FinishConstructScript(this->ProjectType); - comment = cmVS10EscapeComment(comment); - std::string strippedComment = comment; - strippedComment.erase( - std::remove(strippedComment.begin(), strippedComment.end(), '\t'), - strippedComment.end()); - - e1.SetHasElements(); - if (!comment.empty() && !strippedComment.empty()) { - Elem(e1, "Message").Attribute("Text", comment); - } - Elem(e1, "Exec").Attribute("Command", script); - } -} - std::vector cmVisualStudio10TargetGenerator::GetIncludes( std::string const& config, std::string const& lang) const { @@ -4720,7 +4553,7 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences(Elem& e0) path = *p; } else { path = cmStrCat(lg->GetCurrentBinaryDirectory(), '/', dt->GetName(), - this->ComputeProjectFileExtension(dt)); + computeProjectFileExtension(dt)); } ConvertToWindowsSlash(path); Elem e2(e1, "ProjectReference"); @@ -5574,26 +5407,6 @@ std::string cmVisualStudio10TargetGenerator::GetCMakeFilePath( return path; } -std::string cmVisualStudio10TargetGenerator::ComputeProjectFileExtension( - cmGeneratorTarget const* t) const -{ - return getProjectFileExtension(this->ComputeProjectType(t)); -} - -VsProjectType cmVisualStudio10TargetGenerator::ComputeProjectType( - cmGeneratorTarget const* t) const -{ - if (this->GlobalGenerator->GetVersion() >= - cmGlobalVisualStudioGenerator::VSVersion::VS16 && - t->GetName() == CMAKE_CHECK_BUILD_SYSTEM_TARGET) { - return VsProjectType::proj; - } - if (t->IsCSharpOnly()) { - return VsProjectType::csproj; - } - return VsProjectType::vcxproj; -} - void cmVisualStudio10TargetGenerator::WriteStdOutEncodingUtf8(Elem& e1) { if (this->GlobalGenerator->IsUtf8EncodingSupported()) { diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 7a0b8da..8d777a3 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -264,13 +264,6 @@ private: void WriteClassicMsBuildProjectFile(cmGeneratedFileStream& BuildFileStream); void WriteSdkStyleProjectFile(cmGeneratedFileStream& BuildFileStream); - void WriteZeroCheckProj(cmGeneratedFileStream& BuildFileStream); - void WriteZeroCheckBuildTarget(cmVisualStudio10TargetGenerator::Elem& e0, - const cmCustomCommand& command, - const cmSourceFile* source); - void WriteZeroCheckBeforeBuildTarget( - cmVisualStudio10TargetGenerator::Elem& e0); - void WriteCommonPropertyGroupGlobals( cmVisualStudio10TargetGenerator::Elem& e1); @@ -282,7 +275,4 @@ private: void ParseSettingsProperty(const std::string& settingsPropertyValue, ConfigToSettings& toolSettings); std::string GetCMakeFilePath(const char* name) const; - - std::string ComputeProjectFileExtension(cmGeneratorTarget const* t) const; - VsProjectType ComputeProjectType(cmGeneratorTarget const* t) const; }; -- cgit v0.12