diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-28 14:34:22 +0200 |
---|---|---|
committer | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-28 14:57:43 +0200 |
commit | afc48f8939b99a1a72b43b3e342d56193ed1f34c (patch) | |
tree | a29656df4a3cf3250d1283f3c4668e126c06e83c /aclocal.m4 | |
parent | ffc802e8f617d11de9ece7bed438725bde0300b8 (diff) | |
download | haskell-afc48f8939b99a1a72b43b3e342d56193ed1f34c.tar.gz |
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
Diffstat (limited to 'aclocal.m4')
-rw-r--r-- | aclocal.m4 | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/aclocal.m4 b/aclocal.m4 index 5becadbbb4..6403748c7f 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -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 # ---------------------------------- |