diff --git a/Source/cmLocalUnixMakefileGenerator2.cxx b/Source/cmLocalUnixMakefileGenerator2.cxx index 46cbf8f68..04d98b10d 100644 --- a/Source/cmLocalUnixMakefileGenerator2.cxx +++ b/Source/cmLocalUnixMakefileGenerator2.cxx @@ -367,6 +367,14 @@ cmLocalUnixMakefileGenerator2 this->WriteStaticLibraryRule(ruleFileStream, ruleFileName.c_str(), target, objects); break; + case cmTarget::SHARED_LIBRARY: + this->WriteSharedLibraryRule(ruleFileStream, ruleFileName.c_str(), + target, objects); + break; + case cmTarget::MODULE_LIBRARY: + this->WriteModuleLibraryRule(ruleFileStream, ruleFileName.c_str(), + target, objects); + break; case cmTarget::EXECUTABLE: this->WriteExecutableRule(ruleFileStream, ruleFileName.c_str(), target, objects); @@ -719,8 +727,68 @@ cmLocalUnixMakefileGenerator2 std::string linkRuleVar = "CMAKE_"; linkRuleVar += linkLanguage; linkRuleVar += "_CREATE_STATIC_LIBRARY"; + + std::string extraFlags; + this->AppendFlags(extraFlags, target.GetProperty("STATIC_LIBRARY_FLAGS")); this->WriteLibraryRule(ruleFileStream, ruleFileName, target, objects, - linkRuleVar.c_str(), "STATIC_LIBRARY_FLAGS"); + linkRuleVar.c_str(), extraFlags.c_str()); +} + +//---------------------------------------------------------------------------- +void +cmLocalUnixMakefileGenerator2 +::WriteSharedLibraryRule(std::ostream& ruleFileStream, + const char* ruleFileName, + const cmTarget& target, + std::vector& objects) +{ + const char* linkLanguage = + target.GetLinkerLanguage(this->GetGlobalGenerator()); + std::string linkRuleVar = "CMAKE_"; + linkRuleVar += linkLanguage; + linkRuleVar += "_CREATE_SHARED_LIBRARY"; + + std::string extraFlags; + this->AppendFlags(extraFlags, target.GetProperty("LINK_FLAGS")); + this->AddConfigVariableFlags(extraFlags, "CMAKE_SHARED_LINKER_FLAGS"); + if(m_Makefile->IsOn("WIN32") && !(m_Makefile->IsOn("CYGWIN") || m_Makefile->IsOn("MINGW"))) + { + const std::vector& sources = target.GetSourceFiles(); + for(std::vector::const_iterator i = sources.begin(); + i != sources.end(); ++i) + { + if((*i)->GetSourceExtension() == "def") + { + extraFlags += " "; + extraFlags += m_Makefile->GetSafeDefinition("CMAKE_LINK_DEF_FILE_FLAG"); + extraFlags += this->ConvertToRelativeOutputPath((*i)->GetFullPath().c_str()); + } + } + } + this->WriteLibraryRule(ruleFileStream, ruleFileName, target, objects, + linkRuleVar.c_str(), extraFlags.c_str()); +} + +//---------------------------------------------------------------------------- +void +cmLocalUnixMakefileGenerator2 +::WriteModuleLibraryRule(std::ostream& ruleFileStream, + const char* ruleFileName, + const cmTarget& target, + std::vector& objects) +{ + const char* linkLanguage = + target.GetLinkerLanguage(this->GetGlobalGenerator()); + std::string linkRuleVar = "CMAKE_"; + linkRuleVar += linkLanguage; + linkRuleVar += "_CREATE_SHARED_MODULE"; + + std::string extraFlags; + this->AppendFlags(extraFlags, target.GetProperty("LINK_FLAGS")); + this->AddConfigVariableFlags(extraFlags, "CMAKE_MODULE_LINKER_FLAGS"); + // TODO: Should .def files be supported here also? + this->WriteLibraryRule(ruleFileStream, ruleFileName, target, objects, + linkRuleVar.c_str(), extraFlags.c_str()); } //---------------------------------------------------------------------------- @@ -731,7 +799,7 @@ cmLocalUnixMakefileGenerator2 const cmTarget& target, std::vector& objects, const char* linkRuleVar, - const char* flagsPropertyName) + const char* extraFlags) { std::vector commands; @@ -747,11 +815,7 @@ cmLocalUnixMakefileGenerator2 const char* linkLanguage = target.GetLinkerLanguage(this->GetGlobalGenerator()); std::string linkFlags; - if(const char* targetLinkFlags = target.GetProperty(flagsPropertyName)) - { - linkFlags += " "; - linkFlags += targetLinkFlags; - } + this->AppendFlags(linkFlags, extraFlags); std::string targetName; std::string targetNameSO; std::string targetNameReal; diff --git a/Source/cmLocalUnixMakefileGenerator2.h b/Source/cmLocalUnixMakefileGenerator2.h index 5f3c89b09..e269fe272 100644 --- a/Source/cmLocalUnixMakefileGenerator2.h +++ b/Source/cmLocalUnixMakefileGenerator2.h @@ -66,12 +66,20 @@ protected: const char* ruleFileName, const cmTarget& target, std::vector& objects); + void WriteSharedLibraryRule(std::ostream& ruleFileStream, + const char* ruleFileName, + const cmTarget& target, + std::vector& objects); + void WriteModuleLibraryRule(std::ostream& ruleFileStream, + const char* ruleFileName, + const cmTarget& target, + std::vector& objects); void WriteLibraryRule(std::ostream& ruleFileStream, const char* ruleFileName, const cmTarget& target, std::vector& objects, const char* linkRuleVar, - const char* flagsPropertyName); + const char* extraLinkFlags); std::string GetTargetDirectory(const cmTarget& target); std::string GetObjectFileName(const cmTarget& target,