VS: Disallow ReferenceOutputAssembly in ProjectReference if not possible

Explicitly turn off `ReferenceOutputAssembly` in `ProjectReference`
elements naming other project files whose types do not produce
assemblies.  We already do this for `C#` but it makes sense for other
languages too.

Fixes: #17906
This commit is contained in:
Bastien Schatt
2018-08-12 16:06:56 +02:00
parent 0f17dc51c2
commit e4ba1f5a94
+21 -23
View File
@@ -3778,31 +3778,29 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences(Elem& e0)
e2.Element("Project", "{" + this->GlobalGenerator->GetGUID(name) + "}");
e2.Element("Name", name);
this->WriteDotNetReferenceCustomTags(e2, name);
if (this->Managed) {
// If the dependency target is not managed (compiled with /clr or
// C# target) we cannot reference it and have to set
// 'ReferenceOutputAssembly' to false.
auto referenceNotManaged =
dt->GetManagedType("") < cmGeneratorTarget::ManagedType::Mixed;
// Workaround to check for manually set /clr flags.
if (referenceNotManaged) {
if (const auto* flags = dt->GetProperty("COMPILE_OPTIONS")) {
std::string flagsStr = flags;
if (flagsStr.find("clr") != std::string::npos) {
// There is a warning already issued when building the flags.
referenceNotManaged = false;
}
// If the dependency target is not managed (compiled with /clr or
// C# target) we cannot reference it and have to set
// 'ReferenceOutputAssembly' to false.
auto referenceNotManaged =
dt->GetManagedType("") < cmGeneratorTarget::ManagedType::Mixed;
// Workaround to check for manually set /clr flags.
if (referenceNotManaged) {
if (const auto* flags = dt->GetProperty("COMPILE_OPTIONS")) {
std::string flagsStr = flags;
if (flagsStr.find("clr") != std::string::npos) {
// There is a warning already issued when building the flags.
referenceNotManaged = false;
}
}
// Workaround for static library C# targets
if (referenceNotManaged &&
dt->GetType() == cmStateEnums::STATIC_LIBRARY) {
referenceNotManaged = !dt->HasLanguage("CSharp", "");
}
if (referenceNotManaged) {
e2.Element("ReferenceOutputAssembly", "false");
e2.Element("CopyToOutputDirectory", "Never");
}
}
// Workaround for static library C# targets
if (referenceNotManaged && dt->GetType() == cmStateEnums::STATIC_LIBRARY) {
referenceNotManaged = !dt->HasLanguage("CSharp", "");
}
if (referenceNotManaged) {
e2.Element("ReferenceOutputAssembly", "false");
e2.Element("CopyToOutputDirectory", "Never");
}
}
}