Commit afc48f89 authored by Herbert Valerio Riedel's avatar Herbert Valerio Riedel 🕺

Autoconf: detect and set CFLAGS/CPPFLAGS needed for C99 mode

This is the first phase of addressing #11757 which aims to make C99
support a base-line requirement for GHC and clean up the code-base to
use C99 facilities when sensible.

This patch exploits the logic/heuristic used by `AC_PROG_CC_C99` to
determine the flags needed in case the C compiler isn't able to compile
C99 code in its current mode. We can't use `AC_PROG_CC_C99` directly
though because GHC's build-system expects CC to contain a filename
without any flags, while `AC_PROG_CC_C99` would e.g. result in
`CC="gcc -std=gnu99"`. Morever, we support different `CC`s for
stage0/1/2, so we need a version of `AC_PROG_CC_C99` for which we can
specify the `CC`/`CFLAGS` variables to operate on. This is what
`FP_SET_CFLAGS_C99` does.

Note that Clang has been defaulting to C99+ for a long time, while GCC 5
defaults to C99+ as well. So this has mostly an affect on older GCCs
versions prior to 5.0 and possibly compilers other than GCC/Clang (which
are not officially supported for building GHC anyway).

Reviewers: kgardas, erikd, bgamari, austin

Reviewed By: erikd

Differential Revision: https://phabricator.haskell.org/D2045
parent ffc802e8
......@@ -514,6 +514,48 @@ AC_DEFUN([FP_SETTINGS],
AC_SUBST(SettingsOptCommand)
])
# Helper for cloning a shell variable's state
AC_DEFUN([FP_COPY_SHELLVAR],
[if test -n "${$1+set}"; then $2="$$1"; else unset $2; fi ])
# FP_SET_CFLAGS_C99
# ----------------------------------
# figure out which CFLAGS are needed to place the compiler into C99 mode
# $1 is name of CC variable (unmodified)
# $2 is name of CC flags variable (augmented if needed)
# $3 is name of CPP flags variable (augmented if needed)
AC_DEFUN([FP_SET_CFLAGS_C99],
[
dnl save current state of AC_PROG_CC_C99
FP_COPY_SHELLVAR([CC],[fp_save_CC])
FP_COPY_SHELLVAR([CFLAGS],[fp_save_CFLAGS])
FP_COPY_SHELLVAR([CPPFLAGS],[fp_save_CPPFLAGS])
FP_COPY_SHELLVAR([ac_cv_prog_cc_c99],[fp_save_cc_c99])
dnl set local state
CC="$$1"
CFLAGS="$$2"
CPPFLAGS="$$3"
unset ac_cv_prog_cc_c99
dnl perform detection
_AC_PROG_CC_C99
fp_cc_c99="$ac_cv_prog_cc_c99"
case "x$ac_cv_prog_cc_c99" in
x) ;; # noop
xno) AC_MSG_ERROR([C99-compatible compiler needed]) ;;
*) $2="$$2 $ac_cv_prog_cc_c99"
$3="$$3 $ac_cv_prog_cc_c99"
;;
esac
dnl restore saved state
FP_COPY_SHELLVAR([fp_save_CC],[CC])
FP_COPY_SHELLVAR([fp_save_CFLAGS],[CFLAGS])
FP_COPY_SHELLVAR([fp_save_CPPFLAGS],[CPPFLAGS])
FP_COPY_SHELLVAR([fp_save_cc_c99],[ac_cv_prog_cc_c99])
dnl cleanup
unset fp_save_CC
unset fp_save_CFLAGS
unset fp_save_cc_c99
])
# FPTOOLS_SET_C_LD_FLAGS
# ----------------------------------
......
......@@ -461,6 +461,11 @@ FP_CPP_CMD_WITH_ARGS(HaskellCPPCmd, HaskellCPPArgs)
AC_SUBST([HaskellCPPCmd])
AC_SUBST([HaskellCPPArgs])
FP_SET_CFLAGS_C99([CC],[CFLAGS],[CPPFLAGS])
FP_SET_CFLAGS_C99([CC_STAGE0],[CONF_CC_OPTS_STAGE0],[CONF_CPP_OPTS_STAGE0])
FP_SET_CFLAGS_C99([CC],[CONF_CC_OPTS_STAGE1],[CONF_CPP_OPTS_STAGE1])
FP_SET_CFLAGS_C99([CC],[CONF_CC_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2])
dnl ** Which ld to use?
dnl --------------------------------------------------------------
FIND_LD([LdCmd])
......
......@@ -109,6 +109,11 @@ dnl ** Check gcc version and flags we need to pass it **
#
FP_GCC_EXTRA_FLAGS
FP_SET_CFLAGS_C99([CC],[CFLAGS],[CPPFLAGS])
dnl FP_SET_CFLAGS_C99([CC_STAGE0],[CONF_CC_OPTS_STAGE0],[CONF_CPP_OPTS_STAGE0])
FP_SET_CFLAGS_C99([CC],[CONF_CC_OPTS_STAGE1],[CONF_CPP_OPTS_STAGE1])
FP_SET_CFLAGS_C99([CC],[CONF_CC_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2])
FPTOOLS_SET_C_LD_FLAGS([target],[CFLAGS],[LDFLAGS],[IGNORE_LINKER_LD_FLAGS],[CPPFLAGS])
FPTOOLS_SET_C_LD_FLAGS([build],[CONF_CC_OPTS_STAGE0],[CONF_GCC_LINKER_OPTS_STAGE0],[CONF_LD_LINKER_OPTS_STAGE0],[CONF_CPP_OPTS_STAGE0])
FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE1],[CONF_GCC_LINKER_OPTS_STAGE1],[CONF_LD_LINKER_OPTS_STAGE1],[CONF_CPP_OPTS_STAGE1])
......
......@@ -26,6 +26,10 @@
#ifndef STG_H
#define STG_H
#if !(__STDC_VERSION__ >= 199901L)
# error __STDC_VERSION__ does not advertise C99 or later
#endif
/*
* If we are compiling a .hc file, then we want all the register
* variables. This is the what happens if you #include "Stg.h" first:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment