From b291d9e756b76ce85ebcc314c14de532e8ad477f Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 19 Mar 2012 17:14:52 -0400 Subject: [PATCH] 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 for external objects generated by a custom command in the current target and for all other external objects. Update the ExternalOBJ test to cover this case. --- Source/cmVisualStudio10TargetGenerator.cxx | 17 ++++------------- Tests/ExternalOBJ/CMakeLists.txt | 2 ++ Tests/ExternalOBJ/Sub/CMakeLists.txt | 3 +++ 3 files changed, 9 insertions(+), 13 deletions(-) create mode 100644 Tests/ExternalOBJ/Sub/CMakeLists.txt diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 88ad178e9..6caaad1bc 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -857,19 +857,10 @@ void cmVisualStudio10TargetGenerator::WriteAllSources() si = this->GeneratorTarget->ExternalObjects.begin(); si != this->GeneratorTarget->ExternalObjects.end(); ++si) { - // If an object file is generated, then vs10 - // will use it in the build, and we have to list - // it as None instead of Object - if((*si)->GetPropertyAsBool("GENERATED")) - { - this->WriteSource("None", *si); - } - // If it is not a generated object then we have - // to use the Object type - else - { - this->WriteSource("Object", *si); - } + // 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. + std::vector const* d = this->Target->GetSourceDepends(*si); + this->WriteSource((d && !d->empty())? "None":"Object", *si); } this->WriteSources("None", this->GeneratorTarget->ExtraSources); diff --git a/Tests/ExternalOBJ/CMakeLists.txt b/Tests/ExternalOBJ/CMakeLists.txt index f12de11d7..683e7997c 100644 --- a/Tests/ExternalOBJ/CMakeLists.txt +++ b/Tests/ExternalOBJ/CMakeLists.txt @@ -59,3 +59,5 @@ ADD_EXECUTABLE(ExternalOBJ executable.cxx ${CUSTOM_OBJECT}) # not didn't work. So, repeat the executable using the object # directly and not from the output of the copy. ADD_EXECUTABLE(ExternalOBJ2 executable.cxx ${EXTERNAL_OBJECT}) + +ADD_SUBDIRECTORY(Sub) diff --git a/Tests/ExternalOBJ/Sub/CMakeLists.txt b/Tests/ExternalOBJ/Sub/CMakeLists.txt new file mode 100644 index 000000000..35cd30c7d --- /dev/null +++ b/Tests/ExternalOBJ/Sub/CMakeLists.txt @@ -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