ENH: add support for removing language flags from shared library and shared module link commands
This commit is contained in:
parent
8e702ac5a8
commit
88bd3b5281
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(), "");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue