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")
|
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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(), "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue