summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorMichael Stürmer <michael.stuermer@schaeffler.com>2016-12-13 07:49:39 (GMT)
committerBrad King <brad.king@kitware.com>2016-12-13 18:51:50 (GMT)
commit55da7e501ef114a3eac835396dae2187b7af96e8 (patch)
tree3a70d247dc794ccb6ec1eeaf6d8d54e3fc216157 /Source
parente3a93c66cc9f1d578f880f19e17ad31cc731fa86 (diff)
downloadCMake-55da7e501ef114a3eac835396dae2187b7af96e8.zip
CMake-55da7e501ef114a3eac835396dae2187b7af96e8.tar.gz
CMake-55da7e501ef114a3eac835396dae2187b7af96e8.tar.bz2
VS: add support for .NET references with hint paths
Diffstat (limited to 'Source')
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx73
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h1
2 files changed, 64 insertions, 10 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 8ab3b04..49274c0 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -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;
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index e68bf1a..027761e 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -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();