ENH: add support for removing language flags from shared library and shared module link commands

This commit is contained in:
Bill Hoffman 2006-03-14 14:03:16 -05:00
parent 8e702ac5a8
commit 88bd3b5281
4 changed files with 44 additions and 5 deletions

View File

@ -24,6 +24,8 @@ IF(NOT XCODE)
SET(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-install_name") SET(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-install_name")
ENDIF(NOT XCODE) ENDIF(NOT XCODE)
SET(CMAKE_C_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS -w)
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS -w)
SET(CMAKE_C_CREATE_SHARED_LIBRARY SET(CMAKE_C_CREATE_SHARED_LIBRARY
"<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY SET(CMAKE_CXX_CREATE_SHARED_LIBRARY

View File

@ -246,16 +246,23 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
// Add the link message. // Add the link message.
std::string buildEcho = "Linking "; std::string buildEcho = "Linking ";
buildEcho += linkLanguage; buildEcho += linkLanguage;
const char* forbiddenFlagVar = 0;
switch(this->Target->GetType()) switch(this->Target->GetType())
{ {
case cmTarget::STATIC_LIBRARY: case cmTarget::STATIC_LIBRARY:
buildEcho += " static library "; break; buildEcho += " static library ";
break;
case cmTarget::SHARED_LIBRARY: case cmTarget::SHARED_LIBRARY:
buildEcho += " shared library "; break; forbiddenFlagVar = "_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS";
buildEcho += " shared library ";
break;
case cmTarget::MODULE_LIBRARY: case cmTarget::MODULE_LIBRARY:
buildEcho += " shared module "; break; forbiddenFlagVar = "_CREATE_SHARED_MODULE_FORBIDDEN_FLAGS";
buildEcho += " shared module ";
break;
default: default:
buildEcho += " library "; break; buildEcho += " library ";
break;
} }
buildEcho += targetOutPath.c_str(); buildEcho += targetOutPath.c_str();
this->LocalGenerator->AppendEcho(commands, buildEcho.c_str()); this->LocalGenerator->AppendEcho(commands, buildEcho.c_str());
@ -436,6 +443,13 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
this->LocalGenerator this->LocalGenerator
->AddLanguageFlags(langFlags, linkLanguage, ->AddLanguageFlags(langFlags, linkLanguage,
this->LocalGenerator->m_ConfigurationName.c_str()); this->LocalGenerator->m_ConfigurationName.c_str());
// remove any language flags that might not work with the
// particular os
if(forbiddenFlagVar)
{
this->RemoveForbiddenFlags(forbiddenFlagVar,
linkLanguage, langFlags);
}
vars.LanguageCompileFlags = langFlags.c_str(); vars.LanguageCompileFlags = langFlags.c_str();
// Expand placeholders in the commands. // Expand placeholders in the commands.
this->LocalGenerator->m_TargetImplib = targetOutPathImport; this->LocalGenerator->m_TargetImplib = targetOutPathImport;

View File

@ -799,3 +799,25 @@ void cmMakefileTargetGenerator
delete this->InfoFileStream; delete this->InfoFileStream;
delete this->FlagFileStream; delete this->FlagFileStream;
} }
void cmMakefileTargetGenerator::RemoveForbiddenFlags(const char* flagVar,
const char* linkLang,
std::string& linkFlags)
{
// check for language flags that are not allowed at link time, and
// remove them, -w on darwin for gcc -w -dynamiclib sends -w to libtool
// which fails, there may be more]
std::string removeFlags = "CMAKE_";
removeFlags += linkLang;
removeFlags += flagVar;
std::string removeflags =
this->Makefile->GetSafeDefinition(removeFlags.c_str());
std::vector<std::string> removeList;
cmSystemTools::ExpandListArgument(removeflags, removeList);
for(std::vector<std::string>::iterator i = removeList.begin();
i != removeList.end(); ++i)
{
cmSystemTools::ReplaceString(linkFlags, i->c_str(), "");
}
}

View File

@ -99,7 +99,8 @@ protected:
void AppendTargetDepends(std::vector<std::string>& depends); void AppendTargetDepends(std::vector<std::string>& depends);
virtual void CloseFileStreams(); virtual void CloseFileStreams();
void RemoveForbiddenFlags(const char* flagVar, const char* linkLang,
std::string& linkFlags);
cmStdString TargetName; cmStdString TargetName;
cmTarget *Target; cmTarget *Target;
cmLocalUnixMakefileGenerator3 *LocalGenerator; cmLocalUnixMakefileGenerator3 *LocalGenerator;