VS: add target property VS_PROJECT_IMPORT_<propspath>

Fixes: #18998
This commit is contained in:
Leonid Pospelov 2019-03-24 04:47:53 +03:00 committed by Brad King
parent 4bbd315097
commit d145d72e70
8 changed files with 74 additions and 0 deletions

View File

@ -335,6 +335,7 @@ Properties on Targets
/prop_tgt/VS_KEYWORD
/prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
/prop_tgt/VS_NO_SOLUTION_DEPLOY
/prop_tgt/VS_PROJECT_IMPORT
/prop_tgt/VS_SCC_AUXPATH
/prop_tgt/VS_SCC_LOCALPATH
/prop_tgt/VS_SCC_PROJECTNAME

View File

@ -0,0 +1,8 @@
VS_PROJECT_IMPORT
-----------------
Visual Studio managed project imports
Adds to a generated Visual Studio project one or more semicolon-delimited paths
to .props files needed when building projects from some NuGet packages.
For example, ``my_packages_path/MyPackage.1.0.0/build/MyPackage.props``.

View File

@ -0,0 +1,5 @@
vs-project-import
-----------------
* The :prop_tgt:`VS_PROJECT_IMPORT` target property was added which allows
to import external .props files in managed Visual Studio targets.

View File

@ -662,6 +662,7 @@ void cmVisualStudio10TargetGenerator::Generate()
this->WriteCustomCommands(e0);
this->WriteAllSources(e0);
this->WriteDotNetReferences(e0);
this->WriteImports(e0);
this->WriteEmbeddedResourceGroup(e0);
this->WriteXamlFilesGroup(e0);
this->WriteWinRTReferences(e0);
@ -810,6 +811,24 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReference(
this->WriteDotNetReferenceCustomTags(e2, ref);
}
void cmVisualStudio10TargetGenerator::WriteImports(Elem& e0)
{
const char* imports =
this->GeneratorTarget->Target->GetProperty("VS_PROJECT_IMPORT");
if (imports) {
std::vector<std::string> argsSplit;
cmSystemTools::ExpandListArgument(std::string(imports), argsSplit, false);
for (auto& path : argsSplit) {
if (!cmsys::SystemTools::FileIsFullPath(path)) {
path = this->Makefile->GetCurrentSourceDirectory() + "/" + path;
}
ConvertToWindowsSlash(path);
Elem e1(e0, "Import");
e1.Attribute("Project", path);
}
}
}
void cmVisualStudio10TargetGenerator::WriteDotNetReferenceCustomTags(
Elem& e2, std::string const& ref)
{

View File

@ -76,6 +76,7 @@ private:
void WriteDotNetReference(Elem& e1, std::string const& ref,
std::string const& hint,
std::string const& config);
void WriteImports(Elem& e0);
void WriteDotNetReferenceCustomTags(Elem& e2, std::string const& ref);
void WriteEmbeddedResourceGroup(Elem& e0);
void WriteWinRTReferences(Elem& e0);

View File

@ -18,3 +18,4 @@ run_cmake(VsCSharpDeployFiles)
run_cmake(VSCSharpDefines)
run_cmake(VsSdkDirectories)
run_cmake(VsGlobals)
run_cmake(VsProjectImport)

View File

@ -0,0 +1,28 @@
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(test1Import "path\\\\to\\\\nuget_packages\\\\Foo.1.0.0\\\\build\\\\Foo.props")
set(test2Import "path\\\\to\\\\nuget_packages\\\\Bar.1.0.0\\\\build\\\\Bar.props")
set(import1Found FALSE)
set(import2Found FALSE)
file(STRINGS "${vcProjectFile}" lines)
foreach(i 1 2)
set(testImport "${test${i}Import}")
foreach(line IN LISTS lines)
if(line MATCHES "^ *<Import Project=\".*${test1Import}\" />$")
message(STATUS "foo.vcxproj is using project import ${testImport}")
set(import${i}Found TRUE)
endif()
endforeach()
endforeach()
if(NOT import1Found OR NOT import2Found)
set(RunCMake_TEST_FAILED "Imported project not found.")
return()
endif()

View File

@ -0,0 +1,11 @@
enable_language(CXX)
add_library(foo foo.cpp)
set(test1Import "path/to/nuget_packages/Foo.1.0.0/build/Foo.props")
set(test2Import "path/to/nuget_packages/Bar.1.0.0/build/Bar.props")
set_property(TARGET foo PROPERTY
VS_PROJECT_IMPORT
${test1Import}
${test2Import}
)