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")
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
"<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

View File

@ -246,16 +246,23 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
// Add the link message.
std::string buildEcho = "Linking ";
buildEcho += linkLanguage;
const char* forbiddenFlagVar = 0;
switch(this->Target->GetType())
{
case cmTarget::STATIC_LIBRARY:
buildEcho += " static library "; break;
buildEcho += " static library ";
break;
case cmTarget::SHARED_LIBRARY:
buildEcho += " shared library "; break;
forbiddenFlagVar = "_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS";
buildEcho += " shared library ";
break;
case cmTarget::MODULE_LIBRARY:
buildEcho += " shared module "; break;
forbiddenFlagVar = "_CREATE_SHARED_MODULE_FORBIDDEN_FLAGS";
buildEcho += " shared module ";
break;
default:
buildEcho += " library "; break;
buildEcho += " library ";
break;
}
buildEcho += targetOutPath.c_str();
this->LocalGenerator->AppendEcho(commands, buildEcho.c_str());
@ -436,6 +443,13 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
this->LocalGenerator
->AddLanguageFlags(langFlags, linkLanguage,
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();
// Expand placeholders in the commands.
this->LocalGenerator->m_TargetImplib = targetOutPathImport;

View File

@ -799,3 +799,25 @@ void cmMakefileTargetGenerator
delete this->InfoFileStream;
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);
virtual void CloseFileStreams();
void RemoveForbiddenFlags(const char* flagVar, const char* linkLang,
std::string& linkFlags);
cmStdString TargetName;
cmTarget *Target;
cmLocalUnixMakefileGenerator3 *LocalGenerator;