Merge topic 'linux-lib64-handling'

126c993 Fix #11964 Handle lib64 library on Linux
This commit is contained in:
Brad King 2011-04-05 14:28:23 -04:00 committed by CMake Topic Stage
commit 3b16aa622e
3 changed files with 26 additions and 174 deletions

View File

@ -11,7 +11,7 @@
# SYSCONFDIR - read-only single-machine data (etc) # SYSCONFDIR - read-only single-machine data (etc)
# SHAREDSTATEDIR - modifiable architecture-independent data (com) # SHAREDSTATEDIR - modifiable architecture-independent data (com)
# LOCALSTATEDIR - modifiable single-machine data (var) # LOCALSTATEDIR - modifiable single-machine data (var)
# LIBDIR - object code libraries (lib) # LIBDIR - object code libraries (lib or lib64)
# INCLUDEDIR - C header files (include) # INCLUDEDIR - C header files (include)
# OLDINCLUDEDIR - C header files for non-gcc (/usr/include) # OLDINCLUDEDIR - C header files for non-gcc (/usr/include)
# DATAROOTDIR - read-only architecture-independent data root (share) # DATAROOTDIR - read-only architecture-independent data root (share)
@ -69,7 +69,28 @@ if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
endif() endif()
if(NOT DEFINED CMAKE_INSTALL_LIBDIR) if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
set(CMAKE_INSTALL_LIBDIR "lib" CACHE PATH "object code libraries (lib)") set(_LIBDIR_DEFAULT "lib")
# Override this default 'lib' with 'lib64' iff:
# - we are on Linux system but NOT cross-compiling
# - we are NOT on debian
# - we are on a 64 bits system
# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
# Note that the future of multi-arch handling may be even
# more complicated than that: http://wiki.debian.org/Multiarch
if(CMAKE_SYSTEM_NAME MATCHES "Linux"
AND NOT CMAKE_CROSSCOMPILING
AND NOT EXISTS "/etc/debian_version")
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
message(AUTHOR_WARNING
"Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
"Please enable at least one language before including GNUInstallDirs.")
else()
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
set(_LIBDIR_DEFAULT "lib64")
endif()
endif()
endif()
set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
endif() endif()
if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)

View File

