GNUInstallDirs: Add special cases for certain prefixes

Teach the module to handle SYSCONFDIR and LOCALSTATEDIR properly if
CMAKE_INSTALL_PREFIX is set to `/` or `/usr` -- i.e. as expected by GNU
Coding Standard (i.e. set SYSCONFDIR to `/etc` and `LOCALSTATEDIR` to
`/var`).  Also if CMAKE_INSTALL_PREFIX is set to /opt/pkg, `SYSCONFDIR`
must be set to `/etc/opt/pkg` and `LOCALSTATEDIR` to `/var/opt/pkg`
according to FHS.
This commit is contained in:
Alex Turbov 2015-06-16 01:16:57 +07:00 committed by Brad King
parent 5f30f1754a
commit c8bd37ec68
4 changed files with 100 additions and 33 deletions

View File

@ -9,6 +9,9 @@
#
# .. _`GNU Coding Standards`: https://www.gnu.org/prep/standards/html_node/Directory-Variables.html
#
# Result Variables
# ^^^^^^^^^^^^^^^^
#
# Inclusion of this module defines the following variables:
#
# ``CMAKE_INSTALL_<dir>``
@ -22,7 +25,8 @@
# The absolute path generated from the corresponding ``CMAKE_INSTALL_<dir>``
# value. If the value is not already an absolute path, an absolute path
# is constructed typically by prepending the value of the
# :variable:`CMAKE_INSTALL_PREFIX` variable.
# :variable:`CMAKE_INSTALL_PREFIX` variable. However, there are some
# `special cases`_ as documented below.
#
# where ``<dir>`` is one of:
#
@ -60,8 +64,44 @@
#
# If the includer does not define a value the above-shown default will be
# used and the value will appear in the cache for editing by the user.
#
# Special Cases
# ^^^^^^^^^^^^^
#
# The following values of :variable:`CMAKE_INSTALL_PREFIX` are special:
#
# ``/``
#
# For ``<dir>`` other than the ``SYSCONFDIR`` and ``LOCALSTATEDIR``,
# the value of ``CMAKE_INSTALL_<dir>`` is prefixed with ``usr/`` if
# it is not user-specified as an absolute path. For example, the
# ``INCLUDEDIR`` value ``include`` becomes ``usr/include``.
# This is required by the `GNU Coding Standards`_, which state:
#
# When building the complete GNU system, the prefix will be empty
# and ``/usr`` will be a symbolic link to ``/``.
#
# ``/usr``
#
# For ``<dir>`` equal to ``SYSCONFDIR`` or ``LOCALSTATEDIR``, the
# ``CMAKE_INSTALL_FULL_<dir>`` is computed by prepending just ``/``
# to the value of ``CMAKE_INSTALL_<dir>`` if it is not user-specified
# as an absolute path. For example, the ``SYSCONFDIR`` value ``etc``
# becomes ``/etc``. This is required by the `GNU Coding Standards`_.
#
# ``/opt/...``
#
# For ``<dir>`` equal to ``SYSCONFDIR`` or ``LOCALSTATEDIR``, the
# ``CMAKE_INSTALL_FULL_<dir>`` is computed by *appending* the prefix
# to the value of ``CMAKE_INSTALL_<dir>`` if it is not user-specified
# as an absolute path. For example, the ``SYSCONFDIR`` value ``etc``
# becomes ``/etc/opt/...``. This is defined by the
# `Filesystem Hierarchy Standard`_.
#
# .. _`Filesystem Hierarchy Standard`: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html
#=============================================================================
# Copyright 2015 Alex Turbov <i.zaufi@gmail.com>
# Copyright 2011 Nikita Krupen'ko <krnekit@gmail.com>
# Copyright 2011 Kitware, Inc.
#
@ -279,8 +319,35 @@ foreach(dir
MANDIR
DOCDIR
)
if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
if(NOT IS_ABSOLUTE "${CMAKE_INSTALL_${dir}}")
# Handle special cases:
# - CMAKE_INSTALL_PREFIX == /
# - CMAKE_INSTALL_PREFIX == /usr
# - CMAKE_INSTALL_PREFIX == /opt/...
if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/")
if("${dir}" STREQUAL "SYSCONFDIR" OR "${dir}" STREQUAL "LOCALSTATEDIR")
set(CMAKE_INSTALL_FULL_${dir} "/${CMAKE_INSTALL_${dir}}")
else()
if (NOT "${CMAKE_INSTALL_${dir}}" MATCHES "^usr/")
set(CMAKE_INSTALL_${dir} "usr/${CMAKE_INSTALL_${dir}}")
endif()
set(CMAKE_INSTALL_FULL_${dir} "/${CMAKE_INSTALL_${dir}}")
endif()
elseif("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$")
if("${dir}" STREQUAL "SYSCONFDIR" OR "${dir}" STREQUAL "LOCALSTATEDIR")
set(CMAKE_INSTALL_FULL_${dir} "/${CMAKE_INSTALL_${dir}}")
else()
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
endif()
elseif("${CMAKE_INSTALL_PREFIX}" MATCHES "^/opt/.*")
if("${dir}" STREQUAL "SYSCONFDIR" OR "${dir}" STREQUAL "LOCALSTATEDIR")
set(CMAKE_INSTALL_FULL_${dir} "/${CMAKE_INSTALL_${dir}}${CMAKE_INSTALL_PREFIX}")
else()
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
endif()
else()
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
endif()
else()
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
endif()

View File

