[nasm:master] autoconf: a much of macro fixes... not sure how this ever worked?
nasm-bot for H. Peter Anvin
hpa at zytor.com
Sun Feb 19 21:30:07 PST 2023
Commit-ID: 5a2d629501d57301fe1d85fe6b2576e318f523d1
Gitweb: http://repo.or.cz/w/nasm.git?a=commitdiff;h=5a2d629501d57301fe1d85fe6b2576e318f523d1
Author: H. Peter Anvin <hpa at zytor.com>
AuthorDate: Sun, 19 Feb 2023 21:26:15 -0800
Committer: H. Peter Anvin <hpa at zytor.com>
CommitDate: Sun, 19 Feb 2023 21:26:15 -0800
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 <hpa at zytor.com>
---
.../m4/{pa_add_cflags.m4 => pa_add_cppflags.m4} | 4 +-
autoconf/m4/pa_add_flags.m4 | 52 ++++++++++++++--------
autoconf/m4/pa_build_ifelse.m4 | 16 +++++++
autoconf/m4/pa_flags_langlist.m4 | 19 ++++++++
autoconf/m4/pa_lang_foreach.m4 | 15 +++++++
autoconf/m4/pa_lang_seen_list.m4 | 20 +++++++++
configure.ac | 45 ++++++++-----------
7 files changed, 124 insertions(+), 47 deletions(-)
diff --git a/autoconf/m4/pa_add_cflags.m4 b/autoconf/m4/pa_add_cppflags.m4
similarity index 72%
copy from autoconf/m4/pa_add_cflags.m4
copy to autoconf/m4/pa_add_cppflags.m4
index 26d55c4a..e5985f85 100644
--- a/autoconf/m4/pa_add_cflags.m4
+++ b/autoconf/m4/pa_add_cppflags.m4
@@ -1,9 +1,9 @@
dnl --------------------------------------------------------------------------
-dnl PA_ADD_CFLAGS(variable, flag [,actual_flag [,success [,failure]]]])
+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_CFLAGS], [PA_ADD_FLAGS(CFLAGS, [$1], [$2], [$3], [$4])])
+AC_DEFUN([PA_ADD_CPPFLAGS], [PA_ADD_FLAGS(CPPFLAGS, [$1], [$2], [$3], [$4])])
diff --git a/autoconf/m4/pa_add_flags.m4 b/autoconf/m4/pa_add_flags.m4
index 06b0a77d..23f96f12 100644
--- 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])
+])
diff --git a/autoconf/m4/pa_build_ifelse.m4 b/autoconf/m4/pa_build_ifelse.m4
new file mode 100644
index 00000000..1aacfcd7
--- /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])])
diff --git a/autoconf/m4/pa_flags_langlist.m4 b/autoconf/m4/pa_flags_langlist.m4
new file mode 100644
index 00000000..2ef5ded2
--- /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)))])
diff --git a/autoconf/m4/pa_lang_foreach.m4 b/autoconf/m4/pa_lang_foreach.m4
new file mode 100644
index 00000000..650913d8
--- /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])])
diff --git a/autoconf/m4/pa_lang_seen_list.m4 b/autoconf/m4/pa_lang_seen_list.m4
new file mode 100644
index 00000000..d5240136
--- /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])])
diff --git a/configure.ac b/configure.ac
index 42cd1988..c8eec951 100644
--- 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
More information about the Nasm-commits
mailing list