Linux 如何使用automake检查操作系统

Linux 如何使用automake检查操作系统,linux,automake,Linux,Automake,我有一个项目,它使用automake创建配置和所有相关文件(我使用autoeconf命令来制作所有这些东西)。因此,我试图在项目为macOS(OSX)、Windows或Linux编译时设置一些要编译的条件文件。但它在以下方面失败了: $ autoreconf -i .. src/Makefile.am:30: error: LINUX does not appear in AM_CONDITIONAL autoreconf: automake failed with exit status:

我有一个项目,它使用automake创建
配置
和所有相关文件(我使用
autoeconf
命令来制作所有这些东西)。因此,我试图在项目为macOS(OSX)、Windows或Linux编译时设置一些要编译的条件文件。但它在以下方面失败了:

 $ autoreconf -i ..
src/Makefile.am:30: error: LINUX does not appear in AM_CONDITIONAL
autoreconf: automake failed with exit status: 1
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
Makefile.am
中包含错误的部分如下所示:

 $ autoreconf -i ..
src/Makefile.am:30: error: LINUX does not appear in AM_CONDITIONAL
autoreconf: automake failed with exit status: 1
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中的操作系统?

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

您可以检测到它,或者在配置源文件(可能是
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\u os
指的是目标系统,因此,如果交叉编译,它会设置编译到的系统的操作系统条件


要学究式(在处理自动工具时,学究式是必要的),
automake
不会创建
configure
,与之无关
automake
基于模板
Makefile.am
创建
Makefile.in
。有很多方法可以检查操作系统是否是Linux,但你不在乎,也不应该在意。您关心的是系统的特定功能,而不是系统是什么。确定您需要的功能,测试这些特定功能,不必担心它是Linux还是OSX或Windows。这样做会更加健壮,因为无论如何,你不应该假设所有的Linux都是相同的。@William Pursell感谢你对automake的澄清,我使用
autoeconf
来制作所有的东西,我不知道它的确切名称。对于这个特殊的文件,我只需要标准的C库。在OSX上需要AppleScript,它仅在那里可用。并且在Windows上直接不受支持(是存根函数)。所以我只需要检查一下它是否是Linux,因为C库在所有Linux上都很常见,所以你不关心它是否是Linux,你关心的是AppleScript是否可用,或者你是否有一个特定的libc。检查一下。我试图在
Makefile.am
中直接检测到它,但给出了一个错误。将解决方案与
configure.ac一起使用时为否。感谢您的回答
lsb
表示Linux标准库。您认为这个命令在许多其他操作系统上都可用吗。。?例如,它不在MSYS2/MinGW64上,这使得它在我的书中毫无用处
uname
是一个更合适、更可能存在的命令。但无论如何,理想情况下,这种检查是Autotools应该处理的,而不是要求用户调用和解析其他工具,即使它是相关的。(不过,自动工具并不十分理想!)