]> git.ipfire.org Git - thirdparty/make.git/commitdiff
Enable compilation with C90 compilers
authorPaul Smith <psmith@gnu.org>
Fri, 3 Jan 2020 23:19:33 +0000 (18:19 -0500)
committerPaul Smith <psmith@gnu.org>
Sat, 4 Jan 2020 18:23:23 +0000 (13:23 -0500)
* 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
maintMakefile
src/dep.h
src/file.c
src/job.h
src/main.c
src/makeint.h
src/rule.c

index 660148ee8fb3b82145eb41bbe1d65b815775437c..22491073f0d0371cbc9bb8964154d587626095da 100644 (file)
@@ -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
index 172079c16676f0169068c9bc4b28f8c06c57e075..f72f89cec8af6a3669a70b81dfc00862c85337c8 100644 (file)
@@ -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
 
index 04677f1bd10de7c55b7e6dff9d8721eaba6f4e63..76718f002c04f5cb5080511bff0b6fba238c0d69 100644 (file)
--- 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); }
index 2f1425e694f67ab91ae078ddd57a428477512e56..a979ca550e87ba43c49b06459185649e4e9f4fa5 100644 (file)
@@ -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)
index 812df0d6ca6cc03fbfa58d4208f9c496a8a4e245..ee290fb4aead368f5b575805150a556459a62194 100644 (file)
--- 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);
index 8d18d1431407c9a9d47fd39d20724a76b97ecfd6..78a27d7130e1609d57418f84d6a068c5ab02b0f0 100644 (file)
@@ -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
index 09bfd8cc66aba760dc4f893c554b8bc77354a296..c428a362a4cc59c7960bc10f19e217bc05bdce4e 100644 (file)
@@ -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 <stdlib.h>
@@ -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);
index 358ec56fbcc613ba7ced9c69a5e511089a283b25..f4c117907a1ba474d37b3a4c0847dedf2b4d5e8b 100644 (file)
@@ -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);