I have a project that uses automake to create the configure
and all related files (I’m using autoreconf
command to make all this stuff). So, I’m trying to set some conditional files to compile when the project is compiling for macOS (OS X), Windows or Linux. But it fails with the following:
$ autoreconf -i .. src/Makefile.am:30: error: LINUX does not appear in AM_CONDITIONAL autoreconf: automake failed with exit status: 1
And the part containing the error in that Makefile.am
is the following:
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
My question is, how can I check if the OS is Linux? And if it’s possible, is there a better way to check the OS in automake?
Advertisement
Answer
You can detect it directly in the Makefile, or define the conditionals in the configure source file (probably configure.ac
), since you are using 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"])
Note:
host_os
refers to the target system, so if you are cross-compiling it sets the OS conditional of the system you are compiling to.