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

信息文档 (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/。例如,INCLUDEDIRinclude 变为 usr/include。这是 GNU 编码标准所要求的,其中规定

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

4.1 版本更改:CMAKE_INSTALL_<dir> 变量以 usr/ 前缀缓存。请参阅策略 CMP0193

/usr

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

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

/opt/...

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

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

4.1 版本更改:对于等于 SYSCONFDIRLOCALSTATEDIRRUNSTATEDIR<dir>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> 变量,但它也公开暴露,供用户创建额外的自定义安装路径变量,并在必要时使用相同的逻辑计算绝对路径。

另请参阅