如何在 CMake 或 make 之外获取 GNU 安装目录的名称?

How to get the name of GNU install directories outside of CMake or make?

我正在使用 CMake 安装由 GNUInstallDirs 定义的软件,而 GNUInstallDirs 又应该遵循 these standards

事实证明,这些在分布中并不完全统一,但是 - libdir 在 ubuntu 下变为 lib,而在 alpine 下它解析为 lib64.

我需要以可移植的方式在 CMake 之外引用这些目录 - 具体来说,我在 bash 脚本中添加了一个包含 libdir$PYTHONPATH 的路径。

如何在 bash 中的当前系统上找到 libdir 正在解析的实际目录名称?

模块 GNUInstallDirsliblib64 之间选择的标准在模块本身中是 described

  # Override this default 'lib' with 'lib64' iff:
  #  - we are on Linux system but NOT cross-compiling
  #  - we are NOT on debian
  #  - we are on a 64 bits system
  # reason is: amd64 ABI: https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI
  # For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if
  # CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu"
  # and CMAKE_INSTALL_PREFIX is "/usr"
  # See http://wiki.debian.org/Multiarch

在一个简单的形式中,您的 Python 脚本可以检查:

  1. 是否在 64 位上运行Linux。
  2. 是否在基于 Debian 的操作系统上运行。

如果第一个检查为真而第二个为假,则 libdirlib64/。 否则 libdirlib/.

另类。正在搜索图书馆

您的脚本可以检查 lib/lib64/ 是否包含特定的库,对于 $PYTHONPATH 选择实际包含库的目录。

这种方法有一个优点,它可以安全地防止 GNUInstallDirs 模块中 select 在 lib/lib64/ 之间更改规则。

另类。使用有关安装目录的信息运送您的安装

安装项目时,您还可以创建一个包含 CMAKE_INSTALL_FULL_LIBDIR 变量值的文件,因此可以通过 Python 脚本提取该值。至于包含此信息的文件,它可以存储在预定义的目录下:例如datarootdir 始终是 share/.

这种方法有一个优点,即使 libdir 的值不同于 lib/lib64/

要添加 的其他选项:

Return CMake 按需提供的目录名

在引用安装路径时,我们可以通过打印CMake本身的变量来获取具体目录:

echo "include(GNUInstallDirs)\nmessage(${CMAKE_INSTALL_LIBDIR})\n" > /tmp/gnuinstall &&
cmake -P /tmp/gnuinstall