【问题标题】:How to check the OS with automake如何使用 automake 检查操作系统
【发布时间】:2016-12-18 07:47:02
【问题描述】:

我有一个项目使用 automake 来创建 configure 和所有相关文件(我正在使用 autoreconf 命令来制作所有这些东西)。因此,我试图设置一些条件文件以在为 macOS(OS X)、Windows 或 Linux 编译项目时进行编译。但它失败了:

 $ autoreconf -i ..
src/Makefile.am:30: error: LINUX does not appear in AM_CONDITIONAL
autoreconf: automake failed with exit status: 1

Makefile.am 中包含错误的部分如下:

if OSX
    butt_SOURCES += CurrentTrackOSX.h CurrentTrackOSX.m
endif
if LINUX
    butt_SOURCES += currentTrack.h currentTrackLinux.cpp
endif
if WINDOWS
    butt_SOURCES += currentTrack.h currentTrack.cpp
endif

我的问题是,如何检查操作系统是否为 Linux?如果可能的话,有没有更好的方法来检查 automake 中的操作系统?

【问题讨论】:

  • 为了迂腐(在处理自动工具时迂腐是必要的),automake 不会创建 configure 并且与它完全无关。 automake 基于模板Makefile.am 创建Makefile.in
  • 有一些方法可以检查操作系统是否为 Linux,但您不关心,也不应该关心。您关心系统的特定功能,而不是系统是什么。确定您需要的功能,测试这些特定功能,不用担心它是 Linux、OS X 还是 Windows。这样做会更健壮,因为无论如何你不应该假设所有 Linux 都是相同的。
  • @William Pursell 感谢有关 automake 的澄清,我使用 autoreconf 制作所有东西,但我不知道它的确切名称。而对于这个特别的文件,我只需要标准的 C 库。在 OS X 上需要 AppleScript,它只在那里可用。并且在 Windows 上是直接不受支持的(是一个存根函数)。所以我只需要检查是否是Linux,因为C库在所有Linux上都是通用的。
  • 所以你不关心它是否是 Linux,你关心的是 AppleScript 是否可用或者你是否有一个特定的 libc。检查一下。

标签: linux automake


【解决方案1】:

你可以检测到directly in the Makefile,或者在配置源文件中定义条件(可能是configure.ac),因为你使用的是autoreconf

# AC_CANONICAL_HOST is needed to access the 'host_os' variable    
AC_CANONICAL_HOST

build_linux=no
build_windows=no
build_mac=no

# Detect the target system
case "${host_os}" in
    linux*)
        build_linux=yes
        ;;
    cygwin*|mingw*)
        build_windows=yes
        ;;
    darwin*)
        build_mac=yes
        ;;
    *)
        AC_MSG_ERROR(["OS $host_os is not supported"])
        ;;
esac

# Pass the conditionals to automake
AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"])

注意:host_os 指的是目标系统,因此如果您进行交叉编译,它将设置您正在编译的系统的操作系统条件

【讨论】:

  • 我试图直接在Makefile.am 中检测到它,但给了我一个错误。使用带有configure.ac 的解决方案时否。感谢您的回答
【解决方案2】:

您是否尝试过使用 lsb_release 命令来确定操作系统的类型和版本?

【讨论】:

  • lsb 表示 Linux 标准库。你认为这个命令会在许多其他操作系统上可用吗..?例如,它不在 MSYS2/MinGW64 上,这使得它在我的书中毫无用处。 uname 是一个更合适且可能存在的命令。但无论如何,理想情况下,这种检查是 Autotools 应该处理的,而不是要求用户调用和解析其他工具,即使它是相关的。 (不过,Autotools 并不是相当理想!)
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2011-05-21
  • 2012-05-18
  • 2012-04-01
相关资源
最近更新 更多