From 0721f9bf0fefb159be48c23847e5654e0b31f0cb Mon Sep 17 00:00:00 2001 From: Calum Robinson Date: Wed, 26 Jun 2024 08:41:17 +0100 Subject: VS: Add VS_FRAMEWORK_REFERENCES Fixes: #26082 --- Auxiliary/vim/syntax/cmake.vim | 1 + Help/manual/cmake-properties.7.rst | 1 + Help/prop_tgt/VS_FRAMEWORK_REFERENCES.rst | 12 +++++++++++ Help/release/dev/vs-framework-references.rst | 5 +++++ Source/cmVisualStudio10TargetGenerator.cxx | 16 +++++++++++++++ Source/cmVisualStudio10TargetGenerator.h | 1 + Tests/RunCMake/VS10Project/RunCMakeTest.cmake | 1 + .../VS10Project/VsFrameworkReference-check.cmake | 24 ++++++++++++++++++++++ .../VS10Project/VsFrameworkReference.cmake | 8 ++++++++ 9 files changed, 69 insertions(+) create mode 100644 Help/prop_tgt/VS_FRAMEWORK_REFERENCES.rst create mode 100644 Help/release/dev/vs-framework-references.rst create mode 100644 Tests/RunCMake/VS10Project/VsFrameworkReference-check.cmake create mode 100644 Tests/RunCMake/VS10Project/VsFrameworkReference.cmake diff --git a/Auxiliary/vim/syntax/cmake.vim b/Auxiliary/vim/syntax/cmake.vim index 5d412c2..f9efd9e 100644 --- a/Auxiliary/vim/syntax/cmake.vim +++ b/Auxiliary/vim/syntax/cmake.vim @@ -416,6 +416,7 @@ syn keyword cmakeProperty contained \ VS_DOTNET_STARTUP_OBJECT \ VS_DOTNET_TARGET_FRAMEWORK_VERSION \ VS_DPI_AWARE + \ VS_FRAMEWORK_REFERENCES \ VS_GLOBAL_KEYWORD \ VS_GLOBAL_PROJECT_TYPES \ VS_GLOBAL_ROOTNAMESPACE diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index 673bc7c..fea661a 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -430,6 +430,7 @@ Properties on Targets /prop_tgt/VS_DOTNET_STARTUP_OBJECT /prop_tgt/VS_DOTNET_TARGET_FRAMEWORK_VERSION /prop_tgt/VS_DPI_AWARE + /prop_tgt/VS_FRAMEWORK_REFERENCES /prop_tgt/VS_GLOBAL_KEYWORD /prop_tgt/VS_GLOBAL_PROJECT_TYPES /prop_tgt/VS_GLOBAL_ROOTNAMESPACE diff --git a/Help/prop_tgt/VS_FRAMEWORK_REFERENCES.rst b/Help/prop_tgt/VS_FRAMEWORK_REFERENCES.rst new file mode 100644 index 0000000..925ac68 --- /dev/null +++ b/Help/prop_tgt/VS_FRAMEWORK_REFERENCES.rst @@ -0,0 +1,12 @@ +VS_FRAMEWORK_REFERENCES +----------------------- + +.. versionadded:: 3.31 + +Visual Studio framework references. +Specify a :ref:`semicolon-separated list ` of framework references +to be added to a generated Visual Studio project. For example: + +* "Microsoft.WindowsDesktop.App.WPF" for WPF applications +* "Microsoft.WindowsDesktop.App.WindowsForms" for WinForms applications +* "Microsoft.WindowsDesktop.App" for applications using both frameworks diff --git a/Help/release/dev/vs-framework-references.rst b/Help/release/dev/vs-framework-references.rst new file mode 100644 index 0000000..1f50b50 --- /dev/null +++ b/Help/release/dev/vs-framework-references.rst @@ -0,0 +1,5 @@ +vs-framework-references +----------------------- + +* The :prop_tgt:`VS_FRAMEWORK_REFERENCES` target property was added + to tell :ref:`Visual Studio Generators` to add framework references. diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 0fb8bae..eb14e24 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -813,6 +813,7 @@ void cmVisualStudio10TargetGenerator::WriteClassicMsBuildProjectFile( this->WriteCustomCommands(e0); this->WriteAllSources(e0); this->WriteDotNetReferences(e0); + this->WriteFrameworkReferences(e0); this->WritePackageReferences(e0); this->WriteImports(e0); this->WriteEmbeddedResourceGroup(e0); @@ -1187,6 +1188,21 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReference( this->WriteDotNetReferenceCustomTags(e2, ref); } +void cmVisualStudio10TargetGenerator::WriteFrameworkReferences(Elem& e0) +{ + cmList references; + if (cmValue vsFrameworkReferences = + this->GeneratorTarget->GetProperty("VS_FRAMEWORK_REFERENCES")) { + references.assign(*vsFrameworkReferences); + } + + Elem e1(e0, "ItemGroup"); + for (auto const& ref : references) { + Elem e2(e1, "FrameworkReference"); + e2.Attribute("Include", ref); + } +} + void cmVisualStudio10TargetGenerator::WriteImports(Elem& e0) { cmValue imports = diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 056f426..53eb1af 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -91,6 +91,7 @@ private: void WriteDotNetReference(Elem& e1, std::string const& ref, std::string const& hint, std::string const& config); + void WriteFrameworkReferences(Elem& e0); void WriteDotNetDocumentationFile(Elem& e0); void WriteImports(Elem& e0); void WriteDotNetReferenceCustomTags(Elem& e2, std::string const& ref); diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake index e0d74cf..85fefbf 100644 --- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake +++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake @@ -98,6 +98,7 @@ run_cmake(DebugInformationFormat) run_cmake(VsCLREmpty) run_cmake(VsCLRPure) run_cmake(VsCLRSafe) +run_cmake(VsFrameworkReference) if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.20) run_cmake(VsCLRNetcore) diff --git a/Tests/RunCMake/VS10Project/VsFrameworkReference-check.cmake b/Tests/RunCMake/VS10Project/VsFrameworkReference-check.cmake new file mode 100644 index 0000000..7abe8a0 --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsFrameworkReference-check.cmake @@ -0,0 +1,24 @@ +set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj") +if(NOT EXISTS "${vcProjectFile}") + set(RunCMake_TEST_FAILED "Project file ${vcProjectFile} does not exist.") + return() +endif() + +set(frameworkReferenceSet FALSE) + +file(STRINGS "${vcProjectFile}" lines) +foreach(line IN LISTS lines) + if(line MATCHES "^ *$") + if("${CMAKE_MATCH_1}" STREQUAL "Microsoft.WindowsDesktop.App.WPF") + message(STATUS "foo.vcxproj has FrameworkReference set") + set(frameworkReferenceSet TRUE) + else() + message(STATUS "foo.vcxproj has FrameworkReference incorrectly set to ${CMAKE_MATCH_1}") + endif() + endif() +endforeach() + +if(NOT frameworkReferenceSet) + set(RunCMake_TEST_FAILED "FrameworkReference not found or not set correctly.") + return() +endif() diff --git a/Tests/RunCMake/VS10Project/VsFrameworkReference.cmake b/Tests/RunCMake/VS10Project/VsFrameworkReference.cmake new file mode 100644 index 0000000..0e4d6fb --- /dev/null +++ b/Tests/RunCMake/VS10Project/VsFrameworkReference.cmake @@ -0,0 +1,8 @@ +enable_language(CXX) + +add_executable(foo foo.cpp) + +set_target_properties(foo PROPERTIES + COMMON_LANGUAGE_RUNTIME "netcore" + DOTNET_TARGET_FRAMEWORK "net8.0-windows" + VS_FRAMEWORK_REFERENCES "Microsoft.WindowsDesktop.App.WPF") -- cgit v0.12