GNUInstallDirs

本模块根据 GNU 编码标准 定义安装目录变量,并提供一个命令来计算与安装相关的绝对路径。

在 CMake 项目中加载此模块,使用

include(GNUInstallDirs)

结果变量

包含此模块会定义以下变量

CMAKE_INSTALL_<dir>

特定类型文件的目标位置。该值可以传递给相应文件类型的 install() 命令的 DESTINATION 选项。它应该是一个相对于安装前缀的路径,以便能够以可重定位的方式将其转换为绝对路径。然而,下面文档中有一些 特殊情况

虽然允许使用绝对路径,但不推荐这样做,因为它们无法与 cmake --install 命令的 --prefix 选项或 cpack 安装程序生成器一起使用。特别是,没有必要通过添加 CMAKE_INSTALL_PREFIX 来使路径绝对;如果 DESTINATION 是相对路径,则默认使用此前缀。

CMAKE_INSTALL_FULL_<dir>

由相应的 CMAKE_INSTALL_<dir> 值生成的绝对路径。如果该值本身不是绝对路径,则通常通过在 CMAKE_INSTALL_PREFIX 变量的值前添加来实现绝对路径的构建,但在下面文档中描述的 特殊情况 下除外。

不应在 install() 命令中使用这些变量,因为它们无法与 cmake --install 命令的 --prefix 选项或 cpack 安装程序生成器一起使用。

其中 <dir> 是以下之一

BINDIR

用户可执行文件 (bin)

SBINDIR

系统管理员可执行文件 (sbin)

LIBEXECDIR

程序可执行文件 (libexec)

SYSCONFDIR

只读的单机数据 (etc)

版本 4.1 中已更改: 如果 CMAKE_INSTALL_PREFIX 落在 特殊情况,则默认路径是那里描述的绝对路径变体。请参阅策略 CMP0192

SHAREDSTATEDIR

可修改的与架构无关的数据 (com)

LOCALSTATEDIR

可修改的单机数据 (var)

版本 4.1 中已更改: 如果 CMAKE_INSTALL_PREFIX 落在 特殊情况,则默认路径是那里描述的绝对路径变体。请参阅策略 CMP0192

RUNSTATEDIR

运行时变量数据 (LOCALSTATEDIR/run)

版本 3.9 中添加。

版本 4.1 中已更改: 如果 CMAKE_INSTALL_PREFIX 落在 特殊情况,则默认路径是那里描述的绝对路径变体。请参阅策略 CMP0192

LIBDIR

目标代码库 (liblib64)

在 Debian 上,当 CMAKE_INSTALL_PREFIX/usr 时,这可能是 lib/<multiarch-tuple>

INCLUDEDIR

C 头文件 (include)

OLDINCLUDEDIR

非 gcc 的 C 头文件 (/usr/include)

DATAROOTDIR

只读的与架构无关的数据根目录 (share)

DATADIR

只读的与架构无关的数据 (DATAROOTDIR)

INFODIR

info 文档 (DATAROOTDIR/info)

LOCALEDIR

与区域设置相关的数据 (DATAROOTDIR/locale)

MANDIR

man 文档 (DATAROOTDIR/man)

DOCDIR

文档根目录 (DATAROOTDIR/doc/PROJECT_NAME)

如果包含者未定义值,则将使用上面显示的价格,并且该值将出现在缓存中供用户编辑。

如果使用了 CMAKE_INSTALL_<dir> 的默认值,并且 CMAKE_INSTALL_PREFIX 被更改,则将根据新的 CMAKE_INSTALL_PREFIX 值计算新的默认值。在 cmake --install 中使用 --prefix 不会改变这些值。

特殊情况

3.4 版本新增。

CMAKE_INSTALL_PREFIX 的以下值是特殊的

/

对于 <dir> 不是 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR 的情况,如果 CMAKE_INSTALL_<dir> 的值未被用户指定为绝对路径,则在其前面添加 usr/。例如,INCLUDEDIRinclude 将变为 usr/include。这符合 GNU 编码标准 的要求,该标准规定

在构建完整的 GNU 系统时,前缀将为空,而 /usr 将是 / 的符号链接。

版本 4.1 中已更改: CMAKE_INSTALL_<dir> 变量将被缓存,并带有 usr/ 前缀。请参阅策略 CMP0193

/usr

对于 <dir> 等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR 的情况,如果 CMAKE_INSTALL_<dir> 的值还不是绝对路径,则通过在 CMAKE_INSTALL_<dir> 的值前添加 / 来计算 CMAKE_INSTALL_FULL_<dir>。例如,SYSCONFDIRetc 将变为 /etc。这符合 GNU 编码标准

版本 4.1 中已更改: 对于 <dir> 等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR 的情况,CMAKE_INSTALL_<dir> 的默认值分别是绝对路径 /etc/var/var/run。请参阅策略 CMP0192

/opt/...

对于 <dir> 等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR 的情况,如果 CMAKE_INSTALL_<dir> 的值还不是绝对路径,则通过将前缀 *追加* 到 CMAKE_INSTALL_<dir> 的值来计算 CMAKE_INSTALL_FULL_<dir>。例如,SYSCONFDIRetc 将变为 /etc/opt/...。这由 Filesystem Hierarchy Standard 定义。

此行为不适用于 /opt/homebrew/... 下的路径。

版本 4.1 中已更改: 对于 <dir> 等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR 的情况,CMAKE_INSTALL_<dir> 的默认值分别是绝对路径 /etc/opt/.../var/opt/.../var/run/opt/...。请参阅策略 CMP0192

命令

此模块提供以下命令

GNUInstallDirs_get_absolute_install_dir

3.7 版本中新增。

从给定的相对路径计算绝对安装路径

GNUInstallDirs_get_absolute_install_dir(<result-var> <input-var> <dir>)

此命令从变量 <input-var> 获取值,并根据 GNU 标准安装目录计算其绝对路径。如果输入路径是相对路径,则在其前面添加 CMAKE_INSTALL_PREFIX,并可能根据上面描述的 特殊情况 进行调整。

参数为

<result-var>

存储计算出的绝对路径的变量名。

<input-var>

包含将用于计算其关联的绝对安装路径的路径的变量名。

版本 4.1 中已更改: 此变量不再被修改。请参阅策略 CMP0193。在之前的 CMake 版本中,此命令会根据 特殊情况 修改 <input-var> 变量的值。

<dir>

在 3.20 版本中添加。

目录类型名称,例如 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR 等。此参数决定在计算绝对路径时是否适用 特殊情况

版本 3.20 中已更改: 在引入 <dir> 参数之前,可以通过在调用此命令之前设置 dir 变量来指定目录类型。从 CMake 3.20 开始,如果显式提供了 <dir> 参数,则会忽略 dir 变量。

虽然此命令在此模块内部用于计算 CMAKE_INSTALL_FULL_<dir> 变量,但它也公开给用户,以便他们可以使用相同的逻辑创建额外的自定义安装路径变量并在必要时计算绝对路径。

另请参阅