GNUInstallDirs

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

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

include(GNUInstallDirs)

结果变量

引入此模块会定义以下变量

CMAKE_INSTALL_<dir>

给定类型文件的目标路径。此值可以传递给 install() 命令的 DESTINATION 选项以对应相应的文件类型。它应当是相对于安装前缀(installation prefix)的路径,以便以可重定位的方式转换为绝对路径。然而,如下文所述,存在一些特殊情况

虽然允许使用绝对路径,但不建议这样做,因为它们无法与 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>

注意

当在安装时使用 --prefix 选项指定了替代安装前缀时,多架构元组的特殊情况将基于配置时的 CMAKE_INSTALL_PREFIX 进行评估,而不是基于替代前缀的值。

INCLUDEDIR

C 头文件(include

OLDINCLUDEDIR

非 GCC 的 C 头文件(/usr/include

DATAROOTDIR

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

DATADIR

只读架构无关数据(DATAROOTDIR

DATADIRDATAROOTDIR 是分开处理的,以便可以针对特定项目的数据文件自定义 DATADIR,同时 DATAROOTDIR 对标准架构无关位置(INFODIRLOCALEDIRMANDIRDOCDIR)保持不变。

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 的以下值是特殊的:

/

对于非 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR<dir>,如果未将其指定为用户自定义的绝对路径,则 CMAKE_INSTALL_<dir> 的值将预置 usr/。例如,INCLUDEDIR 的值 include 将变为 usr/include。这是 GNU 编码标准 所要求的,该标准规定:

构建完整的 GNU 系统时,前缀将为空,并且 /usr 将是指向 / 的符号链接。

4.1 版本变更:CMAKE_INSTALL_<dir> 变量会缓存带有 usr/ 前缀的值。参见策略 CMP0193

/usr

对于等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR<dir>,如果 CMAKE_INSTALL_<dir> 本身不是绝对路径,则通过仅在其值前加上 / 来计算 CMAKE_INSTALL_FULL_<dir>。例如,SYSCONFDIR 的值 etc 将变为 /etc。这是 GNU 编码标准 所要求的。

4.1 版本变更:对于等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR<dir>CMAKE_INSTALL_<dir> 的默认值分别为绝对路径 /etc/var/var/run。参见策略 CMP0192

/opt/...

对于等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR<dir>,如果 CMAKE_INSTALL_<dir> 本身不是绝对路径,则通过*追加*前缀来计算 CMAKE_INSTALL_FULL_<dir>。例如,SYSCONFDIR 的值 etc 将变为 /etc/opt/...。这是由 文件系统层次结构标准 (FHS) 定义的。

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

4.1 版本变更:对于等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR<dir>CMAKE_INSTALL_<dir> 的默认值分别为绝对路径 /etc/opt/.../var/opt/.../var/run/opt/...。参见策略 CMP0192

注意

当在安装时使用 --prefix 选项指定了替代安装前缀时,这些特殊情况将基于配置时的 CMAKE_INSTALL_PREFIX 进行评估,而不是基于替代前缀的值。

命令

此模块提供以下命令

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> 变量,但它也公开给用户使用,以便用户可以使用相同的逻辑来创建额外的自定义安装路径变量并计算绝对路径。

另请参阅