From 9a6ff95072f9e03713e1a5d16338d97f9b371f4b Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Fri, 1 Apr 2011 16:28:41 -0400 Subject: [PATCH] Fix for bug where VS2010 did not use .obj files as part of the build. For VS2010 if a precompiled .obj file was the output of a custom commad, it was used as part of the build. If it was not, then VS did not use it as part of the build. This commit updates the test to check for this issue, and fixes the problem. This fixes bugs #0011891 and --- Source/cmVisualStudio10TargetGenerator.cxx | 26 +++++++++++++++++----- Tests/ExternalOBJ/CMakeLists.txt | 6 +++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index f8728380c..b8fef250f 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -449,6 +449,8 @@ void cmVisualStudio10TargetGenerator::WriteGroups() bool header = (*s)->GetPropertyAsBool("HEADER_FILE_ONLY") || this->GlobalGenerator->IgnoreFile ((*s)->GetExtension().c_str()); + std::string ext = + cmSystemTools::LowerCase((*s)->GetExtension()); if(!lang) { lang = "None"; @@ -469,7 +471,7 @@ void cmVisualStudio10TargetGenerator::WriteGroups() { headers.push_back(sf); } - else if(sf->GetExtension() == "idl") + else if(ext == "idl") { idls.push_back(sf); } @@ -636,14 +638,28 @@ void cmVisualStudio10TargetGenerator::WriteObjSources() for(std::vector::const_iterator source = sources.begin(); source != sources.end(); ++source) { - if((*source)->GetExtension() == "obj") + std::string ext = + cmSystemTools::LowerCase((*source)->GetExtension()); + if(ext == "obj" || ext == "o") { if(first) { this->WriteString("\n", 1); first = false; } - this->WriteString("GetPropertyAsBool("GENERATED")) + { + this->WriteString("WriteString("BuildFileStream ) << (*source)->GetFullPath() << "\" />\n"; } } @@ -665,8 +681,8 @@ void cmVisualStudio10TargetGenerator::WriteCLSources() for(std::vector::const_iterator source = sources.begin(); source != sources.end(); ++source) { - std::string ext = (*source)->GetExtension(); - if((*source)->GetCustomCommand() || ext == "obj") + std::string ext = cmSystemTools::LowerCase((*source)->GetExtension()); + if((*source)->GetCustomCommand() || ext == "o" || ext == "obj") { continue; } diff --git a/Tests/ExternalOBJ/CMakeLists.txt b/Tests/ExternalOBJ/CMakeLists.txt index 3fef1356d..f12de11d7 100644 --- a/Tests/ExternalOBJ/CMakeLists.txt +++ b/Tests/ExternalOBJ/CMakeLists.txt @@ -51,5 +51,11 @@ ADD_CUSTOM_COMMAND( DEPENDS ${EXTERNAL_OBJECT} ) +message("${EXTERNAL_OBJECT}") # Build an executable using the external object file. ADD_EXECUTABLE(ExternalOBJ executable.cxx ${CUSTOM_OBJECT}) +# A bug showed up in VS2010 where an object file that was +# part of a custom commad output worked, but ones that were +# 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})