diff options
author | Michael Stürmer <michael.stuermer@schaeffler.com> | 2016-12-13 07:49:39 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-12-13 18:51:50 (GMT) |
commit | 55da7e501ef114a3eac835396dae2187b7af96e8 (patch) | |
tree | 3a70d247dc794ccb6ec1eeaf6d8d54e3fc216157 /Source/cmVisualStudio10TargetGenerator.cxx | |
parent | e3a93c66cc9f1d578f880f19e17ad31cc731fa86 (diff) | |
download | CMake-55da7e501ef114a3eac835396dae2187b7af96e8.zip CMake-55da7e501ef114a3eac835396dae2187b7af96e8.tar.gz CMake-55da7e501ef114a3eac835396dae2187b7af96e8.tar.bz2 |
VS: add support for .NET references with hint paths
Diffstat (limited to 'Source/cmVisualStudio10TargetGenerator.cxx')
-rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 73 |
1 files changed, 63 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; |