quakeforge/config.d/compiling.m4
Bill Currie ff271c7724 [build] Check for -sdd=gnu23
It's not available yet, but apparently clang got it just a few days ago
(for clang-18), so head that off at the pass.
2023-08-14 09:16:23 +09:00

377 lines
8.9 KiB
Text

if test -d $srcdir/.git; then
cvs_def_enabled="!= xno"
cvs_def_disabled="= xyes"
else
cvs_def_enabled="= xyes"
cvs_def_disabled="!= xno"
fi
AC_MSG_CHECKING(for clang)
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[]],
[[#ifndef __clang__],
[ choke me],
[#endif]])],
[CLANG=yes],
[CLANG=no]
)
AC_MSG_RESULT($CLANG)
AC_MSG_CHECKING(for CFLAGS pre-set)
leave_cflags_alone=no
if test "x$CFLAGS" != "x"; then
leave_cflags_alone=yes
BUILD_TYPE="$BUILD_TYPE Custom"
fi
AC_MSG_RESULT([$leave_cflags_alone])
AC_MSG_CHECKING(for C99 inline)
c99_inline=no
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
[[inline int foo (int x) { return x * x; }
int (*bar) (int) = foo;]],
[[]])],
[c99_inline=no
AC_MSG_RESULT(no)],
[c99_inline=yes
AC_DEFINE(HAVE_C99INLINE, extern, define this if using c99 inline)
AC_MSG_RESULT(yes)]
)
AH_VERBATIM([HAVE_C99INLINE],
[#undef HAVE_C99INLINE
#ifdef __clang__
# define GNU89INLINE static
#else
# ifdef HAVE_C99INLINE
# define GNU89INLINE
# else
# define GNU89INLINE extern
# endif
#endif])
if test "x$GCC" = xyes; then
set $CC
shift
args="$*"
AC_MSG_CHECKING(for gcc version)
CCVER="gcc `$CC --version | grep '[[0-9]]\.[[0-9]]' | sed -e 's/.*(GCC)//' -e 's/[[^0-9]]*\([[0-9.]]*\).*/\1/'`"
set $CCVER
save_IFS="$IFS"
IFS="."
set $2
CC_MAJ=$1
CC_MIN=$2
CC_SUB=$3
IFS="$save_IFS"
AC_MSG_RESULT($CCVER)
fi
AC_ARG_ENABLE(debug,
AS_HELP_STRING([--disable-debug], [compile without debugging]),
debug=$enable_debug
)
AC_MSG_CHECKING(for debugging)
if test "x$debug" != xno -a "x$leave_cflags_alone" != xyes; then
AC_MSG_RESULT(yes)
BUILD_TYPE="$BUILD_TYPE Debug"
DEBUG=-g
if test "x$GCC" = xyes; then
if test "$CC_MAJ" -ge 4; then
DEBUG=-g3
else
if test "$CC_MAJ" -eq 3 -a "$CC_MIN" -ge 1; then
DEBUG=-g3
fi
fi
fi
CFLAGS="$CFLAGS $DEBUG"
else
AC_MSG_RESULT(no)
fi
AC_ARG_ENABLE(Werror,
AS_HELP_STRING([--disable-Werror], [do not treat warnings as errors]))
dnl We want warnings, lots of warnings...
dnl The help text should be INVERTED before release!
dnl when in git, this test defaults to ENABLED.
dnl In a release, this test defaults to DISABLED.
if test "x$GCC" = "xyes" -a "x$leave_cflags_alone" != xyes; then
if test "x$enable_Werror" $cvs_def_enabled; then
CFLAGS="$CFLAGS -Wall -Werror -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations"
else
CFLAGS="$CFLAGS -Wall"
fi
CFLAGS="$CFLAGS -fno-common"
fi
if test "x$CLANG" = xyes -a "x$leave_cflags_alone" != xyes; then
CFLAGS="$CFLAGS -Wno-misleading-indentation"
fi
AC_ARG_ENABLE(optimize,
AS_HELP_STRING([--disable-optimize],
[compile without optimizations (for development)]),
optimize=$enable_optimize,
optimize=yes
)
if test "x$host_cpu" = xaarch64; then
simd=neon
else
AC_ARG_ENABLE(simd,
AS_HELP_STRING([--enable-simd@<:@=arg@:.@],
[enable SIMD support (default auto)]),
[],
[enable_simd=yes]
)
case "$enable_simd" in
no)
simd=no
;;
sse|sse2|avx|avx2)
QF_CC_OPTION(-m$enable_simd)
simd=$enable_simd
;;
yes)
for simd in avx2 avx sse2 sse; do
if lscpu | grep -q -w $simd; then
QF_CC_OPTION(-m$simd)
break
fi
done
;;
esac
case "$simd" in
avx*)
;;
*)
QF_CC_OPTION(-Wno-psabi)
;;
esac
fi
AC_MSG_CHECKING(for optimization)
if test "x$optimize" = xyes -a "x$leave_cflags_alone" != "xyes"; then
AC_MSG_RESULT(yes)
BUILD_TYPE="$BUILD_TYPE Optimize"
if test "x$GCC" = xyes; then
saved_cflags="$CFLAGS"
dnl CFLAGS=""
QF_CC_OPTION(-frename-registers)
QF_CC_OPTION(-fexpensive-optimizations)
dnl if test "$CC_MAJ" -ge 4; then
dnl QF_CC_OPTION(-finline-limit=32000 -Winline)
dnl fi
dnl heavy="-O2 -ffast-math -fno-unsafe-math-optimizations -funroll-loops -fomit-frame-pointer"
heavy="-O2 -fno-fast-math -funroll-loops -fomit-frame-pointer "
CFLAGS="$saved_cflags"
light="-O2"
AC_ARG_ENABLE(strict-aliasing,
AS_HELP_STRING([--enable-strict-aliasing],
[enable the -fstrict-aliasing option of gcc]))
if test "x$enable_strict_aliasing" = "xyes"; then
heavy="$heavy -fstrict-aliasing"
light="$light -fstrict-aliasing"
else
if test "x$enable_strict_aliasing" != "xno"; then
if test $CC_MAJ -ge 3; then
heavy="$heavy -fstrict-aliasing"
else
if test $CC_MAJ = 2 -a $CC_MIN = 96; then
light="$light -fno-strict-aliasing"
fi
fi
else
if test $CC_MAJ = 2 -a $CC_MIN = 96; then
light="$light -fno-strict-aliasing"
fi
fi
fi
AC_MSG_CHECKING(for special compiler settings)
AC_ARG_WITH(arch,
AS_HELP_STRING([--with-arch=ARCH],
[control compiler architecture directly]),
arch="$withval", arch=auto
)
case "$arch" in
auto)
case "${host_cpu}" in
i?86)
MORE_CFLAGS="-march=${host_cpu}"
;;
*)
MORE_CFLAGS=""
;;
esac
;;
no|"")
MORE_CFLAGS=""
;;
*)
MORE_CFLAGS="-march=$arch"
;;
esac
if test "x$MORE_CFLAGS" = x; then
AC_MSG_RESULT(no)
else
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $MORE_CFLAGS"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[AC_MSG_RESULT(yes)],[CFLAGS="$save_CFLAGS"
AC_MSG_RESULT(no)
])
fi
if test $CC_MAJ = 2 -a $CC_MIN = 96; then
AC_MSG_CHECKING(if align options work)
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -malign-loops=2 -malign-jumps=2 -malign-functions=2"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[light="$light -malign-loops=2 -malign-jumps=2 -malign-functions=2"
AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)
])
CFLAGS="$save_CFLAGS"
CFLAGS="$CFLAGS $light"
else
CFLAGS="$CFLAGS $heavy"
fi
else
CFLAGS=-O2
fi
else
AC_MSG_RESULT(no)
fi
dnl CFLAGS for release and devel versions
AC_ARG_ENABLE(profile,
AS_HELP_STRING([--enable-profile],
[compile with profiling (for development)]),
profile=$enable_profile
)
if test "x$profile" = xyes -a "x$leave_cflags_alone" != xyes; then
BUILD_TYPE="$BUILD_TYPE Profile"
if test "x$GCC" = xyes; then
CFLAGS="`echo $CFLAGS | sed -e 's/-fomit-frame-pointer//g'` -pg"
LDFLAGS="$LDFLAGS -pg"
else
CFLAGS="$CFLAGS -p"
fi
fi
check_pipe=no
if test "x$GCC" = xyes -a "x$leave_cflags_alone" != xyes; then
dnl Check for -pipe vs -save-temps.
AC_MSG_CHECKING(for -pipe vs -save-temps)
AC_ARG_ENABLE(save-temps,
AS_HELP_STRING([--enable-save-temps], [save temporary files]),
AC_MSG_RESULT(-save-temps)
CFLAGS="$CFLAGS -save-temps"
BUILD_TYPE="$BUILD_TYPE Save-temps"
,
AC_MSG_RESULT(-pipe)
check_pipe=yes
)
fi
if test "x$check_pipe" = xyes; then
QF_CC_OPTION(-pipe)
fi
QF_CC_OPTION(-Wsign-compare)
if test $CC_MAJ -gt 4 -o $CC_MAJ -eq 4 -a $CC_MIN -ge 5; then
QF_CC_OPTION(-Wlogical-op)
fi
QF_CC_OPTION(-Wtype-limits)
QF_CC_OPTION_TEST([-fvisibility=hidden], [VISIBILITY=-fvisibility=hidden])
QF_CC_OPTION(-Wsuggest-attribute=pure)
QF_CC_OPTION(-Wsuggest-attribute=const)
QF_CC_OPTION(-Wsuggest-attribute=noreturn)
QF_CC_OPTION(-Wsuggest-attribute=format)
QF_CC_OPTION(-Wformat-nonliteral)
AC_ARG_ENABLE(coverage,
AS_HELP_STRING([--enable-coverage], [enable generation of data for gcov]))
if test "x$enable_coverage" = xyes; then
QF_CC_OPTION(-fprofile-arcs -ftest-coverage)
fi
dnl QuakeForge uses lots of BCPL-style (//) comments, which can cause problems
dnl with many compilers that do not support the latest ISO standards. Well,
dnl that is our cover story -- the reality is that we like them and do not want
dnl to give them up. :)
dnl Make the compiler swallow its pride...
if test "x$GCC" != xyes -a "x$CLANG" != xyes -a "x$leave_cflags_alone" != xyes; then
AC_MSG_CHECKING(for how to deal with BCPL-style comments)
case "${host}" in
*-aix*)
CFLAGS="$CFLAGS -qcpluscmt"
AC_MSG_RESULT([-qcpluscmt])
;;
*-irix6*)
CFLAGS="$CFLAGS -Xcpluscomm"
AC_MSG_RESULT([-Xcpluscomm])
;;
*-solaris*)
CFLAGS="$CFLAGS -xCC"
AC_MSG_RESULT([-xCC])
;;
*)
AC_MSG_RESULT(nothing needed or no switch known)
;;
esac
fi
if test "x$leave_cflags_alone" != xyes; then
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[bool flag = true;]],
[[return flag ? 1 : 0]])],
[],
[QF_CC_OPTION_TEST(-std=gnu23,[],QF_CC_OPTION(-std=gnu2x))]
)
fi
AC_MSG_CHECKING([for c23])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[bool flag = true;]
[int bar (void);]],
[[return bar();]])],
[AC_MSG_RESULT(yes)],
[AC_MSG_ERROR(QuakeForge requires C23 to compile)]
)
AS="$CC"
if test "x$SYSTYPE" = "xWIN32"; then
ASFLAGS="\$(DEFS) \$(CFLAGS) \$(CPPFLAGS) \$(DEFAULT_INCLUDES) \$(INCLUDES) -D_WIN32"
plugin_ldflags="-no-undefined"
plugin_libadd="-luser32 -lgdi32 -lwinmm"
case "$host_os" in
mingw*)
if test "x$host" != "x$build"; then
case "$build_os" in
cygwin*)
plugin_libadd=" -L/usr/lib/w32api $plugin_libadd"
;;
esac
fi
;;
esac
else
ASFLAGS="\$(DEFS) \$(CFLAGS) \$(CPPFLAGS) \$(DEFAULT_INCLUDES) \$(INCLUDES)"
plugin_ldflags=
plugin_libadd=
fi
ASFLAGS="$ASFLAGS -DQFASM"
CCASFLAGS="$ASFLAGS"
CCAS="$AS"
AC_SUBST(AS)
AC_SUBST(ASFLAGS)
AC_SUBST(CCAS)
AC_SUBST(CCASFLAGS)
QF_SUBST(plugin_ldflags)
QF_SUBST(plugin_libadd)
dnl Finalization of CFLAGS, LDFLAGS, and LIBS
AC_SUBST(CFLAGS)
AC_SUBST(LDFLAGS)
AC_SUBST(LIBS)