@ -10,13 +10,8 @@
cmake_minimum_required(VERSION 2.8.3.20101130 FATAL_ERROR) cmake_minimum_required(VERSION 2.8.3.20101130 FATAL_ERROR)
project(CPackComponentsForAll) project(CPackComponentsForAll)
set(LIBDEST "lib") # Use GNUInstallDirs in order to enforce lib64 if needed
include(${CMAKE_SOURCE_DIR}/SystemSpecificInformations.cmake) include(GNUInstallDirs)
if(DISTRO_ID MATCHES "SUSE")
if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
set(LIBDEST "lib64")
endif("${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
endif(DISTRO_ID MATCHES "SUSE")
# Create the mylib library # Create the mylib library
add_library(mylib mylib.cpp) add_library(mylib mylib.cpp)
@ -35,7 +30,7 @@ target_link_libraries(mylibapp2 mylib)
# be used to create the installation components. # be used to create the installation components.
install(TARGETS mylib install(TARGETS mylib
ARCHIVE ARCHIVE
DESTINATION ${LIBDEST} DESTINATION ${CMAKE_INSTALL_LIBDIR}
COMPONENT libraries) COMPONENT libraries)
install(TARGETS mylibapp install(TARGETS mylibapp
RUNTIME RUNTIME

View File

@ -1,164 +0,0 @@
# define a set of string with may-be useful readable name
# this file is meant to be included in a CMakeLists.txt
# not as a standalone CMake script
set(SPECIFIC_COMPILER_NAME "")
set(SPECIFIC_SYSTEM_VERSION_NAME "")
set(SPECIFIC_SYSTEM_PREFERED_CPACK_GENERATOR "")
# In the WIN32 case try to guess a "readable system name"
if(WIN32)
set(SPECIFIC_SYSTEM_PREFERED_PACKAGE "NSIS")
# information taken from
# http://www.codeguru.com/cpp/w-p/system/systeminformation/article.php/c8973/
# Win9x series
if(CMAKE_SYSTEM_VERSION MATCHES "4.0")
set(SPECIFIC_SYSTEM_VERSION_NAME "Win95")
endif(CMAKE_SYSTEM_VERSION MATCHES "4.0")
if(CMAKE_SYSTEM_VERSION MATCHES "4.10")
set(SPECIFIC_SYSTEM_VERSION_NAME "Win98")
endif(CMAKE_SYSTEM_VERSION MATCHES "4.10")
if(CMAKE_SYSTEM_VERSION MATCHES "4.90")
set(SPECIFIC_SYSTEM_VERSION_NAME "WinME")
endif(CMAKE_SYSTEM_VERSION MATCHES "4.90")
# WinNTyyy series
if(CMAKE_SYSTEM_VERSION MATCHES "3.0")
set(SPECIFIC_SYSTEM_VERSION_NAME "WinNT351")
endif(CMAKE_SYSTEM_VERSION MATCHES "3.0")
if(CMAKE_SYSTEM_VERSION MATCHES "4.1")
set(SPECIFIC_SYSTEM_VERSION_NAME "WinNT4")
endif(CMAKE_SYSTEM_VERSION MATCHES "4.1")
# Win2000/XP series
if(CMAKE_SYSTEM_VERSION MATCHES "5.0")
set(SPECIFIC_SYSTEM_VERSION_NAME "Win2000")
endif(CMAKE_SYSTEM_VERSION MATCHES "5.0")
if(CMAKE_SYSTEM_VERSION MATCHES "5.1")
set(SPECIFIC_SYSTEM_VERSION_NAME "WinXP")
endif(CMAKE_SYSTEM_VERSION MATCHES "5.1")
if(CMAKE_SYSTEM_VERSION MATCHES "5.2")
set(SPECIFIC_SYSTEM_VERSION_NAME "Win2003")
endif(CMAKE_SYSTEM_VERSION MATCHES "5.2")
# WinVista/7 series
if(CMAKE_SYSTEM_VERSION MATCHES "6.0")
set(SPECIFIC_SYSTEM_VERSION_NAME "WinVISTA")
endif(CMAKE_SYSTEM_VERSION MATCHES "6.0")
if(CMAKE_SYSTEM_VERSION MATCHES "6.1")
set(SPECIFIC_SYSTEM_VERSION_NAME "Win7")
endif(CMAKE_SYSTEM_VERSION MATCHES "6.1")
# Compilers
# taken from http://predef.sourceforge.net/precomp.html#sec34
if(MSVC)
set(SPECIFIC_COMPILER_NAME "MSVC-Unknown-${MSVC_VERSION}")
if(MSVC_VERSION EQUAL 1200)
set(SPECIFIC_COMPILER_NAME "MSVC-6.0")
endif(MSVC_VERSION EQUAL 1200)
if(MSVC_VERSION EQUAL 1300)
set(SPECIFIC_COMPILER_NAME "MSVC-7.0")
endif(MSVC_VERSION EQUAL 1300)
if(MSVC_VERSION EQUAL 1310)
set(SPECIFIC_COMPILER_NAME "MSVC-7.1-2003") #Visual Studio 2003
endif(MSVC_VERSION EQUAL 1310)
if(MSVC_VERSION EQUAL 1400)
set(SPECIFIC_COMPILER_NAME "MSVC-8.0-2005") #Visual Studio 2005
endif(MSVC_VERSION EQUAL 1400)
if(MSVC_VERSION EQUAL 1500)
set(SPECIFIC_COMPILER_NAME "MSVC-9.0-2008") #Visual Studio 2008
endif(MSVC_VERSION EQUAL 1500)
if(MSVC_VERSION EQUAL 1600)
set(SPECIFIC_COMPILER_NAME "MSVC-10.0-2010") #Visual Studio 2010
endif(MSVC_VERSION EQUAL 1600)
endif(MSVC)
if(MINGW)
set(SPECIFIC_COMPILER_NAME "MinGW")
endif(MINGW)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(SPECIFIC_SYSTEM_VERSION_NAME "${SPECIFIC_SYSTEM_VERSION_NAME}-x86_64")
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
endif(WIN32)
# In the Linux case try to guess the distro name/type
# using either lsb_release program or fallback
# to the content of the /etc/issue file
if(UNIX)
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(SPECIFIC_SYSTEM_VERSION_NAME "${CMAKE_SYSTEM_NAME}")
set(SPECIFIC_SYSTEM_PREFERED_CPACK_GENERATOR "TGZ")
find_program(LSB_RELEASE_EXECUTABLE lsb_release)
if(LSB_RELEASE_EXECUTABLE)
execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -i
OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "Distributor ID:(.*)" DISTRO_ID ${_TMP_LSB_RELEASE_OUTPUT})
string(STRIP "${CMAKE_MATCH_1}" DISTRO_ID)
# replace potential space with underscore
string(REPLACE " " "_" DISTRO_ID "${DISTRO_ID}")
execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -r
OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "Release:(.*)" DISTRO_RELEASE ${_TMP_LSB_RELEASE_OUTPUT})
string(STRIP "${CMAKE_MATCH_1}" DISTRO_RELEASE)
execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -c
OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "Codename:(.*)" DISTRO_CODENAME ${_TMP_LSB_RELEASE_OUTPUT})
string(STRIP "${CMAKE_MATCH_1}" DISTRO_CODENAME)
elseif (EXISTS "/etc/issue")
set(LINUX_NAME "")
file(READ "/etc/issue" LINUX_ISSUE)
# Fedora case
if(LINUX_ISSUE MATCHES "Fedora")
string(REGEX MATCH "release ([0-9]+)" FEDORA "${LINUX_ISSUE}")
set(DISTRO_ID "Fedora")
set(DISTRO_RELEASE "${CMAKE_MATCH_1}")
# FIXME can we find that in /etc/issue
set(DISTRO_CODENAME "")
endif(LINUX_ISSUE MATCHES "Fedora")
# Ubuntu case
if(LINUX_ISSUE MATCHES "Ubuntu")
string(REGEX MATCH "buntu ([0-9]+\\.[0-9]+)" UBUNTU "${LINUX_ISSUE}")
set(DISTRO_ID "Ubuntu")
set(DISTRO_RELEASE "${CMAKE_MATCH_1}")
# FIXME can we find that in /etc/issue
set(DISTRO_CODENAME "")
endif(LINUX_ISSUE MATCHES "Ubuntu")
# Debian case
if(LINUX_ISSUE MATCHES "Debian")
string(REGEX MATCH "Debian .*ux ([0-9]+\\.[0-9]+)"
DEBIAN "${LINUX_ISSUE}")
set(DISTRO_ID "Debian")
set(DISTRO_RELEASE "${CMAKE_MATCH_1}")
set(DISTRO_CODENAME "")
endif(LINUX_ISSUE MATCHES "Debian")
# Open SuSE case
if(LINUX_ISSUE MATCHES "SUSE")
string(REGEX MATCH "SUSE ([0-9]+\\.[0-9]+)" SUSE "${LINUX_ISSUE}")
set(DISTRO_ID "SUSE")
set(DISTRO_RELEASE "${CMAKE_MATCH_1}")
set(DISTRO_CODENAME "")
endif(LINUX_ISSUE MATCHES "SUSE")
# Mandriva case
# TODO
endif(LSB_RELEASE_EXECUTABLE)
# Now mangle some names
set(LINUX_NAME "${DISTRO_ID}_${DISTRO_RELEASE}")
if(DISTRO_ID MATCHES "Fedora|Mandriva|SUSE|OpenSUSE")
set(SPECIFIC_SYSTEM_PREFERED_CPACK_GENERATOR "RPM")
endif(DISTRO_ID MATCHES "Fedora|Mandriva|SUSE|OpenSUSE")
if(DISTRO_ID MATCHES "Debian|Ubuntu")
set(SPECIFIC_SYSTEM_PREFERED_CPACK_GENERATOR "DEB")
endif(DISTRO_ID MATCHES "Debian|Ubuntu")
if(LINUX_NAME)
set(SPECIFIC_SYSTEM_VERSION_NAME "${CMAKE_SYSTEM_NAME}-${LINUX_NAME}")
endif(LINUX_NAME)
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(SPECIFIC_SYSTEM_VERSION_NAME
"${SPECIFIC_SYSTEM_VERSION_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
set(SPECIFIC_COMPILER_NAME "")
endif(UNIX)