ENH: Added option CMAKE_INSTALL_SO_NO_EXE on linux to choose whether the default permissions for shared libraries include the executable bit. This is necessary to support the conflicting policies of Debian and Fedora. These changes address bug#4805.

This commit is contained in:
Brad King 2007-04-10 11:22:15 -04:00
parent 8b0c61c322
commit a017333d9a
3 changed files with 62 additions and 9 deletions

View File

@ -18,4 +18,41 @@ FOREACH(type SHARED_LIBRARY SHARED_MODULE EXE)
SET(CMAKE_${type}_LINK_DYNAMIC_C_FLAGS "-Wl,-Bdynamic")
ENDFOREACH(type)
# Debian policy requires that shared libraries be installed without
# executable permission. Fedora policy requires that shared libraries
# be installed with the executable permission. Since the native tools
# create shared libraries with execute permission in the first place a
# reasonable policy seems to be to install with execute permission by
# default. In order to support debian packages we provide an option
# here. The option default is based on the current distribution, but
# packagers can set it explicitly on the command line.
IF(DEFINED CMAKE_INSTALL_SO_NO_EXE)
# Store the decision variable in the cache. This preserves any
# setting the user provides on the command line.
SET(CMAKE_INSTALL_SO_NO_EXE "${CMAKE_INSTALL_SO_NO_EXE}" CACHE INTERNAL
"Install .so files without execute permission.")
ELSE(DEFINED CMAKE_INSTALL_SO_NO_EXE)
# Detect the linux distribution.
SET(CMAKE_LINUX_DISTRO)
IF(EXISTS "/proc/version")
FILE(READ "/proc/version" CMAKE_LINUX_DISTRO)
ENDIF(EXISTS "/proc/version")
# List the distributions that require shared libraries to not have
# execute permission.
SET(CMAKE_INSTALL_SO_NO_EXE_DISTRO "(Debian|Ubuntu)")
# Store the decision variable as an internal cache entry to avoid
# checking the platform every time. This option is advanced enough
# that only package maintainers should need to adjust it. They are
# capable of providing a setting on the command line.
IF("${CMAKE_LINUX_DISTRO}" MATCHES "${CMAKE_INSTALL_SO_NO_EXE_DISTRO}")
SET(CMAKE_INSTALL_SO_NO_EXE 1 CACHE INTERNAL
"Install .so files without execute permission.")
ELSE("${CMAKE_LINUX_DISTRO}" MATCHES "${CMAKE_INSTALL_SO_NO_EXE_DISTRO}")
SET(CMAKE_INSTALL_SO_NO_EXE 0 CACHE INTERNAL
"Install .so files without execute permission.")
ENDIF("${CMAKE_LINUX_DISTRO}" MATCHES "${CMAKE_INSTALL_SO_NO_EXE_DISTRO}")
ENDIF(DEFINED CMAKE_INSTALL_SO_NO_EXE)
INCLUDE(Platform/UnixPaths)

View File

@ -1184,6 +1184,9 @@ bool cmFileCommand::HandleInstallCommand(
}
}
// Choose a default for shared library permissions.
bool install_so_no_exe = this->Makefile->IsOn("CMAKE_INSTALL_SO_NO_EXE");
// If file permissions were not specified set default permissions
// for this target type.
if(!use_given_permissions_file && !use_source_permissions)
@ -1192,15 +1195,16 @@ bool cmFileCommand::HandleInstallCommand(
{
case cmTarget::SHARED_LIBRARY:
case cmTarget::MODULE_LIBRARY:
#if defined(__linux__)
// Use read/write permissions.
permissions_file = 0;
permissions_file |= mode_owner_read;
permissions_file |= mode_owner_write;
permissions_file |= mode_group_read;
permissions_file |= mode_world_read;
break;
#endif
if(install_so_no_exe)
{
// Use read/write permissions.
permissions_file = 0;
permissions_file |= mode_owner_read;
permissions_file |= mode_owner_write;
permissions_file |= mode_group_read;
permissions_file |= mode_world_read;
break;
}
case cmTarget::EXECUTABLE:
case cmTarget::INSTALL_PROGRAMS:
// Use read/write/executable permissions.

View File

@ -393,6 +393,18 @@ void cmLocalGenerator::GenerateInstallRules()
"ENDIF(NOT CMAKE_INSTALL_COMPONENT)\n"
"\n";
// Copy user-specified install options to the install code.
if(const char* so_no_exe =
this->Makefile->GetDefinition("CMAKE_INSTALL_SO_NO_EXE"))
{
fout <<
"# Install shared libraries without execute permission?\n"
"IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n"
" SET(CMAKE_INSTALL_SO_NO_EXE \"" << so_no_exe << "\")\n"
"ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)\n"
"\n";
}
// Ask each install generator to write its code.
std::vector<cmInstallGenerator*> const& installers =
this->Makefile->GetInstallGenerators();