-#
+#
# Empire - A multi-player, client/server Internet based war game.
-# Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
-# Ken Stevens, Steve McClure
-#
-# This program is free software; you can redistribute it and/or modify
+# Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
+# Ken Stevens, Steve McClure, Markus Armbruster
+#
+# Empire is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
# ---
-#
+#
# See files README, COPYING and CREDITS in the root of the source
# tree for related information and legal notices. It is expected
# that future projects/authors will amend these files as needed.
-#
+#
# ---
-#
+#
# configure.ac: Autoconf input file
-#
+#
# Known contributors to this file:
-# Markus Armbruster, 2005
-#
+# Markus Armbruster, 2005-2020
+#
# Process this file with autoconf to produce a configure script.
# Autoconf makes checking for and programming around assorted ancient
-# crap relatively painless. But why bother? Just rely on C89 and
-# POSIX, and when something breaks on some oddball machine, see
-# whether it's worth fixing.
-
-AC_PREREQ(2.59)
-AC_INIT([Wolfpack Empire], [4.3.4], [wolfpack@wolfpackempire.com], [empire])
+# crap relatively painless. But why bother? Just rely on POSIX, and
+# when something breaks on some oddball machine, see whether it's
+# worth fixing.
+
+AC_PREREQ(2.69)
+AC_INIT([Wolfpack Empire],
+ m4_esyscmd([build-aux/git-version-gen .tarball-version]),
+ [wolfpack@wolfpackempire.com], [empire],
+ [http://www.wolfpackempire.com/])
AC_CONFIG_SRCDIR([include/combat.h])
+AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
-
### Checks for programs
AC_PROG_AWK
AC_PROG_INSTALL
AC_PROG_RANLIB
-AC_PROG_CC
-AC_SUBST(GCC)
+
+AC_PROG_CC_STDC
AM_PROG_CC_C_O
# Private automake macro, tsk, tsk, tsk...
_AM_DEPENDENCIES(CC)
+AC_DEFINE([_XOPEN_SOURCE], [600],
+ [Request POSIX-1.2001 with XSI Extension])
+# Note: this is after AC_PROG_CC_STDC, because Solaris cc fails with
+# _XOPEN_SOURCE unless switched to C99, which breaks AC_PROG_CC_STDC.
+
+AC_ARG_VAR(NROFF, [nroff command])
+AC_CHECK_PROG(NROFF, groff, [GROFF_NO_SGR= groff -Tascii -U], nroff)
# not really a check for a program, but close enough
-if test -d $srcdir/CVS; then cvs_controlled=yes; else cvs_controlled=no; fi
-AC_SUBST(cvs_controlled,$cvs_controlled)
+if test -d $srcdir/.git
+then revctrl=git
+else revctrl=
+fi
+if test "$revctrl" && test -r $srcdir/.tarball-version
+then AC_MSG_ERROR([$srcdir/.tarball-version must not exist])
+fi
+AC_SUBST(revctrl,$revctrl)
+# Not a program, but need to check this early
+MY_WINDOWS_API
-### Checks for libraries
-ACX_PTHREAD
-LIB_SOCKET_NSL
-# TODO merge this into LIB_SOCKET_NSL?
-case "$host_os" in
-*mingw32)
- LIBS="-lws2_32 $LIBS" ;;
-esac
-# TODO turn this into a macro?
-save_LIBS=$LIBS
-AC_SEARCH_LIBS([setupterm], [termlib termcap curses ncurses])
-# FIXME if not found, complain and switch off highlighting
-termlibs=`echo $LIBS | sed s/\`echo $save_LIBS | sed 's/././g'\`'$//'`
-AC_SUBST(termlibs)
-LIBS=$save_LIBS
+### Checks for libraries
+AX_PTHREAD
+LIBS_util="$LIBS"
+LIBS="$LIBS_SOCKETS $LIBS"
+AX_LIB_SOCKET_NSL
+LIBS_server="$LIBS"
+MY_WITH_READLINE
+MY_WITH_TERMINFO
+LIBS_client="$LIBS"
### Checks for header files
### Checks for typedefs, structures, and compiler characteristics
-AC_C_CHAR_UNSIGNED
+if test "$GCC"
+then
+
+# Enable useful warnings
+# Some of them are commented out because the code needs cleanup first
+# Clang needs to be tested with -Werror=unknown-warning-option
+AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],
+[cflags_test="-Werror=unknown-warning-option"],
+[cflags_test=""])
+MY_APPEND_COMPILE_FLAGS([-Wall -Wextra dnl
+dnl -Wcast-align dnl
+dnl -Wconversion dnl
+-Wdeclaration-after-statement dnl
+dnl -Wformat-nonliteral dnl
+-Wformat-security dnl
+-Winit-self dnl
+-Wlogical-op dnl
+-Wmissing-prototypes dnl
+-Wnested-externs dnl
+-Wold-style-definition dnl
+-Wpacked dnl
+-Wpointer-arith dnl
+-Wredundant-decls dnl
+dnl -Wshadow dnl
+-Wstrict-prototypes dnl
+dnl too prone to false positives: -Wsuggest-attribute=format dnl
+dnl -Wswitch-default dnl
+-Wundef dnl
+-Wno-unused-parameter dnl
+], [], [$cflags_test])
+
+# No multiple definitions of uninitialized global variables
+MY_APPEND_COMPILE_FLAGS([-fno-common])
+
+# Reign in overzealous optimizers
+#
+# Contemporary compilers can squeeze out some extra performance by
+# assuming the program never executes code that has undefined behavior
+# according to the C standard. Unfortunately, this can break
+# programs. Pointing out that these programs are non-conforming is as
+# correct as it is unhelpful, at least as long as the compiler is
+# unable to diagnose the non-conformingness.
+#
+# Since keeping our programs working is a lot more important to us
+# than running them as fast as possible, forbid some assumptions that
+# are known to break real-world programs:
+#
+# * Aliasing: perfectly clean programs don't engage in type-punning,
+# and perfectly conforming programs do it only in full accordance
+# with the standard's (subtle!) aliasing rules. Neither kind of
+# perfection is realistic for us, therefore -fno-strict-aliasing.
+#
+# * Signed integer overflow: perfectly clean programs won't ever do
+# signed integer arithmetic that overflows. This is an imperfect
+# program, therefore -fno-strict-overflow.
+#
+MY_APPEND_COMPILE_FLAGS([dnl
+-fno-strict-aliasing dnl
+-fno-strict-overflow])
+
+# Emit extra code to check for buffer overflows
+# Could fall back to -fstack-protector when -fstack-protector-strong
+# isnt't supported, for users of older compilers. Doesn't seem worth
+# the trouble, though.
+# Some ports of the GNU toolchain reportedly support it in the
+# compiler, but not libc. Use a test program that makes the compiler
+# emit the extra stack checking code, and test it compiles and links.
+AX_APPEND_LINK_FLAGS([-fstack-protector-strong], [], [],
+ [AC_LANG_SOURCE([[
+int
+main(int argc, char *argv[])
+{
+ char arr[64], *dst = arr, *src = argv[0];
+ while ((*dst++ = *src++)) ;
+}
+ ]])])
+
+fi # $GCC
### Checks for library functions
AC_CHECK_FUNCS(getaddrinfo)
+MY_WORKING_IN6_IS_ADDR_V4MAPPED
MY_FUNC_MAKECONTEXT
# Select thread package
empthread=
if test "$with_pthread" != no; then
- if test "$acx_pthread_ok" = yes; then
+ if test "$ax_pthread_ok" = yes; then
empthread=POSIX
fi
fi
if test "$ac_cv_func_makecontext" = yes; then
empthread=LWP
fi
- case "$host_os" in
- *mingw32)
- empthread=Windows ;;
- esac
+ if test $Windows_API = yes; then
+ empthread=Windows
+ fi
fi
if test -z "$empthread"; then
AC_MSG_ERROR([No usable thread package found])
fi
AC_SUBST(empthread)
-AC_MSG_NOTICE([Using $empthread threads])
case $empthread in
-LWP) AC_DEFINE([EMPTH_LWP], 1, [Define to use LWP threads])
- AC_DEFINE([UCONTEXT], 1, [Define to make LWP use makecontext()]) ;;
+LWP) AC_DEFINE([EMPTH_LWP], 1, [Define to use LWP threads]) ;;
POSIX) AC_DEFINE([EMPTH_POSIX], 1, [Define to use POSIX threads]) ;;
Windows) AC_DEFINE([EMPTH_W32], 1, [Define to use Windows threads]) ;;
esac
### Output
+LIBS="$LIBS_util"
+AC_SUBST(LIBS_client)
+AC_SUBST(LIBS_server)
+
AC_CONFIG_FILES([GNUmakefile])
AC_CONFIG_COMMANDS([stamp-h],
- [if test $cvs_controlled = yes; then
- mkdir -p `cd $srcdir && $AWK -f src/scripts/cvsfiles.awk \
- | sed -n '/\//s,/@<:@^/@:>@*$,,gp'| uniq`
- else
+ [case $revctrl in
+ git)
+ mkdir -p `cd $srcdir && git ls-files \
+ | sed -n 's,/@<:@^/@:>@*$,,gp' | uniq`
+ ;;
+ *)
mkdir -p `sed s/.*=// <$srcdir/sources.mk | tr ' ' '\012' \
| sed -n '/\//s,/@<:@^/@:>@*$,,gp'| uniq`
- fi
+ esac
mkdir -p info.html info.nr lib
touch stamp-h],
- [cvs_controlled=$cvs_controlled; AWK=$AWK])
+ [revctrl=$revctrl])
AC_OUTPUT
+
+AC_MSG_NOTICE([])
+AC_MSG_NOTICE([-= Configuration summary =-])
+AC_MSG_NOTICE([Thread package: $empthread])
+AC_MSG_NOTICE([ readline: $with_readline])
+AC_MSG_NOTICE([ terminfo: $with_terminfo])
+AC_MSG_NOTICE([ EMPIREHOST: $EMPIREHOST])
+AC_MSG_NOTICE([ EMPIREPORT: $EMPIREPORT])