Bash 如何获取CMake或make之外的GNU安装目录的名称?
我正在使用CMake来安装GNUInstallDirs定义的软件,而GNUInstallDirs应该遵循这一点 事实证明,这些在不同的发行版中并不完全一致,但是在ubuntu下,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之间选择的
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脚本可以检查:
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
您也可以添加自己的答案。不需要在一个回答帖子中收集所有可能的解决方案。