Linux / Mac:编译时确定平台的好方法是什么?

我想概括一个构build系统在几个(有点类似)的平台上编译。 什么是确定运行shell脚本或Makefile的主机types的好方法。 我想区分Mac和Linux, 但也不同的具体分配的Linux (如RHEL,Ubuntu)。 Cygwin对我来说并不重要,但是如果你把它包含在你的回复中,我相信别人会觉得它很有价值。

基本原理可能包括使用主机types来获取和安装正确版本的二进制包,比从源代码编译更方便。 另外,一些商业软件是针对特定发行版本进行二进制打包的,因此部分动机是抓取正确的二进制文件。

谢谢,

那么setjmp

Autotools来拯救。 它有大量的宏帮助你做这种东西。

http://www.lrde.epita.fr/~adl/autotools.html

uname -a区分主要* nix变体

不太确定区分红帽与Ubuntu的最好方法是 – 可以查找软件包管理工具并查询已安装的软件包,最终帮助您缩小不同的debian衍生产品等等。

Linux变体通常将发行版信息存储在/ etc / issue中。

大多数内核将把信息放在/ proc / version中

这并不完全简单。 您可以使用uname来查找常规参数,但区分分布是一件比较困难的任务。 也许你应该考虑使用类似autoconf来概括你的构建系统?

为了防止你使用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发行版相当棘手,但并不难。 你首先必须弄清楚你关心的是什么样的发行版,然后在这个例子中为你选择的那个发行特定的文件/配置检查,因为你不能真正支持所有可用的Linux发行版出来了。 🙂

至于Mac方面,我会让Mac专家回答,但不应该那么难,因为至少多元化问题是不可能的。