Commit 55da7e50 authored by Michael Stürmer's avatar Michael Stürmer Committed by Brad King

VS: add support for .NET references with hint paths

parent e3a93c66
Pipeline #38385 passed with stage
......@@ -274,7 +274,9 @@ Properties on Targets
/prop_tgt/VS_CONFIGURATION_TYPE
/prop_tgt/VS_DEBUGGER_WORKING_DIRECTORY
/prop_tgt/VS_DESKTOP_EXTENSIONS_VERSION
/prop_tgt/VS_DOTNET_REFERENCE_refname
/prop_tgt/VS_DOTNET_REFERENCES
/prop_tgt/VS_DOTNET_REFERENCES_COPY_LOCAL
/prop_tgt/VS_DOTNET_TARGET_FRAMEWORK_VERSION
/prop_tgt/VS_GLOBAL_KEYWORD
/prop_tgt/VS_GLOBAL_PROJECT_TYPES
......
VS_DOTNET_REFERENCES_COPY_LOCAL
-------------------------------
Sets the **Copy Local** property for all .NET hint references in the target
Boolean property to enable/disable copying of .NET hint references to
output directory. The default is ``ON``.
VS_DOTNET_REFERENCE_<refname>
-----------------------------
Visual Studio managed project .NET reference with name ``<refname>``
and hint path.
Adds one .NET reference to generated Visual Studio project. The
reference will have the name ``<refname>`` and will point to the
assembly given as value of the property.
See also :prop_tgt:`VS_DOTNET_REFERENCES` and
:prop_tgt:`VS_DOTNET_REFERENCES_COPY_LOCAL`
vs-dotnet-references
--------------------
* The :ref:`Visual Studio Generators` for VS 2010 and above can
now handle .NET references with hintpaths. For this the new
target property group :prop_tgt:`VS_DOTNET_REFERENCE_<refname>`
was introduced. The ``<refname>`` part of the property name will
be the name of the reference, the value will be the actual
path to the assembly.
* Copying of referenced assemblies to the output directory can
now be disabled using the target property
:prop_tgt:`VS_DOTNET_REFERENCES_COPY_LOCAL`.
......@@ -429,28 +429,81 @@ void cmVisualStudio10TargetGenerator::Generate()
void cmVisualStudio10TargetGenerator::WriteDotNetReferences()
{
std::vector<std::string> references;
typedef std::pair<std::string, std::string> HintReference;
std::vector<HintReference> hintReferences;
if (const char* vsDotNetReferences =
this->GeneratorTarget->GetProperty("VS_DOTNET_REFERENCES")) {
cmSystemTools::ExpandListArgument(vsDotNetReferences, references);
}
if (!references.empty()) {
cmPropertyMap const& props = this->GeneratorTarget->Target->GetProperties();
for (cmPropertyMap::const_iterator i = props.begin(); i != props.end();
++i) {
if (i->first.find("VS_DOTNET_REFERENCE_") == 0) {
std::string name = i->first.substr(20);
if (name != "") {
std::string path = i->second.GetValue();
if (!cmsys::SystemTools::FileIsFullPath(path)) {
path = std::string(this->GeneratorTarget->Target->GetMakefile()
->GetCurrentSourceDirectory()) +
"/" + path;
}
this->ConvertToWindowsSlash(path);
hintReferences.push_back(HintReference(name, path));
}
}
}
if (!references.empty() || !hintReferences.empty()) {
this->WriteString("<ItemGroup>\n", 1);
for (std::vector<std::string>::iterator ri = references.begin();
ri != references.end(); ++ri) {
this->WriteString("<Reference Include=\"", 2);
(*this->BuildFileStream) << cmVS10EscapeXML(*ri) << "\">\n";
this->WriteString("<CopyLocalSatelliteAssemblies>true"
"</CopyLocalSatelliteAssemblies>\n",
3);
this->WriteString("<ReferenceOutputAssembly>true"
"</ReferenceOutputAssembly>\n",
3);
this->WriteString("</Reference>\n", 2);
// if the entry from VS_DOTNET_REFERENCES is an existing file, generate
// a new hint-reference and name it from the filename
if (cmsys::SystemTools::FileExists(*ri, true)) {
std::string name =
cmsys::SystemTools::GetFilenameWithoutExtension(*ri);
std::string path = *ri;
this->ConvertToWindowsSlash(path);
hintReferences.push_back(HintReference(name, path));
} else {
this->WriteDotNetReference(*ri, "");
}
}
for (std::vector<std::pair<std::string, std::string> >::const_iterator i =
hintReferences.begin();
i != hintReferences.end(); ++i) {
this->WriteDotNetReference(i->first, i->second);
}
this->WriteString("</ItemGroup>\n", 1);
}
}
void cmVisualStudio10TargetGenerator::WriteDotNetReference(
std::string const& ref, std::string const& hint)
{
this->WriteString("<Reference Include=\"", 2);
(*this->BuildFileStream) << cmVS10EscapeXML(ref) << "\">\n";
this->WriteString("<CopyLocalSatelliteAssemblies>true"
"</CopyLocalSatelliteAssemblies>\n",
3);
this->WriteString("<ReferenceOutputAssembly>true"
"</ReferenceOutputAssembly>\n",
3);
if (!hint.empty()) {
const char* privateReference = "True";
if (const char* value = this->GeneratorTarget->GetProperty(
"VS_DOTNET_REFERENCES_COPY_LOCAL")) {
if (cmSystemTools::IsOff(value)) {
privateReference = "False";
}
}
this->WriteString("<Private>", 3);
(*this->BuildFileStream) << privateReference << "</Private>\n";
this->WriteString("<HintPath>", 3);
(*this->BuildFileStream) << hint << "</HintPath>\n";
}
this->WriteString("</Reference>\n", 2);
}
void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup()
{
std::vector<cmSourceFile const*> resxObjs;
......
......@@ -65,6 +65,7 @@ private:
std::vector<cmSourceFile const*> const&);
void WriteAllSources();
void WriteDotNetReferences();
void WriteDotNetReference(std::string const& ref, std::string const& hint);
void WriteEmbeddedResourceGroup();
void WriteWinRTReferences();
void WriteWinRTPackageCertificateKeyFile();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment