2

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

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

谢谢,

SetJmp

4

5 回答 5

5

自动工具来救援。它有大量的宏可以帮助你做这种事情。

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

于 2011-02-08T18:59:45.627 回答
2

uname -a 区分主要的 *nix 变体

不太确定区分 red hat 和 ubuntu 的最佳方法是什么 - 可以寻找包管理工具和查询已安装的包,最终帮助您缩小不同的 debian 衍生产品等范围。不过,可能有一些更明显和更前面的东西。

于 2011-02-08T18:10:29.703 回答
2

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

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

于 2011-02-08T18:22:51.353 回答
1

这并不完全简单。您可以使用它uname来找出一般参数,但区分分布是一项艰巨的任务。也许您应该考虑使用类似autoconf的东西来概括您的构建系统?

于 2011-02-08T19:03:45.700 回答
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_* 或目标 Windowing System Q_WS_*。

但是,如果您不使用 Qt 并且想要使用通用方法,则很可能不得不回退到Autotools包或CMake

确定 Linux 发行版非常棘手,但并不难。您首先必须弄清楚您关心哪些发行版,然后对您选择的发行版进行各种特定于发行版的文件/配置检查,就像在这个示例中一样,因为您不能真正支持所有可用的 Linux 发行版出。:-)

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

于 2011-02-08T20:17:02.597 回答