mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-20 04:24:36 +08:00
VS: Added support for VS package references for nuget
This commit is contained in:
@@ -342,6 +342,7 @@ Properties on Targets
|
|||||||
/prop_tgt/VS_KEYWORD
|
/prop_tgt/VS_KEYWORD
|
||||||
/prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
|
/prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
|
||||||
/prop_tgt/VS_NO_SOLUTION_DEPLOY
|
/prop_tgt/VS_NO_SOLUTION_DEPLOY
|
||||||
|
/prop_tgt/VS_PACKAGE_REFERENCES
|
||||||
/prop_tgt/VS_PROJECT_IMPORT
|
/prop_tgt/VS_PROJECT_IMPORT
|
||||||
/prop_tgt/VS_SCC_AUXPATH
|
/prop_tgt/VS_SCC_AUXPATH
|
||||||
/prop_tgt/VS_SCC_LOCALPATH
|
/prop_tgt/VS_SCC_LOCALPATH
|
||||||
|
13
Help/prop_tgt/VS_PACKAGE_REFERENCES.rst
Normal file
13
Help/prop_tgt/VS_PACKAGE_REFERENCES.rst
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
VS_PACKAGE_REFERENCES
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Visual Studio package references for nuget.
|
||||||
|
|
||||||
|
Adds one or more semicolon-delimited package references to a generated
|
||||||
|
Visual Studio project. The version of the package will be
|
||||||
|
underscore delimited. For example, ``boost_1.7.0;nunit_3.12.*``.
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
set_property(TARGET ${TARGET_NAME} PROPERTY
|
||||||
|
VS_PACKAGE_REFERENCES "boost_1.7.0")
|
6
Help/release/dev/vs-add-package-references.rst
Normal file
6
Help/release/dev/vs-add-package-references.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
vs-add-package-references
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
* A :prop_tgt:`VS_PACKAGE_REFERENCES` target property was added to
|
||||||
|
tell :ref:`Visual Studio Generators` to add references to nuget
|
||||||
|
packages.
|
@@ -664,6 +664,7 @@ void cmVisualStudio10TargetGenerator::Generate()
|
|||||||
this->WriteCustomCommands(e0);
|
this->WriteCustomCommands(e0);
|
||||||
this->WriteAllSources(e0);
|
this->WriteAllSources(e0);
|
||||||
this->WriteDotNetReferences(e0);
|
this->WriteDotNetReferences(e0);
|
||||||
|
this->WritePackageReferences(e0);
|
||||||
this->WriteImports(e0);
|
this->WriteImports(e0);
|
||||||
this->WriteEmbeddedResourceGroup(e0);
|
this->WriteEmbeddedResourceGroup(e0);
|
||||||
this->WriteXamlFilesGroup(e0);
|
this->WriteXamlFilesGroup(e0);
|
||||||
@@ -737,6 +738,33 @@ void cmVisualStudio10TargetGenerator::Generate()
|
|||||||
this->WriteGroups();
|
this->WriteGroups();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmVisualStudio10TargetGenerator::WritePackageReferences(Elem& e0)
|
||||||
|
{
|
||||||
|
std::vector<std::string> packageReferences;
|
||||||
|
if (const char* vsPackageReferences =
|
||||||
|
this->GeneratorTarget->GetProperty("VS_PACKAGE_REFERENCES")) {
|
||||||
|
cmSystemTools::ExpandListArgument(vsPackageReferences, packageReferences);
|
||||||
|
}
|
||||||
|
if (!packageReferences.empty()) {
|
||||||
|
Elem e1(e0, "ItemGroup");
|
||||||
|
for (std::string const& ri : packageReferences) {
|
||||||
|
size_t versionIndex = ri.find_last_of('_');
|
||||||
|
if (versionIndex != std::string::npos) {
|
||||||
|
WritePackageReference(e1, ri.substr(0, versionIndex),
|
||||||
|
ri.substr(versionIndex + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmVisualStudio10TargetGenerator::WritePackageReference(
|
||||||
|
Elem& e1, std::string const& ref, std::string const& version)
|
||||||
|
{
|
||||||
|
Elem e2(e1, "PackageReference");
|
||||||
|
e2.Attribute("Include", ref);
|
||||||
|
e2.Attribute("Version", version);
|
||||||
|
}
|
||||||
|
|
||||||
void cmVisualStudio10TargetGenerator::WriteDotNetReferences(Elem& e0)
|
void cmVisualStudio10TargetGenerator::WriteDotNetReferences(Elem& e0)
|
||||||
{
|
{
|
||||||
std::vector<std::string> references;
|
std::vector<std::string> references;
|
||||||
|
@@ -72,6 +72,9 @@ private:
|
|||||||
void WriteExcludeFromBuild(Elem& e2,
|
void WriteExcludeFromBuild(Elem& e2,
|
||||||
std::vector<size_t> const& exclude_configs);
|
std::vector<size_t> const& exclude_configs);
|
||||||
void WriteAllSources(Elem& e0);
|
void WriteAllSources(Elem& e0);
|
||||||
|
void WritePackageReferences(Elem& e0);
|
||||||
|
void WritePackageReference(Elem& e1, std::string const& ref,
|
||||||
|
std::string const& version);
|
||||||
void WriteDotNetReferences(Elem& e0);
|
void WriteDotNetReferences(Elem& e0);
|
||||||
void WriteDotNetReference(Elem& e1, std::string const& ref,
|
void WriteDotNetReference(Elem& e1, std::string const& ref,
|
||||||
std::string const& hint,
|
std::string const& hint,
|
||||||
|
@@ -21,6 +21,7 @@ run_cmake(VSCSharpDefines)
|
|||||||
run_cmake(VsSdkDirectories)
|
run_cmake(VsSdkDirectories)
|
||||||
run_cmake(VsGlobals)
|
run_cmake(VsGlobals)
|
||||||
run_cmake(VsProjectImport)
|
run_cmake(VsProjectImport)
|
||||||
|
run_cmake(VsPackageReferences)
|
||||||
|
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.05)
|
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.05)
|
||||||
run_cmake(VsJustMyCode)
|
run_cmake(VsJustMyCode)
|
||||||
|
39
Tests/RunCMake/VS10Project/VsPackageReferences-check.cmake
Normal file
39
Tests/RunCMake/VS10Project/VsPackageReferences-check.cmake
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
|
||||||
|
if(NOT EXISTS "${vcProjectFile}")
|
||||||
|
set(RunCMake_TEST_FAILED "Project file foo.vcxproj does not exist.")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
set(test1Library "boost")
|
||||||
|
set(test1Version "1.7.0")
|
||||||
|
|
||||||
|
|
||||||
|
set(test2Library "SFML")
|
||||||
|
set(test2Version "2.2.0")
|
||||||
|
|
||||||
|
set(Library1Found FALSE)
|
||||||
|
set(Library2Found FALSE)
|
||||||
|
|
||||||
|
file(STRINGS "${vcProjectFile}" lines)
|
||||||
|
|
||||||
|
foreach(i 1 2)
|
||||||
|
set(testLibrary "${test${i}Library}")
|
||||||
|
set(testVersion "${test${i}Version}")
|
||||||
|
foreach(line IN LISTS lines)
|
||||||
|
if(line MATCHES "^ *<PackageReference Include=\"${testLibrary}\".*>$")
|
||||||
|
if(line MATCHES "^ *<PackageReference .* Version=\"${testVersion}\".*>$")
|
||||||
|
set(Library${i}Found TRUE)
|
||||||
|
message(STATUS "foo.vcxproj is using package reference ${testLibrary} with version ${testVersion}")
|
||||||
|
elseif()
|
||||||
|
message(STATUS "foo.vcxproj failed to define reference ${testLibrary} with version ${testVersion}")
|
||||||
|
set(Library${i}Found FALSE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(NOT Library1Found OR NOT Library2Found)
|
||||||
|
set(RunCMake_TEST_FAILED "Failed to find package references")
|
||||||
|
return()
|
||||||
|
endif()
|
4
Tests/RunCMake/VS10Project/VsPackageReferences.cmake
Normal file
4
Tests/RunCMake/VS10Project/VsPackageReferences.cmake
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
enable_language(CXX)
|
||||||
|
add_library(foo foo.cpp)
|
||||||
|
|
||||||
|
set_property(TARGET foo PROPERTY VS_PACKAGE_REFERENCES "boost_1.7.0;SFML_2.2.0")
|
Reference in New Issue
Block a user