@ -21,8 +21,8 @@ CMAKE_INSTALL_FULL_INFODIR='/opt/Opt/share/info'
CMAKE_INSTALL_FULL_LIBDIR='/opt/Opt/(lib|lib64)'
CMAKE_INSTALL_FULL_LIBEXECDIR='/opt/Opt/libexec'
CMAKE_INSTALL_FULL_LOCALEDIR='/opt/Opt/share/locale'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/opt/Opt/var'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/var/opt/Opt'
CMAKE_INSTALL_FULL_MANDIR='/opt/Opt/share/man'
CMAKE_INSTALL_FULL_SBINDIR='/opt/Opt/sbin'
CMAKE_INSTALL_FULL_SHAREDSTATEDIR='/opt/Opt/com'
CMAKE_INSTALL_FULL_SYSCONFDIR='/opt/Opt/etc'$
CMAKE_INSTALL_FULL_SYSCONFDIR='/etc/opt/Opt'$

View File

@ -1,28 +1,28 @@
^CMAKE_INSTALL_BINDIR='bin'
CMAKE_INSTALL_DATADIR='share'
CMAKE_INSTALL_DATAROOTDIR='share'
CMAKE_INSTALL_DOCDIR='share/doc/Root'
CMAKE_INSTALL_INCLUDEDIR='include'
CMAKE_INSTALL_INFODIR='share/info'
CMAKE_INSTALL_LIBDIR='(lib|lib64)'
CMAKE_INSTALL_LIBEXECDIR='libexec'
CMAKE_INSTALL_LOCALEDIR='share/locale'
^CMAKE_INSTALL_BINDIR='usr/bin'
CMAKE_INSTALL_DATADIR='usr/share'
CMAKE_INSTALL_DATAROOTDIR='usr/share'
CMAKE_INSTALL_DOCDIR='usr/share/doc/Root'
CMAKE_INSTALL_INCLUDEDIR='usr/include'
CMAKE_INSTALL_INFODIR='usr/share/info'
CMAKE_INSTALL_LIBDIR='usr/(lib|lib64)'
CMAKE_INSTALL_LIBEXECDIR='usr/libexec'
CMAKE_INSTALL_LOCALEDIR='usr/share/locale'
CMAKE_INSTALL_LOCALSTATEDIR='var'
CMAKE_INSTALL_MANDIR='share/man'
CMAKE_INSTALL_SBINDIR='sbin'
CMAKE_INSTALL_SHAREDSTATEDIR='com'
CMAKE_INSTALL_MANDIR='usr/share/man'
CMAKE_INSTALL_SBINDIR='usr/sbin'
CMAKE_INSTALL_SHAREDSTATEDIR='usr/com'
CMAKE_INSTALL_SYSCONFDIR='etc'
CMAKE_INSTALL_FULL_BINDIR='//bin'
CMAKE_INSTALL_FULL_DATADIR='//share'
CMAKE_INSTALL_FULL_DATAROOTDIR='//share'
CMAKE_INSTALL_FULL_DOCDIR='//share/doc/Root'
CMAKE_INSTALL_FULL_INCLUDEDIR='//include'
CMAKE_INSTALL_FULL_INFODIR='//share/info'
CMAKE_INSTALL_FULL_LIBDIR='//(lib|lib64)'
CMAKE_INSTALL_FULL_LIBEXECDIR='//libexec'
CMAKE_INSTALL_FULL_LOCALEDIR='//share/locale'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='//var'
CMAKE_INSTALL_FULL_MANDIR='//share/man'
CMAKE_INSTALL_FULL_SBINDIR='//sbin'
CMAKE_INSTALL_FULL_SHAREDSTATEDIR='//com'
CMAKE_INSTALL_FULL_SYSCONFDIR='//etc'$
CMAKE_INSTALL_FULL_BINDIR='/usr/bin'
CMAKE_INSTALL_FULL_DATADIR='/usr/share'
CMAKE_INSTALL_FULL_DATAROOTDIR='/usr/share'
CMAKE_INSTALL_FULL_DOCDIR='/usr/share/doc/Root'
CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/include'
CMAKE_INSTALL_FULL_INFODIR='/usr/share/info'
CMAKE_INSTALL_FULL_LIBDIR='/usr/(lib|lib64)'
CMAKE_INSTALL_FULL_LIBEXECDIR='/usr/libexec'
CMAKE_INSTALL_FULL_LOCALEDIR='/usr/share/locale'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/var'
CMAKE_INSTALL_FULL_MANDIR='/usr/share/man'
CMAKE_INSTALL_FULL_SBINDIR='/usr/sbin'
CMAKE_INSTALL_FULL_SHAREDSTATEDIR='/usr/com'
CMAKE_INSTALL_FULL_SYSCONFDIR='/etc'$

View File

@ -21,8 +21,8 @@ CMAKE_INSTALL_FULL_INFODIR='/usr/share/info'
CMAKE_INSTALL_FULL_LIBDIR='/usr/(lib|lib64|lib/arch)'
CMAKE_INSTALL_FULL_LIBEXECDIR='/usr/libexec'
CMAKE_INSTALL_FULL_LOCALEDIR='/usr/share/locale'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/usr/var'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/var'
CMAKE_INSTALL_FULL_MANDIR='/usr/share/man'
CMAKE_INSTALL_FULL_SBINDIR='/usr/sbin'
CMAKE_INSTALL_FULL_SHAREDSTATEDIR='/usr/com'
CMAKE_INSTALL_FULL_SYSCONFDIR='/usr/etc'$
CMAKE_INSTALL_FULL_SYSCONFDIR='/etc'$