VS11: Simplify external object file handling (#13831)
Since commit9a6ff950
(Fix for bug where VS2010 did not use .obj files as part of the build, 2011-04-01) and commitb291d9e7
(VS10: Fix external objects generated outside target, 2012-03-19) we try to detect whether an external object file is also a custom command output in the same target. This is because VS10 includes .obj custom command outputs on the link line by default. VS 11 supports a "<LinkObjects ...>false</LinkObjects>" setting in custom command rules to tell VS not to link the outputs. From the VS help: Specify whether the Inputs and output files with specific extensions (.obj, .lib, .res, .rsc) are passed to the linker. Treat all external object files the same and add "<Object>" settings for them.
This commit is contained in:
parent
c7550d5ef1
commit
b684b39581
|
@ -572,6 +572,12 @@ cmVisualStudio10TargetGenerator::WriteCustomRule(cmSourceFile* source,
|
||||||
sep = ";";
|
sep = ";";
|
||||||
}
|
}
|
||||||
(*this->BuildFileStream ) << "</Outputs>\n";
|
(*this->BuildFileStream ) << "</Outputs>\n";
|
||||||
|
if(this->LocalGenerator->GetVersion() > cmLocalVisualStudioGenerator::VS10)
|
||||||
|
{
|
||||||
|
// VS >= 11 let us turn off linking of custom command outputs.
|
||||||
|
this->WritePlatformConfigTag("LinkObjects", i->c_str(), 3);
|
||||||
|
(*this->BuildFileStream ) << "false</LinkObjects>\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this->WriteString("</CustomBuild>\n", 2);
|
this->WriteString("</CustomBuild>\n", 2);
|
||||||
}
|
}
|
||||||
|
@ -879,15 +885,24 @@ void cmVisualStudio10TargetGenerator::WriteAllSources()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this->LocalGenerator->GetVersion() > cmLocalVisualStudioGenerator::VS10)
|
||||||
|
{
|
||||||
|
// For VS >= 11 we use LinkObjects to avoid linking custom command
|
||||||
|
// outputs. Use Object for all external objects, generated or not.
|
||||||
|
this->WriteSources("Object", this->GeneratorTarget->ExternalObjects);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If an object file is generated in this target, then vs10 will use
|
||||||
|
// it in the build, and we have to list it as None instead of Object.
|
||||||
for(std::vector<cmSourceFile*>::const_iterator
|
for(std::vector<cmSourceFile*>::const_iterator
|
||||||
si = this->GeneratorTarget->ExternalObjects.begin();
|
si = this->GeneratorTarget->ExternalObjects.begin();
|
||||||
si != this->GeneratorTarget->ExternalObjects.end(); ++si)
|
si != this->GeneratorTarget->ExternalObjects.end(); ++si)
|
||||||
{
|
{
|
||||||
// If an object file is generated in this target, then vs10 will use
|
std::vector<cmSourceFile*> const* d=this->Target->GetSourceDepends(*si);
|
||||||
// it in the build, and we have to list it as None instead of Object.
|
|
||||||
std::vector<cmSourceFile*> const* d = this->Target->GetSourceDepends(*si);
|
|
||||||
this->WriteSource((d && !d->empty())? "None":"Object", *si);
|
this->WriteSource((d && !d->empty())? "None":"Object", *si);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this->WriteSources("None", this->GeneratorTarget->ExtraSources);
|
this->WriteSources("None", this->GeneratorTarget->ExtraSources);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue