Support building shared libraries or modules without soname (#13155)
Add a boolean target property NO_SONAME which may be used to disable soname for the specified shared library or module even if the platform supports it. This property should be useful for private shared libraries or various plugins which live in private directories and have not been designed to be found or loaded globally. Replace references to <CMAKE_SHARED_LIBRARY_SONAME_${LANG}_FLAG> and hard-coded -install_name flags with a conditional <SONAME_FLAG> which is expanded to the value of the CMAKE_SHARED_LIBRARY_SONAME_${LANG}_FLAG definition as long as soname supports is enabled for the target in question. Keep expanding CMAKE_SHARED_LIBRARY_SONAME_${LANG}_FLAG in rules in case third party projects still use it. Such projects would not yet use NO_SONAME so the adjacent <TARGET_SONAME> will always be expanded. Make <TARGET_INSTALLNAME_DIR> NO_SONAME aware as well. Since -install_name is soname on OS X, this should not be a problem if this variable is expanded only if soname is enabled. The Ninja generator performs rule variable substitution only once globally per rule to put its own placeholders. Final substitution is performed by ninja at build time. Therefore we cannot conditionally replace the soname placeholders on a per-target basis. Rather than omitting $SONAME from rules.ninja, simply do not write its contents for targets which have NO_SONAME. Since 3 variables are affected by NO_SONAME ($SONAME, $SONAME_FLAG, $INSTALLNAME_DIR), set them only if soname is enabled.
This commit is contained in:
parent
3a50392601
commit
e1409ac59b
|
@ -164,7 +164,7 @@ INCLUDE(CMakeCommonLanguageInclude)
|
||||||
# create a C shared library
|
# create a C shared library
|
||||||
IF(NOT CMAKE_C_CREATE_SHARED_LIBRARY)
|
IF(NOT CMAKE_C_CREATE_SHARED_LIBRARY)
|
||||||
SET(CMAKE_C_CREATE_SHARED_LIBRARY
|
SET(CMAKE_C_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
ENDIF(NOT CMAKE_C_CREATE_SHARED_LIBRARY)
|
ENDIF(NOT CMAKE_C_CREATE_SHARED_LIBRARY)
|
||||||
|
|
||||||
# create a C shared module just copy the shared library rule
|
# create a C shared module just copy the shared library rule
|
||||||
|
|
|
@ -242,7 +242,7 @@ INCLUDE(CMakeCommonLanguageInclude)
|
||||||
# create a shared C++ library
|
# create a shared C++ library
|
||||||
IF(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY)
|
IF(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY)
|
||||||
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
ENDIF(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY)
|
ENDIF(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY)
|
||||||
|
|
||||||
# create a c++ shared module copy the shared library rule by default
|
# create a c++ shared module copy the shared library rule by default
|
||||||
|
|
|
@ -171,7 +171,7 @@ INCLUDE(CMakeCommonLanguageInclude)
|
||||||
# create a Fortran shared library
|
# create a Fortran shared library
|
||||||
IF(NOT CMAKE_Fortran_CREATE_SHARED_LIBRARY)
|
IF(NOT CMAKE_Fortran_CREATE_SHARED_LIBRARY)
|
||||||
SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_Fortran_COMPILER> <CMAKE_SHARED_LIBRARY_Fortran_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_Fortran_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_Fortran_COMPILER> <CMAKE_SHARED_LIBRARY_Fortran_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
ENDIF(NOT CMAKE_Fortran_CREATE_SHARED_LIBRARY)
|
ENDIF(NOT CMAKE_Fortran_CREATE_SHARED_LIBRARY)
|
||||||
|
|
||||||
# create a Fortran shared module just copy the shared library rule
|
# create a Fortran shared module just copy the shared library rule
|
||||||
|
|
|
@ -47,7 +47,7 @@ macro(__compiler_xl lang)
|
||||||
# files so that we export only the symbols actually provided by the sources.
|
# files so that we export only the symbols actually provided by the sources.
|
||||||
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
|
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
|
||||||
"${CMAKE_XL_CreateExportList} <OBJECT_DIR>/objects.exp <OBJECTS>"
|
"${CMAKE_XL_CreateExportList} <OBJECT_DIR>/objects.exp <OBJECTS>"
|
||||||
"<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
|
"<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
|
@ -84,11 +84,11 @@ ENDIF(XCODE)
|
||||||
SET(CMAKE_MacOSX_Content_COMPILE_OBJECT "\"${CMAKE_COMMAND}\" -E copy_if_different <SOURCE> <OBJECT>")
|
SET(CMAKE_MacOSX_Content_COMPILE_OBJECT "\"${CMAKE_COMMAND}\" -E copy_if_different <SOURCE> <OBJECT>")
|
||||||
|
|
||||||
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> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
|
|
||||||
SET(CMAKE_CXX_CREATE_SHARED_MODULE
|
SET(CMAKE_CXX_CREATE_SHARED_MODULE
|
||||||
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
|
|
|
@ -207,11 +207,11 @@ ENDIF()
|
||||||
SET(CMAKE_C_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS -w)
|
SET(CMAKE_C_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS -w)
|
||||||
SET(CMAKE_CXX_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> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
|
|
||||||
SET(CMAKE_CXX_CREATE_SHARED_MODULE
|
SET(CMAKE_CXX_CREATE_SHARED_MODULE
|
||||||
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
|
@ -223,9 +223,9 @@ SET(CMAKE_Fortran_CREATE_SHARED_MODULE
|
||||||
"<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
|
|
||||||
SET(CMAKE_C_CREATE_MACOSX_FRAMEWORK
|
SET(CMAKE_C_CREATE_MACOSX_FRAMEWORK
|
||||||
"<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> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
SET(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK
|
SET(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK
|
||||||
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ ENDIF(CMAKE_SYSTEM MATCHES "SunOS-4.*")
|
||||||
IF(CMAKE_COMPILER_IS_GNUCXX)
|
IF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
IF(CMAKE_COMPILER_IS_GNUCC)
|
IF(CMAKE_COMPILER_IS_GNUCC)
|
||||||
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
|
||||||
"<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
"<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
|
||||||
ELSE(CMAKE_COMPILER_IS_GNUCC)
|
ELSE(CMAKE_COMPILER_IS_GNUCC)
|
||||||
# Take default rule from CMakeDefaultMakeRuleVariables.cmake.
|
# Take default rule from CMakeDefaultMakeRuleVariables.cmake.
|
||||||
ENDIF(CMAKE_COMPILER_IS_GNUCC)
|
ENDIF(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
|
|
@ -137,10 +137,20 @@ cmExportFileGenerator
|
||||||
(mf->IsOn("WIN32") || mf->IsOn("CYGWIN") || mf->IsOn("MINGW"));
|
(mf->IsOn("WIN32") || mf->IsOn("CYGWIN") || mf->IsOn("MINGW"));
|
||||||
if(!dll_platform)
|
if(!dll_platform)
|
||||||
{
|
{
|
||||||
std::string soname = target->GetSOName(config);
|
std::string prop;
|
||||||
std::string prop = "IMPORTED_SONAME";
|
std::string value;
|
||||||
|
if(target->HasSOName(config))
|
||||||
|
{
|
||||||
|
prop = "IMPORTED_SONAME";
|
||||||
|
value = target->GetSOName(config);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prop = "IMPORTED_NO_SONAME";
|
||||||
|
value = "TRUE";
|
||||||
|
}
|
||||||
prop += suffix;
|
prop += suffix;
|
||||||
properties[prop] = soname;
|
properties[prop] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -954,29 +954,27 @@ cmLocalGenerator::ExpandRuleVariable(std::string const& variable,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(replaceValues.TargetSOName)
|
if(variable == "TARGET_SONAME" || variable == "SONAME_FLAG" ||
|
||||||
|
variable == "TARGET_INSTALLNAME_DIR")
|
||||||
{
|
{
|
||||||
if(variable == "TARGET_SONAME")
|
// All these variables depend on TargetSOName
|
||||||
|
if(replaceValues.TargetSOName)
|
||||||
{
|
{
|
||||||
if(replaceValues.Language)
|
if(variable == "TARGET_SONAME")
|
||||||
{
|
{
|
||||||
std::string name = "CMAKE_SHARED_LIBRARY_SONAME_";
|
return replaceValues.TargetSOName;
|
||||||
name += replaceValues.Language;
|
}
|
||||||
name += "_FLAG";
|
if(variable == "SONAME_FLAG" && replaceValues.SONameFlag)
|
||||||
if(this->Makefile->GetDefinition(name.c_str()))
|
{
|
||||||
{
|
return replaceValues.SONameFlag;
|
||||||
return replaceValues.TargetSOName;
|
}
|
||||||
}
|
if(replaceValues.TargetInstallNameDir &&
|
||||||
|
variable == "TARGET_INSTALLNAME_DIR")
|
||||||
|
{
|
||||||
|
return replaceValues.TargetInstallNameDir;
|
||||||
}
|
}
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(replaceValues.TargetInstallNameDir)
|
|
||||||
{
|
|
||||||
if(variable == "TARGET_INSTALLNAME_DIR")
|
|
||||||
{
|
|
||||||
return replaceValues.TargetInstallNameDir;
|
|
||||||
}
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
if(replaceValues.LinkLibraries)
|
if(replaceValues.LinkLibraries)
|
||||||
{
|
{
|
||||||
|
|
|
@ -228,6 +228,7 @@ public:
|
||||||
const char* ObjectDir;
|
const char* ObjectDir;
|
||||||
const char* Flags;
|
const char* Flags;
|
||||||
const char* ObjectsQuoted;
|
const char* ObjectsQuoted;
|
||||||
|
const char* SONameFlag;
|
||||||
const char* TargetSOName;
|
const char* TargetSOName;
|
||||||
const char* TargetInstallNameDir;
|
const char* TargetInstallNameDir;
|
||||||
const char* LinkFlags;
|
const char* LinkFlags;
|
||||||
|
|
|
@ -2201,6 +2201,14 @@ bool cmMakefile::PlatformIs64Bit() const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* cmMakefile::GetSONameFlag(const char* language) const
|
||||||
|
{
|
||||||
|
std::string name = "CMAKE_SHARED_LIBRARY_SONAME_";
|
||||||
|
name += language;
|
||||||
|
name += "_FLAG";
|
||||||
|
return GetDefinition(name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
bool cmMakefile::CanIWriteThisFile(const char* fileName)
|
bool cmMakefile::CanIWriteThisFile(const char* fileName)
|
||||||
{
|
{
|
||||||
if ( !this->IsOn("CMAKE_DISABLE_SOURCE_CHANGES") )
|
if ( !this->IsOn("CMAKE_DISABLE_SOURCE_CHANGES") )
|
||||||
|
|
|
@ -593,6 +593,9 @@ public:
|
||||||
/** Return whether the target platform is 64-bit. */
|
/** Return whether the target platform is 64-bit. */
|
||||||
bool PlatformIs64Bit() const;
|
bool PlatformIs64Bit() const;
|
||||||
|
|
||||||
|
/** Retrieve soname flag for the specified language if supported */
|
||||||
|
const char* GetSONameFlag(const char* language) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of preprocessor define flags.
|
* Get a list of preprocessor define flags.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -714,7 +714,11 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
|
||||||
std::string linkString = linklibs.str();
|
std::string linkString = linklibs.str();
|
||||||
vars.LinkLibraries = linkString.c_str();
|
vars.LinkLibraries = linkString.c_str();
|
||||||
vars.ObjectsQuoted = buildObjs.c_str();
|
vars.ObjectsQuoted = buildObjs.c_str();
|
||||||
vars.TargetSOName= targetNameSO.c_str();
|
if (this->Target->HasSOName(this->ConfigName))
|
||||||
|
{
|
||||||
|
vars.SONameFlag = this->Makefile->GetSONameFlag(linkLanguage);
|
||||||
|
vars.TargetSOName= targetNameSO.c_str();
|
||||||
|
}
|
||||||
vars.LinkFlags = linkFlags.c_str();
|
vars.LinkFlags = linkFlags.c_str();
|
||||||
|
|
||||||
// Compute the directory portion of the install_name setting.
|
// Compute the directory portion of the install_name setting.
|
||||||
|
|
|
@ -152,6 +152,7 @@ cmNinjaNormalTargetGenerator
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
vars.ObjectDir = objdir.c_str();
|
vars.ObjectDir = objdir.c_str();
|
||||||
vars.Target = "$out";
|
vars.Target = "$out";
|
||||||
|
vars.SONameFlag = "$SONAME_FLAG";
|
||||||
vars.TargetSOName = "$SONAME";
|
vars.TargetSOName = "$SONAME";
|
||||||
vars.TargetInstallNameDir = "$INSTALLNAME_DIR";
|
vars.TargetInstallNameDir = "$INSTALLNAME_DIR";
|
||||||
vars.TargetPDB = "$TARGET_PDB";
|
vars.TargetPDB = "$TARGET_PDB";
|
||||||
|
@ -366,17 +367,20 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
|
||||||
this->GetTarget(),
|
this->GetTarget(),
|
||||||
this->TargetLinkLanguage,
|
this->TargetLinkLanguage,
|
||||||
this->GetConfigName());
|
this->GetConfigName());
|
||||||
vars["SONAME"] = this->TargetNameSO;
|
if (this->GetTarget()->HasSOName(this->GetConfigName())) {
|
||||||
|
vars["SONAME_FLAG"] =
|
||||||
|
this->GetMakefile()->GetSONameFlag(this->TargetLinkLanguage);
|
||||||
|
vars["SONAME"] = this->TargetNameSO;
|
||||||
|
if (targetType == cmTarget::SHARED_LIBRARY) {
|
||||||
|
std::string install_name_dir = this->GetTarget()
|
||||||
|
->GetInstallNameDirForBuildTree(this->GetConfigName());
|
||||||
|
|
||||||
if (targetType == cmTarget::SHARED_LIBRARY) {
|
if (!install_name_dir.empty()) {
|
||||||
std::string install_name_dir =
|
vars["INSTALLNAME_DIR"] =
|
||||||
this->GetTarget()->GetInstallNameDirForBuildTree(this->GetConfigName());
|
this->GetLocalGenerator()->Convert(install_name_dir.c_str(),
|
||||||
|
cmLocalGenerator::NONE,
|
||||||
if (!install_name_dir.empty()) {
|
cmLocalGenerator::SHELL, false);
|
||||||
vars["INSTALLNAME_DIR"] =
|
}
|
||||||
this->GetLocalGenerator()->Convert(install_name_dir.c_str(),
|
|
||||||
cmLocalGenerator::NONE,
|
|
||||||
cmLocalGenerator::SHELL, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -822,6 +822,19 @@ void cmTarget::DefineProperties(cmake *cm)
|
||||||
"This property is initialized by the value of the variable "
|
"This property is initialized by the value of the variable "
|
||||||
"CMAKE_SKIP_BUILD_RPATH if it is set when a target is created.");
|
"CMAKE_SKIP_BUILD_RPATH if it is set when a target is created.");
|
||||||
|
|
||||||
|
cm->DefineProperty
|
||||||
|
("NO_SONAME", cmProperty::TARGET,
|
||||||
|
"Whether to set \"soname\" when linking a shared library or module.",
|
||||||
|
"Enable this boolean property if a generated shared library or module "
|
||||||
|
"should not have \"soname\" set. Default is to set \"soname\" on all "
|
||||||
|
"shared libraries and modules as long as the platform supports it. "
|
||||||
|
"Generally, use this property only for leaf private libraries or "
|
||||||
|
"plugins. If you use it on normal shared libraries which other targets "
|
||||||
|
"link against, on some platforms a linker will insert a full path to "
|
||||||
|
"the library (as specified at link time) into the dynamic section of "
|
||||||
|
"the dependant binary. Therefore, once installed, dynamic linker may "
|
||||||
|
"eventually fail to locate the library for the binary.");
|
||||||
|
|
||||||
cm->DefineProperty
|
cm->DefineProperty
|
||||||
("SOVERSION", cmProperty::TARGET,
|
("SOVERSION", cmProperty::TARGET,
|
||||||
"What version number is this target.",
|
"What version number is this target.",
|
||||||
|
@ -831,6 +844,7 @@ void cmTarget::DefineProperties(cmake *cm)
|
||||||
"supports symlinks and the linker supports so-names. "
|
"supports symlinks and the linker supports so-names. "
|
||||||
"If only one of both is specified the missing is assumed to have "
|
"If only one of both is specified the missing is assumed to have "
|
||||||
"the same version number. "
|
"the same version number. "
|
||||||
|
"SOVERSION is ignored if NO_SONAME property is set. "
|
||||||
"For shared libraries and executables on Windows the VERSION "
|
"For shared libraries and executables on Windows the VERSION "
|
||||||
"attribute is parsed to extract a \"major.minor\" version number. "
|
"attribute is parsed to extract a \"major.minor\" version number. "
|
||||||
"These numbers are used as the image version of the binary. ");
|
"These numbers are used as the image version of the binary. ");
|
||||||
|
@ -2994,6 +3008,17 @@ std::string cmTarget::GetPDBName(const char* config)
|
||||||
return prefix+base+".pdb";
|
return prefix+base+".pdb";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool cmTarget::HasSOName(const char* config)
|
||||||
|
{
|
||||||
|
// soname is supported only for shared libraries and modules,
|
||||||
|
// and then only when the platform supports an soname flag.
|
||||||
|
return ((this->GetType() == cmTarget::SHARED_LIBRARY ||
|
||||||
|
this->GetType() == cmTarget::MODULE_LIBRARY) &&
|
||||||
|
!this->GetPropertyAsBool("NO_SONAME") &&
|
||||||
|
this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config)));
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string cmTarget::GetSOName(const char* config)
|
std::string cmTarget::GetSOName(const char* config)
|
||||||
{
|
{
|
||||||
|
@ -3327,22 +3352,10 @@ void cmTarget::GetLibraryNames(std::string& name,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct the name of the soname flag variable for this language.
|
|
||||||
const char* ll = this->GetLinkerLanguage(config);
|
|
||||||
std::string sonameFlag = "CMAKE_SHARED_LIBRARY_SONAME";
|
|
||||||
if(ll)
|
|
||||||
{
|
|
||||||
sonameFlag += "_";
|
|
||||||
sonameFlag += ll;
|
|
||||||
}
|
|
||||||
sonameFlag += "_FLAG";
|
|
||||||
|
|
||||||
// Check for library version properties.
|
// Check for library version properties.
|
||||||
const char* version = this->GetProperty("VERSION");
|
const char* version = this->GetProperty("VERSION");
|
||||||
const char* soversion = this->GetProperty("SOVERSION");
|
const char* soversion = this->GetProperty("SOVERSION");
|
||||||
if((this->GetType() != cmTarget::SHARED_LIBRARY &&
|
if(!this->HasSOName(config) ||
|
||||||
this->GetType() != cmTarget::MODULE_LIBRARY) ||
|
|
||||||
!this->Makefile->GetDefinition(sonameFlag.c_str()) ||
|
|
||||||
this->IsFrameworkOnApple())
|
this->IsFrameworkOnApple())
|
||||||
{
|
{
|
||||||
// Versioning is supported only for shared libraries and modules,
|
// Versioning is supported only for shared libraries and modules,
|
||||||
|
|
|
@ -347,6 +347,9 @@ public:
|
||||||
/** Get the name of the pdb file for the target. */
|
/** Get the name of the pdb file for the target. */
|
||||||
std::string GetPDBName(const char* config=0);
|
std::string GetPDBName(const char* config=0);
|
||||||
|
|
||||||
|
/** Whether this library has soname enabled and platform supports it. */
|
||||||
|
bool HasSOName(const char* config);
|
||||||
|
|
||||||
/** Get the soname of the target. Allowed only for a shared library. */
|
/** Get the soname of the target. Allowed only for a shared library. */
|
||||||
std::string GetSOName(const char* config);
|
std::string GetSOName(const char* config);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue