diff options
author | Stephen Kelly <steveire@gmail.com> | 2013-05-23 13:32:17 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2013-06-02 10:00:51 (GMT) |
commit | cd1fa537a03377974a4d0a27e592785f931a41e5 (patch) | |
tree | 4b8ca66e58a08ed81c1200700317b8ae6737a7d2 /Source/cmLocalGenerator.cxx | |
parent | 0e9f4bc00c6b26f254e74063e4026ac33b786513 (diff) | |
download | CMake-cd1fa537a03377974a4d0a27e592785f931a41e5.zip CMake-cd1fa537a03377974a4d0a27e592785f931a41e5.tar.gz CMake-cd1fa537a03377974a4d0a27e592785f931a41e5.tar.bz2 |
Add a COMPILE_OPTION for a VISIBILITY_INLINES_HIDDEN target property.
This corresponds to the g++ and clang++
option -fvisibility-inlines-hidden on linux. On Windows with MinGW,
this corresponds to -fno-keep-inline-dllexport. That option is
not supported by clang currently.
Diffstat (limited to 'Source/cmLocalGenerator.cxx')
-rw-r--r-- | Source/cmLocalGenerator.cxx | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 71dd3e9..dce1838 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1992,28 +1992,12 @@ void cmLocalGenerator::AddSharedFlags(std::string& flags, } } -//---------------------------------------------------------------------------- -void cmLocalGenerator -::AddVisibilityPresetFlags(std::string &flags, cmTarget* target, - const char *lang) +static void AddVisibilityCompileOption(std::string &flags, cmTarget* target, + cmLocalGenerator *lg, const char *lang) { - int targetType = target->GetType(); - bool suitableTarget = ((targetType == cmTarget::SHARED_LIBRARY) - || (targetType == cmTarget::MODULE_LIBRARY) - || (target->IsExecutableWithExports())); - - if (!suitableTarget) - { - return; - } - - if (!lang) - { - return; - } std::string l(lang); std::string compileOption = "CMAKE_" + l + "_COMPILE_OPTIONS_VISIBILITY"; - const char *opt = this->Makefile->GetDefinition(compileOption.c_str()); + const char *opt = lg->GetMakefile()->GetDefinition(compileOption.c_str()); if (!opt) { return; @@ -2037,7 +2021,50 @@ void cmLocalGenerator return; } std::string option = std::string(opt) + prop; - this->AppendFlags(flags, option.c_str()); + lg->AppendFlags(flags, option.c_str()); +} + +static void AddInlineVisibilityCompileOption(std::string &flags, + cmTarget* target, + cmLocalGenerator *lg) +{ + std::string compileOption + = "CMAKE_CXX_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN"; + const char *opt = lg->GetMakefile()->GetDefinition(compileOption.c_str()); + if (!opt) + { + return; + } + + bool prop = target->GetPropertyAsBool("VISIBILITY_INLINES_HIDDEN"); + if (!prop) + { + return; + } + lg->AppendFlags(flags, opt); +} + +//---------------------------------------------------------------------------- +void cmLocalGenerator +::AddVisibilityPresetFlags(std::string &flags, cmTarget* target, + const char *lang) +{ + int targetType = target->GetType(); + bool suitableTarget = ((targetType == cmTarget::SHARED_LIBRARY) + || (targetType == cmTarget::MODULE_LIBRARY) + || (target->IsExecutableWithExports())); + + if (!suitableTarget) + { + return; + } + + if (!lang) + { + return; + } + AddVisibilityCompileOption(flags, target, this, lang); + AddInlineVisibilityCompileOption(flags, target, this); } //---------------------------------------------------------------------------- |