Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何获取CMake或make之外的GNU安装目录的名称?_Bash_Cmake_Gnu - Fatal编程技术网

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

Bash 如何获取CMake或make之外的GNU安装目录的名称?,bash,cmake,gnu,Bash,Cmake,Gnu,我正在使用CMake来安装GNUInstallDirs定义的软件,而GNUInstallDirs应该遵循这一点 事实证明,这些在不同的发行版中并不完全一致,但是在ubuntu下,libdir变成了lib,而在alpine下,它变成了lib64 我需要以可移植的方式引用CMake之外的这些目录-具体地说,我在bash脚本中将包含libdir的路径添加到$PYTHONPATH 如何在bash中的当前系统上找到libdir解析到的实际目录名?模块gnuinstalldir在lib和lib64之间选择的

我正在使用CMake来安装GNUInstallDirs定义的软件,而GNUInstallDirs应该遵循这一点

事实证明,这些在不同的发行版中并不完全一致,但是在ubuntu下,
libdir
变成了
lib
,而在alpine下,它变成了
lib64

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


如何在bash中的当前系统上找到
libdir
解析到的实际目录名?
模块
gnuinstalldir
lib
lib64
之间选择的标准在模块本身中:

  # 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脚本可以检查:

  • 它是否在64位Linux上运行
  • 是否在基于Debian的操作系统上运行
  • 如果第一个检查为true,而第二个检查为false,则
    libdir
    lib64/
    。 否则
    libdir
    就是
    lib/

    可供替代的寻找图书馆 脚本可以检查
    lib/
    lib64/
    是否包含特定的库,并为
    $PYTHONPATH
    选择实际包含库的目录

    这种方法的一个优点是,对于在
    lib/
    lib64/
    之间进行选择的
    GNUInstallDirs
    模块中(未来)更改规则是安全的

    可供替代的装运您的安装时附带有关安装目录的信息 安装项目时,还可以创建一个文件,其中包含
    CMAKE\u install\u FULL\u LIBDIR
    变量的值,因此可以通过Python脚本提取该值。对于包含此信息的文件,它可以存储在预定义的目录下:例如,
    datarootdir
    始终是
    share/


    这种方法的优点是,即使
    libdir
    的值与
    lib/
    lib64/
    不同,它也可以工作,以添加另一种替代方法:

    按需从CMake返回目录名称 在引用安装路径时,我们可以通过打印CMake本身中的变量来获得特定目录:

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

    让安装程序在文件系统中的某个地方打印这个值是否可以接受?这可以工作,但不会像我希望的那样干净。我可以想象在CMake中生成一个bash脚本,导出这些值,然后可以进行源代码获取。这是一个非常有用和全面的概述,谢谢。您的第三种方法听起来是最具可移植性的。也许要添加到这些选项中:我一直在尝试的另一种可能性是,在添加到
    PYTHONPATH
    时,使用
    echo”include(GNUInstallDirs)\n消息(\${CMAKE\u INSTALL\u LIBDIR})主动查询
    的值\n“| cmake-P/dev/stdin
    ,但看起来cmake无法以这种方式读取stdin。它可以正常工作,因为
    echo”包括(GNUInstallDirs)\n消息(\${CMAKE\u INSTALL\u LIBDIR})\n“>/tmp/gnuinstall&&CMAKE-P/tmp/gnuinstall
    您也可以添加自己的答案。不需要在一个回答帖子中收集所有可能的解决方案。