summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2020-01-03 18:19:33 -0500
committerPaul Smith <psmith@gnu.org>2020-01-04 13:23:23 -0500
commitb774aebffadd5f8374ff435b4c5d660ee899add7 (patch)
treec57832e89a23bedd0c791646d424e0a5cb513e7e
parent06de697268492b72297b02ef69f68becc1874b54 (diff)
downloadmake-git-b774aebffadd5f8374ff435b4c5d660ee899add7.tar.gz
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.
-rw-r--r--configure.ac18
-rw-r--r--maintMakefile45
-rw-r--r--src/dep.h2
-rw-r--r--src/file.c3
-rw-r--r--src/job.h4
-rw-r--r--src/main.c2
-rw-r--r--src/makeint.h41
-rw-r--r--src/rule.c10
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 <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);
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);