From b774aebffadd5f8374ff435b4c5d660ee899add7 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Fri, 3 Jan 2020 18:19:33 -0500 Subject: [PATCH] Enable compilation with C90 compilers * configure.ac: Try compiling Guile headers: they don't work with C90. * maintMakefile: Simplify config checks via target-specific variables. * src/makeint.h: Use ATTRIBUTE rather than defining __attribute__, as that causes compile issues with system headers. (ENUM_BITFIELD): Don't use enum bitfields in ANSI mode. * src/main.c: Use ATTRIBUTE instead of __attribute__. * src/job.h: Ditto. * src/file.c: Don't define variables inside for loops. * src/rule.c: Ditto. * src/dep.h (SI): Only use static inline in non-ANSI mode. --- configure.ac | 18 +++++++++++++----- maintMakefile | 45 +++++++++++++++++++++++++++++++++------------ src/dep.h | 2 +- src/file.c | 3 ++- src/job.h | 4 ++-- src/main.c | 2 +- src/makeint.h | 41 ++++++++++++++++++++++------------------- src/rule.c | 10 ++++++---- 8 files changed, 80 insertions(+), 45 deletions(-) diff --git a/configure.ac b/configure.ac index 660148ee..22491073 100644 --- a/configure.ac +++ b/configure.ac @@ -184,13 +184,21 @@ AS_IF([test "x$with_guile" != xno], PKG_CHECK_EXISTS([guile-$v], [guile_version=$v; have_guile=yes; break], []) done AC_MSG_RESULT([$guile_version]) - if test "$have_guile" = yes; then - PKG_CHECK_MODULES(GUILE, [guile-$guile_version]) - AC_DEFINE([HAVE_GUILE], [1], [Embed GNU Guile support]) - fi + AS_IF([test "$have_guile" = yes], + [ PKG_CHECK_MODULES(GUILE, [guile-$guile_version]) + # Unfortunately Guile requires a C99 compiler but GNU make doesn't, so + # verify we can actually compile the header. + keep_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $pkg_cv_GUILE_CFLAGS" + AC_CHECK_HEADER([libguile.h], + [AC_DEFINE([HAVE_GUILE], [1], [Embed GNU Guile support])], + [have_guile=no], + [/* Avoid configuration error warnings. */]) + CPPFLAGS="$keep_CPPFLAGS" + ]) ]) -AM_CONDITIONAL([HAVE_GUILE], [test "$have_guile" = yes]) +AM_CONDITIONAL([HAVE_GUILE], [test "$have_guile" = "yes"]) AC_CHECK_DECLS([sys_siglist, _sys_siglist, __sys_siglist], , , [AC_INCLUDES_DEFAULT diff --git a/maintMakefile b/maintMakefile index 172079c1..f72f89ce 100644 --- a/maintMakefile +++ b/maintMakefile @@ -231,15 +231,36 @@ get-doc/make-stds.texi get-doc/fdl.texi: # Alternative configuration checks. # # ---------------------------------- # +CFGCHECK_CONFIGFLAGS = +CFGCHECK_BUILDFLAGS = +CFGCHECK_MAKEFLAGS = CFLAGS='$(AM_CFLAGS)' + +checkcfg.strict-c90: CFGCHECK_CONFIGFLAGS = CFLAGS='-std=c90 -pedantic' +checkcfg.strict-c90: CFGCHECK_MAKEFLAGS = + +checkcfg.no-jobserver:CFGCHECK_CONFIGFLAGS = --disable-job-server +checkcfg.no-load: CFGCHECK_CONFIGFLAGS = --disable-load +checkcfg.no-guile: CFGCHECK_CONFIGFLAGS = --without-guile +checkcfg.no-spawn: CFGCHECK_CONFIGFLAGS = --disable-posix-spawn +checkcfg.no-sysglob: CFGCHECK_CONFIGFLAGS = make_cv_sys_gnu_glob=no +checkcfg.no-loadavg: CFGCHECK_CONFIGFLAGS = ac_cv_func_getloadavg=no \ + ac_cv_have_decl_getloadavg=no \ + gl_cv_have_raw_decl_getloadavg=no \ + ac_cv_lib_util_getloadavg=no \ + ac_cv_lib_getloadavg_getloadavg=no +checkcfg.no-sync: CFGCHECK_CONFIGFLAGS = CPPFLAGS=-DNO_OUTPUT_SYNC +checkcfg.no-archives: CFGCHECK_CONFIGFLAGS = CPPFLAGS=-DNO_ARCHIVES + CONFIG_CHECKS := \ - checkcfg.--disable-job-server \ - checkcfg.--disable-load \ - checkcfg.--without-guile \ - checkcfg.--disable-posix-spawn \ - checkcfg.make_cv_sys_gnu_glob^no \ - checkcfg.ac_cv_func_getloadavg^no+ac_cv_have_decl_getloadavg^no+gl_cv_have_raw_decl_getloadavg^no+ac_cv_lib_util_getloadavg^no+ac_cv_lib_getloadavg_getloadavg^no \ - checkcfg.CPPFLAGS^-DNO_OUTPUT_SYNC \ - checkcfg.CPPFLAGS^-DNO_ARCHIVES + checkcfg.strict-c90 \ + checkcfg.no-jobserver \ + checkcfg.no-load \ + checkcfg.no-guile \ + checkcfg.no-spawn \ + checkcfg.no-sysglob \ + checkcfg.no-loadavg \ + checkcfg.no-sync \ + checkcfg.no-archives .PHONY: check-alt-config check-alt-config: $(CONFIG_CHECKS) @@ -251,20 +272,20 @@ NR_MAKE = $(MAKE) $(CONFIG_CHECKS): checkcfg.%: distdir @echo "Building $@ (output in checkcfg.$*.log)" exec >'checkcfg.$*.log' 2>&1; \ - echo "Testing configure with $(subst ^,=,$(subst +, ,$*))"; set -x; \ + echo "Testing configure with $(CFGCHECK_CONFIGFLAGS)"; set -x; \ rm -rf $(distdir)/_build \ && mkdir $(distdir)/_build \ && cd $(distdir)/_build \ - && ../configure --srcdir=.. $(subst ^,=,$(subst +, ,$*)) \ + && ../configure --srcdir=.. $(CFGCHECK_CONFIGFLAGS) \ $(AM_DISTCHECK_CONFIGURE_FLAGS) $(DISTCHECK_CONFIGURE_FLAGS) exec >>'checkcfg.$*.log' 2>&1; set -x; \ cd $(distdir)/_build \ - && OUTDIR=_bld ../build.sh \ + && OUTDIR=_bld ../build.sh $(CFGCHECK_BUILD_FLAGS) \ && _bld/make $(AM_MAKEFLAGS) check-local \ && _bld/make $(AM_MAKEFLAGS) clean exec >>'checkcfg.$*.log' 2>&1; set -x; \ cd $(distdir)/_build \ - && $(NR_MAKE) $(AM_MAKEFLAGS) CFLAGS='$(AM_CFLAGS)' \ + && $(NR_MAKE) $(AM_MAKEFLAGS) $(CFGCHECK_MAKEFLAGS) \ && ./make $(AM_MAKEFLAGS) check \ && ./make $(AM_MAKEFLAGS) clean diff --git a/src/dep.h b/src/dep.h index 04677f1b..76718f00 100644 --- a/src/dep.h +++ b/src/dep.h @@ -100,7 +100,7 @@ struct nameseq *ar_glob (const char *arname, const char *member_pattern, size_t #define alloc_seq_elt(_t) xcalloc (sizeof (_t)) void free_ns_chain (struct nameseq *n); -#if defined(MAKE_MAINTAINER_MODE) && defined(__GNUC__) +#if defined(MAKE_MAINTAINER_MODE) && defined(__GNUC__) && !defined(__STRICT_ANSI__) /* Use inline to get real type-checking. */ #define SI static inline SI struct nameseq *alloc_ns() { return alloc_seq_elt (struct nameseq); } diff --git a/src/file.c b/src/file.c index 2f1425e6..a979ca55 100644 --- a/src/file.c +++ b/src/file.c @@ -640,9 +640,10 @@ expand_deps (struct file *f) struct dep * expand_extra_prereqs (const struct variable *extra) { + struct dep *d; struct dep *prereqs = extra ? split_prereqs (variable_expand (extra->value)) : NULL; - for (struct dep *d = prereqs; d; d = d->next) + for (d = prereqs; d; d = d->next) { d->file = lookup_file (d->name); if (!d->file) diff --git a/src/job.h b/src/job.h index 812df0d6..ee290fb4 100644 --- a/src/job.h +++ b/src/job.h @@ -80,11 +80,11 @@ char **construct_command_argv (char *line, char **restp, struct file *file, pid_t child_execute_job (struct childbase *child, int good_stdin, char **argv); #ifdef _AMIGA -void exec_command (char **argv) __attribute__ ((noreturn)); +void exec_command (char **argv) NORETURN; #elif defined(__EMX__) int exec_command (char **argv, char **envp); #else -void exec_command (char **argv, char **envp) __attribute__ ((noreturn)); +void exec_command (char **argv, char **envp) NORETURN; #endif void unblock_all_sigs (void); diff --git a/src/main.c b/src/main.c index 8d18d143..78a27d71 100644 --- a/src/main.c +++ b/src/main.c @@ -96,7 +96,7 @@ int chdir (); #endif #ifndef STDC_HEADERS # ifndef sun /* Sun has an incorrect decl in a header. */ -void exit (int) __attribute__ ((noreturn)); +void exit (int) NORETURN; # endif double atof (); #endif diff --git a/src/makeint.h b/src/makeint.h index 09bfd8cc..c428a362 100644 --- a/src/makeint.h +++ b/src/makeint.h @@ -220,19 +220,22 @@ extern int vms_legacy_behavior; extern int vms_unix_simulation; #endif -#ifndef __attribute__ -/* This feature is available in gcc versions 2.5 and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ -# define __attribute__(x) -# endif +#if !defined(__attribute__) && (__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__) +/* Don't use __attribute__ if it's not supported. */ +# define ATTRIBUTE(x) +#else +# define ATTRIBUTE(x) __attribute__ (x) +#endif + /* The __-protected variants of 'format' and 'printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) -# define __format__ format -# define __printf__ printf -# endif +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf #endif -#define UNUSED __attribute__ ((unused)) + +#define UNUSED ATTRIBUTE ((unused)) +#define NORETURN ATTRIBUTE ((noreturn)) #if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__) # include @@ -255,8 +258,8 @@ void *malloc (int); void *realloc (void *, int); void free (void *); -void abort (void) __attribute__ ((noreturn)); -void exit (int) __attribute__ ((noreturn)); +void abort (void) NORETURN; +void exit (int) NORETURN; # endif /* HAVE_STDLIB_H. */ #endif /* Standard headers. */ @@ -327,7 +330,7 @@ extern mode_t umask (mode_t); #define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0) -#if defined(__GNUC__) || defined(ENUM_BITFIELDS) +#if defined(ENUM_BITFIELDS) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define ENUM_BITFIELD(bits) :bits #else # define ENUM_BITFIELD(bits) @@ -486,12 +489,12 @@ typedef struct const char *concat (unsigned int, ...); void message (int prefix, size_t length, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 3, 4))); + ATTRIBUTE ((__format__ (__printf__, 3, 4))); void error (const floc *flocp, size_t length, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 3, 4))); + ATTRIBUTE ((__format__ (__printf__, 3, 4))); void fatal (const floc *flocp, size_t length, const char *fmt, ...) - __attribute__ ((noreturn, __format__ (__printf__, 3, 4))); -void out_of_memory () __attribute__((noreturn)); + ATTRIBUTE ((noreturn, __format__ (__printf__, 3, 4))); +void out_of_memory () NORETURN; /* When adding macros to this list be sure to update the value of XGETTEXT_OPTIONS in the po/Makevars file. */ @@ -509,8 +512,8 @@ void out_of_memory () __attribute__((noreturn)); #define ONS(_t,_a,_f,_n,_s) _t((_a), INTSTR_LENGTH + strlen (_s), \ (_f), (_n), (_s)) -void die (int) __attribute__ ((noreturn)); -void pfatal_with_name (const char *) __attribute__ ((noreturn)); +void die (int) NORETURN; +void pfatal_with_name (const char *) NORETURN; void perror_with_name (const char *, const char *); #define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s)) void *xmalloc (size_t); diff --git a/src/rule.c b/src/rule.c index 358ec56f..f4c11790 100644 --- a/src/rule.c +++ b/src/rule.c @@ -71,14 +71,16 @@ snap_implicit_rules (void) { char *name = NULL; size_t namelen = 0; + struct rule *rule; + struct dep *dep; struct dep *prereqs = expand_extra_prereqs (lookup_variable (STRING_SIZE_TUPLE(".EXTRA_PREREQS"))); unsigned int pre_deps = 0; max_pattern_dep_length = 0; - for (struct dep *d = prereqs; d; d = d->next) + for (dep = prereqs; dep; dep = dep->next) { - size_t l = strlen (dep_name (d)); + size_t l = strlen (dep_name (dep)); if (l > max_pattern_dep_length) max_pattern_dep_length = l; ++pre_deps; @@ -86,7 +88,7 @@ snap_implicit_rules (void) num_pattern_rules = max_pattern_targets = max_pattern_deps = 0; - for (struct rule *rule = pattern_rules; rule; rule = rule->next) + for (rule = pattern_rules; rule; rule = rule->next) { unsigned int ndeps = pre_deps; struct dep *lastdep = NULL; @@ -96,7 +98,7 @@ snap_implicit_rules (void) if (rule->num > max_pattern_targets) max_pattern_targets = rule->num; - for (struct dep *dep = rule->deps; dep != 0; dep = dep->next) + for (dep = rule->deps; dep != 0; dep = dep->next) { const char *dname = dep_name (dep); size_t len = strlen (dname);