diff options
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.cxx | 43 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudio71Generator.cxx | 10 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudio8Generator.h | 3 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudioGenerator.cxx | 33 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudioGenerator.h | 7 | ||||
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 41 |
6 files changed, 79 insertions, 58 deletions
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 96d1b33..8fc5fc2 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -903,24 +903,21 @@ cmGlobalUnixMakefileGenerator3 // A target should not depend on itself. emitted.insert(target.GetName()); - - // Loop over all library dependencies but not for static libs - if (target.GetType() != cmTarget::STATIC_LIBRARY) + + // Loop over all library dependencies. + const cmTarget::LinkLibraryVectorType& tlibs = target.GetLinkLibraries(); + for(cmTarget::LinkLibraryVectorType::const_iterator lib = tlibs.begin(); + lib != tlibs.end(); ++lib) { - const cmTarget::LinkLibraryVectorType& tlibs = target.GetLinkLibraries(); - for(cmTarget::LinkLibraryVectorType::const_iterator lib = tlibs.begin(); - lib != tlibs.end(); ++lib) + // Don't emit the same library twice for this target. + if(emitted.insert(lib->first).second) { - // Don't emit the same library twice for this target. - if(emitted.insert(lib->first).second) - { - // Add this dependency. - this->AppendAnyGlobalDepend(depends, lib->first.c_str(), - emitted, target); - } + // Add this dependency. + this->AppendAnyGlobalDepend(depends, lib->first.c_str(), + emitted, target); } } - + // Loop over all utility dependencies. const std::set<cmStdString>& tutils = target.GetUtilities(); for(std::set<cmStdString>::const_iterator util = tutils.begin(); @@ -967,24 +964,6 @@ cmGlobalUnixMakefileGenerator3 std::string tgtName = lg3->GetRelativeTargetDirectory(*result); tgtName += "/all"; depends.push_back(tgtName); - if(result->GetType() == cmTarget::STATIC_LIBRARY) - { - // Since the static library itself does not list dependencies we - // need to chain its dependencies here. - const cmTarget::LinkLibraryVectorType& tlibs - = result->GetLinkLibraries(); - for(cmTarget::LinkLibraryVectorType::const_iterator lib = tlibs.begin(); - lib != tlibs.end(); ++lib) - { - // Don't emit the same library twice for this target. - if(emitted.insert(lib->first).second) - { - // Add this dependency. - this->AppendAnyGlobalDepend(depends, lib->first.c_str(), - emitted, *result); - } - } - } return; } } diff --git a/Source/cmGlobalVisualStudio71Generator.cxx b/Source/cmGlobalVisualStudio71Generator.cxx index 345cfdf..adb3f57 100644 --- a/Source/cmGlobalVisualStudio71Generator.cxx +++ b/Source/cmGlobalVisualStudio71Generator.cxx @@ -317,8 +317,14 @@ cmGlobalVisualStudio71Generator const char* dspname, const char*, cmTarget& target) { - // insert Begin Project Dependency Project_Dep_Name project stuff here - if (target.GetType() != cmTarget::STATIC_LIBRARY) + // Create inter-target dependencies in the solution file. For VS + // 7.1 and below we cannot let static libraries depend directly on + // targets to which they "link" because the librarian tool will copy + // the targets into the static library. See + // cmGlobalVisualStudioGenerator::FixUtilityDependsForTarget for a + // work-around. VS 8 and above do not have this problem. + if (!this->VSLinksDependencies() || + target.GetType() != cmTarget::STATIC_LIBRARY) { cmTarget::LinkLibraryVectorType::const_iterator j, jend; j = target.GetLinkLibraries().begin(); diff --git a/Source/cmGlobalVisualStudio8Generator.h b/Source/cmGlobalVisualStudio8Generator.h index b7250a1..534258a 100644 --- a/Source/cmGlobalVisualStudio8Generator.h +++ b/Source/cmGlobalVisualStudio8Generator.h @@ -59,8 +59,7 @@ public: protected: - // Utility target fix is not needed for VS8. - virtual void FixUtilityDepends() {} + virtual bool VSLinksDependencies() const { return false; } static cmVS7FlagTable const* GetExtraFlagTableVS8(); virtual void AddPlatformDefinitions(cmMakefile* mf); diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx index fdc62f4..2319b04 100644 --- a/Source/cmGlobalVisualStudioGenerator.cxx +++ b/Source/cmGlobalVisualStudioGenerator.cxx @@ -197,6 +197,12 @@ std::string cmGlobalVisualStudioGenerator::GetUserMacrosDirectory() //---------------------------------------------------------------------------- void cmGlobalVisualStudioGenerator::FixUtilityDepends() { + // Skip for VS versions 8 and above. + if(!this->VSLinksDependencies()) + { + return; + } + // For VS versions before 8: // // When a target that links contains a project-level dependency on a @@ -232,6 +238,33 @@ cmGlobalVisualStudioGenerator::FixUtilityDependsForTarget(cmTarget& target) return; } +#if 0 + // This feature makes a mess in SLN files for VS 7.1 and below. It + // creates an extra target for every target that is "linked" by a + // static library. Without this feature static libraries do not + // wait until their "link" dependencies are built to build. This is + // not a problem 99.9% of the time, and projects that do have the + // problem can enable this work-around by using add_dependencies. + + // Static libraries cannot depend directly on the targets to which + // they link because VS will copy those targets into the library + // (for VS < 8). To work around the problem we copy the + // dependencies to be utility dependencies so that the work-around + // below is used. + if(target.GetType() == cmTarget::STATIC_LIBRARY) + { + cmTarget::LinkLibraryVectorType const& libs = target.GetLinkLibraries(); + for(cmTarget::LinkLibraryVectorType::const_iterator i = libs.begin(); + i != libs.end(); ++i) + { + if(cmTarget* depTarget = this->FindTarget(0, i->first.c_str(), false)) + { + target.AddUtility(depTarget->GetName()); + } + } + } +#endif + // Look at each utility dependency. for(std::set<cmStdString>::const_iterator ui = target.GetUtilities().begin(); diff --git a/Source/cmGlobalVisualStudioGenerator.h b/Source/cmGlobalVisualStudioGenerator.h index 4237b97..2fbb478 100644 --- a/Source/cmGlobalVisualStudioGenerator.h +++ b/Source/cmGlobalVisualStudioGenerator.h @@ -60,9 +60,14 @@ public: protected: virtual void CreateGUID(const char*) {} - virtual void FixUtilityDepends(); + void FixUtilityDepends(); const char* GetUtilityForTarget(cmTarget& target, const char*); + // Does this VS version link targets to each other if there are + // dependencies in the SLN file? This was done for VS versions + // below 8. + virtual bool VSLinksDependencies() const { return true; } + private: void FixUtilityDependsForTarget(cmTarget& target); void CreateUtilityDependTarget(cmTarget& target); diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index f08c36e..d02fe26 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -2006,34 +2006,33 @@ void cmGlobalXCodeGenerator } // Add dependencies on other CMake targets. - if(cmtarget->GetType() != cmTarget::STATIC_LIBRARY) - { - // Keep track of dependencies already listed. - std::set<cmStdString> emitted; + { + // Keep track of dependencies already listed. + std::set<cmStdString> emitted; - // A target should not depend on itself. - emitted.insert(cmtarget->GetName()); + // A target should not depend on itself. + emitted.insert(cmtarget->GetName()); - // Loop over all library dependencies. - const cmTarget::LinkLibraryVectorType& tlibs = - cmtarget->GetLinkLibraries(); - for(cmTarget::LinkLibraryVectorType::const_iterator lib = tlibs.begin(); - lib != tlibs.end(); ++lib) + // Loop over all library dependencies. + const cmTarget::LinkLibraryVectorType& tlibs = + cmtarget->GetLinkLibraries(); + for(cmTarget::LinkLibraryVectorType::const_iterator lib = tlibs.begin(); + lib != tlibs.end(); ++lib) + { + // Don't emit the same library twice for this target. + if(emitted.insert(lib->first).second) { - // Don't emit the same library twice for this target. - if(emitted.insert(lib->first).second) + // Add this dependency. + cmTarget* t = this->FindTarget(this->CurrentProject.c_str(), + lib->first.c_str(), false); + cmXCodeObject* dptarget = this->FindXCodeTarget(t); + if(dptarget) { - // Add this dependency. - cmTarget* t = this->FindTarget(this->CurrentProject.c_str(), - lib->first.c_str(), false); - cmXCodeObject* dptarget = this->FindXCodeTarget(t); - if(dptarget) - { - this->AddDependTarget(target, dptarget); - } + this->AddDependTarget(target, dptarget); } } } + } // write utility dependencies. for(std::set<cmStdString>::const_iterator i |