* 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.
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
# 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)
$(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
#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); }
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)
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);
#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
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>
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. */
#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)
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. */
#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);
{
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;
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;
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);