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

时间:2011-02-08 17:37:53

标签: linux build conditional compilation vendor

我想概括一个构建系统,以便在几个(有些类似的)平台上进行编译。确定运行shell脚本或Makefile的主机类型的好方法是什么。我想区分mac和linux,以及linux的不同特定发行版(例如RHEL,Ubuntu)。 Cygwin对我来说并不重要,但如果你把它包含在你的回复中,我相信其他人会发现它很有价值。

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

谢谢,

的setjmp

5 个答案:

答案 0 :(得分:5)

Autotools救援。它有大量的宏可以帮助你做这种事情。

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

答案 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专家回答,但不应该那么难,因为至少多样性问题是不可能的。