VS10: Fix external objects generated outside target (#13047)

Commit 9a6ff950 (Fix for bug where VS2010 did not use .obj files,
2011-04-01) assumed that if an external object is GENERATED that it is
the output of a custom command in the current target.  If it is
generated by another target then VS will not automatically include the
external object in the current target.  This bug was preserved by the
refactoring in the parent commit.

Instead use <None> for external objects generated by a custom command in
the current target and <Object> for all other external objects.  Update
the ExternalOBJ test to cover this case.
This commit is contained in:
Brad King 2012-03-19 17:14:52 -04:00
parent 328c0f65c2
commit b291d9e756
3 changed files with 9 additions and 13 deletions

View File

@ -857,19 +857,10 @@ void cmVisualStudio10TargetGenerator::WriteAllSources()
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, then vs10 // If an object file is generated in this target, then vs10 will use
// will use it in the build, and we have to list // it in the build, and we have to list it as None instead of Object.
// it as None instead of Object std::vector<cmSourceFile*> const* d = this->Target->GetSourceDepends(*si);
if((*si)->GetPropertyAsBool("GENERATED")) this->WriteSource((d && !d->empty())? "None":"Object", *si);
{
this->WriteSource("None", *si);
}
// If it is not a generated object then we have
// to use the Object type
else
{
this->WriteSource("Object", *si);
}
} }
this->WriteSources("None", this->GeneratorTarget->ExtraSources); this->WriteSources("None", this->GeneratorTarget->ExtraSources);

View File

@ -59,3 +59,5 @@ ADD_EXECUTABLE(ExternalOBJ executable.cxx ${CUSTOM_OBJECT})
# not didn't work. So, repeat the executable using the object # not didn't work. So, repeat the executable using the object
# directly and not from the output of the copy. # directly and not from the output of the copy.
ADD_EXECUTABLE(ExternalOBJ2 executable.cxx ${EXTERNAL_OBJECT}) ADD_EXECUTABLE(ExternalOBJ2 executable.cxx ${EXTERNAL_OBJECT})
ADD_SUBDIRECTORY(Sub)

View File

@ -0,0 +1,3 @@
set_property(SOURCE ${CUSTOM_OBJECT} PROPERTY GENERATED 1)
add_executable(ExternalOBJSub ../executable.cxx ${CUSTOM_OBJECT})
add_dependencies(ExternalOBJSub ExternalOBJ) # depend on generating target