我想概括一个构建系统,以便在几个(有些类似的)平台上进行编译。确定运行shell脚本或Makefile的主机类型的好方法是什么。我想区分mac和linux,以及linux的不同特定发行版(例如RHEL,Ubuntu)。 Cygwin对我来说并不重要,但如果你把它包含在你的回复中,我相信其他人会发现它很有价值。
基本原理可能包括使用主机类型来获取和安装正确版本的二进制包,这比从源代码编译更方便。此外,一些商业软件是针对特定发行版进行二进制打包的,因此部分动机是获取正确的二进制文件。
谢谢,
的setjmp
答案 0 :(得分:5)
Autotools救援。它有大量的宏可以帮助你做这种事情。
答案 1 :(得分:2)
uname -a以区分主要* nix变体
不太确定区分red hat和ubuntu的最佳方法是什么 - 可以寻找包管理工具和查询已安装的包,最终帮助你缩小不同的debian衍生品等等。虽然可能有更明显的事情在前面
答案 2 :(得分:2)
linux变体通常将发行版信息存储在/ etc / issue中。
大多数内核会将信息放在/ proc / version
中答案 3 :(得分:1)
这并非完全直截了当。您可以使用uname
来查找常规参数,但区分分布是一项更难的任务。也许你应该考虑使用类似autoconf的东西来概括你的构建系统?
答案 4 :(得分:0)
如果您正在使用Qt,那么这个非常好的定义集Q_OS_ *会引导您进入您正在编译的操作系统:
Q_OS_AIX
Q_OS_BSD4
Q_OS_BSDI
Q_OS_CYGWIN
Q_OS_DARWIN
Q_OS_DGUX
Q_OS_DYNIX
Q_OS_FREEBSD
Q_OS_HPUX
Q_OS_HURD
Q_OS_IRIX
Q_OS_LINUX
Q_OS_LYNX
Q_OS_MAC
Q_OS_MSDOS
Q_OS_NETBSD
Q_OS_OS2
Q_OS_OPENBSD
Q_OS_OS2EMX
Q_OS_OSF
...
它们在QtGlobal中定义。甚至有一些定义可以帮助您找出使用Q_CC_ *或目标窗口系统Q_WS _ *的编译器。
但是如果您不使用Qt并想要使用通用方法,则很可能需要回到Autotools包或CMake。
确定Linux发行版非常棘手,但并不难。您首先必须弄清楚您关心的发行版,然后针对您选择的那些进行各种分发特定的文件/配置检查,例如this example,因为您无法真正支持所有无数的Linux发行版可用。 : - )
对于Mac方面,我会让Mac专家回答,但不应该那么难,因为至少多样性问题是不可能的。