【问题标题】:How to get the name of GNU install directories outside of CMake or make?如何在 CMake 或 make 之外获取 GNU 安装目录的名称?
【发布时间】:2021-05-27 08:39:14
【问题描述】:

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

事实证明,这些在分布之间并不完全一致 - libdir 在 ubuntu 下变为 lib 而在 alpine 下它解析为 lib64

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

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

【问题讨论】:

  • 是否可以让安装程序在文件系统的某处打印此值?
  • 这可行,但不会像我希望的那样干净。我可以想象在 CMake 中生成一个 bash 脚本来导出这些值,然后可以获取这些值。

标签: bash cmake gnu


【解决方案1】:

模块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 模块中(未来)更改规则以在lib/lib64/ 之间进行选择。

另类。发送您的安装并提供有关安装目录的信息

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

这种方法有一个优势,即使libdir 的值与lib/lib64/ 不同,它也可以工作。

【讨论】:

  • 这是一个非常有用且全面的概述,谢谢。您的第三种方法听起来是最便携的。
  • 也许要添加到这些选项中:我一直在修改的另一种可能性是在添加到 PYTHONPATH 时主动查询 CMAKE_INSTALL_LIBDIR 的值,并使用类似于 echo "include(GNUInstallDirs)\nmessage(\${CMAKE_INSTALL_LIBDIR})\n" | cmake -P /dev/stdin 的内容,但似乎 cmake 无法以这种方式从标准输入读取。它可以作为echo "include(GNUInstallDirs)\nmessage(\${CMAKE_INSTALL_LIBDIR})\n" > /tmp/gnuinstall && cmake -P /tmp/gnuinstall 正常工作
  • 您也可以添加自己的答案。无需在单个答案帖子中收集所有个可能的解决方案。
【解决方案2】:

要为Tsyvarev's answer 添加另一个替代方案:

从 CMake 按需返回目录名称

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

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

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2019-03-17
    • 2022-01-23
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多