【问题标题】:Linux/Mac: What is good method to determine platform at compile time?Linux/Mac:在编译时确定平台的好方法是什么?
【发布时间】:2011-06-23 14:35:32
【问题描述】:

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

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

谢谢,

SetJmp

【问题讨论】:

  • 如果你必须知道你正在使用的发行版,那么你的方法有问题。
  • @user562374 某些软件是商业的和/或为特定发行版打包的。另外
  • @user562374 某些软件是商业的和/或为特定发行版打包的。此外,对于基于源代码的包,我可能有一个“编译一次”的方法,然后到处 rsync。为了自动“拉”正确的二进制包,我需要确定要抓取哪个变体。 (例如 RHEL 与 Ubuntu)。

标签: linux build conditional compilation vendor


【解决方案1】:

Autotools 助您一臂之力。它有大量的宏可以帮助你做这些事情。

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

【讨论】:

  • 谢谢。我认为 OP 需要改变他的方法,寻找他需要的东西,而不是他使用的系统,以使他的构建系统正常工作。
  • rmk - 您是否熟悉能够区分 RHEL 和 Ubuntu 的 autotools 宏或技术?还是 RHEL 和 OpenSuse?
  • 重复我的观点,如果您使用自动工具来找出操作系统/发行版,那么您做错了。
  • RMK - 感谢您的链接。我很好奇你会怎么做对?如果您有耐心和兴趣将对话离线:andrewschein.com/contact.html
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        以防万一您使用 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 发行版非常棘手,但并不难。您首先必须弄清楚您关心哪些发行版,然后对您选择的发行版进行各种特定于发行版的文件/配置检查,例如 this example,因为您不能真正支持所有无数的 Linux 发行版可用了。 :-)

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-02-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多