diff --git a/Modules/GNUInstallDirs.cmake b/Modules/GNUInstallDirs.cmake
index 82258d1dbe98cb78b35677788556ad0afe684cea..b42084eda6f647bf195ca8a152b978c34602055c 100644
--- a/Modules/GNUInstallDirs.cmake
+++ b/Modules/GNUInstallDirs.cmake
@@ -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()
diff --git a/Tests/RunCMake/GNUInstallDirs/Opt-stderr.txt b/Tests/RunCMake/GNUInstallDirs/Opt-stderr.txt
index f24a103547177cf055410a3fcf0658444d8340e9..aee8552c8d36fe5c33a581270e7512751488898a 100644
--- a/Tests/RunCMake/GNUInstallDirs/Opt-stderr.txt
+++ b/Tests/RunCMake/GNUInstallDirs/Opt-stderr.txt
@@ -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'$
diff --git a/Tests/RunCMake/GNUInstallDirs/Root-stderr.txt b/Tests/RunCMake/GNUInstallDirs/Root-stderr.txt
index 95ca1e5b9bfbb5969e6d49c6fa6201aa42673cb2..a95400e862611447981007bf67c8710141e05516 100644
--- a/Tests/RunCMake/GNUInstallDirs/Root-stderr.txt
+++ b/Tests/RunCMake/GNUInstallDirs/Root-stderr.txt
@@ -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'$
diff --git a/Tests/RunCMake/GNUInstallDirs/Usr-stderr.txt b/Tests/RunCMake/GNUInstallDirs/Usr-stderr.txt
index d857720f2d6cc64cf98628f26c019d9031382def..e10c4c5956e86620f7dcfb4b17d20efe15bbebbe 100644
--- a/Tests/RunCMake/GNUInstallDirs/Usr-stderr.txt
+++ b/Tests/RunCMake/GNUInstallDirs/Usr-stderr.txt
@@ -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'$