From 5a2d629501d57301fe1d85fe6b2576e318f523d1 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Sun, 19 Feb 2023 21:26:15 -0800 Subject: [PATCH] autoconf: a much of macro fixes... not sure how this ever worked? Exposed a bunch of problems with the autoconf m4 macro library. Hopefulyy fix it, and tidy it up in the process. Signed-off-by: H. Peter Anvin --- /dev/null +++ b/autoconf/m4/pa_add_cppflags.m4 @@ -0,0 +1,9 @@ +dnl -------------------------------------------------------------------------- +dnl PA_ADD_CPPFLAGS(variable, flag [,actual_flag [,success [,failure]]]]) +dnl +dnl Attempt to add the given option to xFLAGS, if it doesn't break +dnl compilation. If the option to be tested is different than the +dnl option that should actually be added, add the option to be +dnl actually added as a second argument. +dnl -------------------------------------------------------------------------- +AC_DEFUN([PA_ADD_CPPFLAGS], [PA_ADD_FLAGS(CPPFLAGS, [$1], [$2], [$3], [$4])]) --- a/autoconf/m4/pa_add_flags.m4 +++ b/autoconf/m4/pa_add_flags.m4 @@ -1,23 +1,39 @@ dnl -------------------------------------------------------------------------- -dnl PA_ADD_FLAGS(variable, flag [,actual_flag [,success [,failure]]]) +dnl PA_ADD_FLAGS(flagvar, flags) dnl -dnl Attempt to add the given option to CPPFLAGS, if it doesn't break -dnl compilation. If the option to be tested is different than the -dnl option that should actually be added, add the option to be -dnl actually added as a second argument. +dnl Add [flags] to the variable [flagvar] if and only if it is accepted +dnl by all languages affected by [flagvar], if those languages have +dnl been previously seen in the script. dnl -------------------------------------------------------------------------- AC_DEFUN([PA_ADD_FLAGS], -[AC_MSG_CHECKING([if $CC accepts $2]) - pa_add_flags__old_flags="$$1" - $1="$$1 $2" - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], - [printf("Hello, World!\n");])], - [AC_MSG_RESULT([yes]) - $1="$pa_add_flags__old_flags ifelse([$3],[],[$2],[$3])" - AC_DEFINE(PA_SYM([$1_],[$2]), 1, - [Define to 1 if compiled with the `$2' compiler flag]) +[ + AS_VAR_PUSHDEF([old], [_$0_$1_orig]) + AS_VAR_PUSHDEF([ok], [_$0_$1_ok]) + AS_VAR_PUSHDEF([flags], [$1]) + + AS_VAR_COPY([old], [flags]) + AS_VAR_SET([flags], ["$flags $2"]) + AS_VAR_SET([ok], [yes]) + + PA_LANG_FOREACH(PA_FLAGS_LANGLIST($1), + [AS_VAR_IF([ok], [yes], + [AC_MSG_CHECKING([if $]_AC_CC[ accepts $2]) + PA_BUILD_IFELSE([], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AS_VAR_SET([ok], [no])])]) + ]) + + AS_VAR_IF([ok], [yes], + [m4_ifnblank([$3],[AS_VAR_SET([flags], ["$old $3"])]) + m4_foreach_w([_pa_add_flags_flag], [m4_ifblank([$3],[$2],[$3])], + [AC_DEFINE(PA_SYM([$1_]_pa_add_flags_flag), 1, + [Define to 1 if compiled with the ]_pa_add_flags_flag[ compiler flag])]) $4], - [AC_MSG_RESULT([no]) - $1="$pa_add_flags__old_flags" - $5])]) + [AS_VAR_SET([flags], ["$old"]) + $5]) + + AS_VAR_POPDEF([flags]) + AS_VAR_POPDEF([ok]) + AS_VAR_POPDEF([old]) +]) --- /dev/null +++ b/autoconf/m4/pa_build_ifelse.m4 @@ -0,0 +1,16 @@ +dnl -------------------------------------------------------------------------- +dnl PA_BUILD_IFELSE(input [,success [,failure]]) +dnl +dnl Same as AC_LINK_IFELSE for languages where linking is applicable, +dnl otherwise AC_COMPILE_IFELSE. +dnl +dnl If the first argument is empty, use _AC_LANG_IO_PROGRAM. +dnl -------------------------------------------------------------------------- +m4_defun([_PA_BUILD_IFELSE], +[m4_case(_AC_LANG, + [Erlang], [AC_COMPILE_IFELSE($@)], + [AC_LINK_IFELSE($@)])]) + +AC_DEFUN([PA_BUILD_IFELSE], +[_PA_BUILD_IFELSE([m4_ifblank([$1],[AC_LANG_SOURCE(_AC_LANG_IO_PROGRAM)], + [$1])],[$2],[$3])]) --- /dev/null +++ b/autoconf/m4/pa_flags_langlist.m4 @@ -0,0 +1,19 @@ +dnl -------------------------------------------------------------------------- +dnl PA_FLAGS_LANGLIST(flagvar) +dnl +dnl Return a list of languages affected by the variable flagvar. +dnl If flagvar is unknown, assume it affects the current language. +dnl -------------------------------------------------------------------------- +AC_DEFUN([PA_FLAGS_LANGLIST], +[m4_dquote(m4_case([$1], + [CPPFLAGS], [[C],[C++],[Objective C],[Objective C++]], + [CFLAGS], [[C]], + [CXXFLAGS], [[C++]], + [FFLAGS], [[Fortran 77]], + [FCFLAGS], [[Fortran]], + [ERLCFLAGS], [[Erlang]], + [OBJCFLAGS], [[Objective C]], + [OBJCXXFLAGS], [[Objective C++]], + [GOFLAGS], [[Go]], + [LDFLAGS], [[C],[C++],[Fortran 77],[Fortran],[Objective C],[Objective C++],[Go]], + m4_dquote(_AC_LANG)))]) --- /dev/null +++ b/autoconf/m4/pa_lang_foreach.m4 @@ -0,0 +1,15 @@ +dnl -------------------------------------------------------------------------- +dnl PA_LANG_FOREACH(subset, body) +dnl +dnl Expand [body] for each language encountered in the configure script also +dnl present in [subset], or all if [subset] is empty +dnl -------------------------------------------------------------------------- +AC_DEFUN([_PA_LANG_DO],dnl +[AC_LANG([$2])dnl +$1]) + +AC_DEFUN([PA_LANG_FOREACH],dnl +[m4_pushdef([_pa_lang_foreach_current],[_AC_LANG])dnl +m4_map_args([m4_curry([_PA_LANG_DO],[$2])],m4_unquote(PA_LANG_SEEN_LIST($1)))dnl +AC_LANG(_pa_lang_foreach_current)dnl +m4_popdef([_pa_lang_foreach_current])]) --- /dev/null +++ b/autoconf/m4/pa_lang_seen_list.m4 @@ -0,0 +1,20 @@ +dnl -------------------------------------------------------------------------- +dnl PA_LANG_SEEN_LIST(subset) +dnl +dnl List of the language lang has been used in the configuration +dnl script so far, possibly subset by [subset]. +dnl +dnl This relies on overriding _AC_LANG_SET(from, to), +dnl the internal implementation of _AC_LANG. +dnl -------------------------------------------------------------------------- +m4_ifndef([_PA_LANG_SET], +[m4_rename([_AC_LANG_SET], [_PA_LANG_SET])dnl +m4_defun([_AC_LANG_SET], [m4_set_add([_PA_LANG_SEEN_SET],[$2])dnl +_PA_LANG_SET($@)])]) + +AC_DEFUN([PA_LANG_SEEN_LIST], +[m4_set_delete([_pa_lang_seen_subset])dnl +m4_pushdef([_pa_lang_seen_subset_list],m4_ifnblank([$1],[$1],m4_dquote(m4_set_list([_PA_LANG_SEEN_SET]))))dnl +m4_set_add_all([_pa_lang_seen_subset],_pa_lang_seen_subset_list)dnl +m4_cdr(m4_set_intersection([_pa_lang_seen_subset],[_PA_LANG_SEEN_SET]))dnl +m4_popdef([_pa_lang_seen_subset_list])]) --- a/configure.ac +++ b/configure.ac @@ -12,9 +12,6 @@ dnl start; this is used to generate config/unconfig.h. AH_BOTTOM([ /* Begin unconfig.h */]) -dnl Save initial CFLAGS, to see if -g -O2 came from configure or not -pa_init_cflags="$CFLAGS" - dnl This prevents us from running Wine and thinking we are not dnl cross-compiling when in fact we are; running Wine here is at dnl the best very slow and doesn't buy us a single thing at all. @@ -27,35 +24,29 @@ AC_CANONICAL_HOST dnl Enable any available C extensions AC_PROG_CC AC_USE_SYSTEM_EXTENSIONS -AC_SYS_LARGEFILE -PA_ADD_CFLAGS([-std=c17], [], [], -[PA_ADD_CFLAGS([-std=c11], [], [], - [PA_ADD_CFLAGS([-std=c99])])]) - -dnl If the user did not specify a CFLAGS default, change default -dnl to -O0 for debugging -PA_ARG_DISABLED([optimization], - [compile without optimization (-O0) to help debugging], - [pa_no_optimize=true]) +PA_ADD_CPPFLAGS([-std=c17], [], [], +[PA_ADD_CPPFLAGS([-std=c11], [], [], + [PA_ADD_CPPFLAGS([-std=c99])])]) -dnl Other programs -pa_no_optimize=false - -dnl Compile and link with dwarf debug +dnl Compile and link with gdb debug extensions PA_ARG_ENABLED([gdb], - [disable optimization and compile with extra debug information for GDB debugger], - [PA_ADD_CFLAGS([-ggdb3]) - pa_no_optimize=true]) + [compile with extra debug information for GDB debugger], + [PA_ADD_CFLAGS([-ggdb3])]) -AS_IF([$pa_no_optimize], - [PA_ADD_CFLAGS([-O0]) - PA_ADD_CFLAGS([-fno-omit-frame-pointer])]) +dnl Disable optimization +PA_ARG_DISABLED([optimization], + [compile without optimization (-O0) to help debugging], + [PA_ADD_CFLAGS([-O0]) + PA_ADD_CFLAGS([-fno-omit-frame-pointer])]) dnl Profiling PA_ARG_ENABLED([profiling], [compile with profiling (-pg option)], [PA_ADD_CFLAGS([-pg])]) +dnl Large files +AC_SYS_LARGEFILE + dnl Abort on panic PA_ARG_ENABLED([panic-abort], [call abort() on panic to trap in the debugger], @@ -104,10 +95,10 @@ AC_PROG_MAKE_SET AC_PROG_INSTALL AC_PROG_MKDIR_P -AC_CHECK_PROGS(NROFF, nroff, false) -AC_CHECK_PROGS(ASCIIDOC, asciidoc, false) -AC_CHECK_PROGS(XMLTO, xmlto, false) -AC_CHECK_PROGS(XZ, xz, false) +AC_CHECK_PROGS([NROFF], nroff, false) +AC_CHECK_PROGS([ASCIIDOC], asciidoc, false) +AC_CHECK_PROGS([XMLTO], xmlto, false) +AC_CHECK_PROGS([XZ], xz, false) dnl Check for progs needed for manpage generation MANPAGES=manpages