mirror of
https://github.com/mirror/make.git
synced 2025-01-27 21:00:22 +08:00
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.
This commit is contained in:
parent
06de697268
commit
b774aebffa
18
configure.ac
18
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], [])
|
PKG_CHECK_EXISTS([guile-$v], [guile_version=$v; have_guile=yes; break], [])
|
||||||
done
|
done
|
||||||
AC_MSG_RESULT([$guile_version])
|
AC_MSG_RESULT([$guile_version])
|
||||||
if test "$have_guile" = yes; then
|
AS_IF([test "$have_guile" = yes],
|
||||||
PKG_CHECK_MODULES(GUILE, [guile-$guile_version])
|
[ PKG_CHECK_MODULES(GUILE, [guile-$guile_version])
|
||||||
AC_DEFINE([HAVE_GUILE], [1], [Embed GNU Guile support])
|
# Unfortunately Guile requires a C99 compiler but GNU make doesn't, so
|
||||||
fi
|
# 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_CHECK_DECLS([sys_siglist, _sys_siglist, __sys_siglist], , ,
|
||||||
[AC_INCLUDES_DEFAULT
|
[AC_INCLUDES_DEFAULT
|
||||||
|
@ -231,15 +231,36 @@ get-doc/make-stds.texi get-doc/fdl.texi:
|
|||||||
# Alternative configuration checks. #
|
# 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 := \
|
CONFIG_CHECKS := \
|
||||||
checkcfg.--disable-job-server \
|
checkcfg.strict-c90 \
|
||||||
checkcfg.--disable-load \
|
checkcfg.no-jobserver \
|
||||||
checkcfg.--without-guile \
|
checkcfg.no-load \
|
||||||
checkcfg.--disable-posix-spawn \
|
checkcfg.no-guile \
|
||||||
checkcfg.make_cv_sys_gnu_glob^no \
|
checkcfg.no-spawn \
|
||||||
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.no-sysglob \
|
||||||
checkcfg.CPPFLAGS^-DNO_OUTPUT_SYNC \
|
checkcfg.no-loadavg \
|
||||||
checkcfg.CPPFLAGS^-DNO_ARCHIVES
|
checkcfg.no-sync \
|
||||||
|
checkcfg.no-archives
|
||||||
|
|
||||||
.PHONY: check-alt-config
|
.PHONY: check-alt-config
|
||||||
check-alt-config: $(CONFIG_CHECKS)
|
check-alt-config: $(CONFIG_CHECKS)
|
||||||
@ -251,20 +272,20 @@ NR_MAKE = $(MAKE)
|
|||||||
$(CONFIG_CHECKS): checkcfg.%: distdir
|
$(CONFIG_CHECKS): checkcfg.%: distdir
|
||||||
@echo "Building $@ (output in checkcfg.$*.log)"
|
@echo "Building $@ (output in checkcfg.$*.log)"
|
||||||
exec >'checkcfg.$*.log' 2>&1; \
|
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 \
|
rm -rf $(distdir)/_build \
|
||||||
&& mkdir $(distdir)/_build \
|
&& mkdir $(distdir)/_build \
|
||||||
&& cd $(distdir)/_build \
|
&& cd $(distdir)/_build \
|
||||||
&& ../configure --srcdir=.. $(subst ^,=,$(subst +, ,$*)) \
|
&& ../configure --srcdir=.. $(CFGCHECK_CONFIGFLAGS) \
|
||||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) $(DISTCHECK_CONFIGURE_FLAGS)
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) $(DISTCHECK_CONFIGURE_FLAGS)
|
||||||
exec >>'checkcfg.$*.log' 2>&1; set -x; \
|
exec >>'checkcfg.$*.log' 2>&1; set -x; \
|
||||||
cd $(distdir)/_build \
|
cd $(distdir)/_build \
|
||||||
&& OUTDIR=_bld ../build.sh \
|
&& OUTDIR=_bld ../build.sh $(CFGCHECK_BUILD_FLAGS) \
|
||||||
&& _bld/make $(AM_MAKEFLAGS) check-local \
|
&& _bld/make $(AM_MAKEFLAGS) check-local \
|
||||||
&& _bld/make $(AM_MAKEFLAGS) clean
|
&& _bld/make $(AM_MAKEFLAGS) clean
|
||||||
exec >>'checkcfg.$*.log' 2>&1; set -x; \
|
exec >>'checkcfg.$*.log' 2>&1; set -x; \
|
||||||
cd $(distdir)/_build \
|
cd $(distdir)/_build \
|
||||||
&& $(NR_MAKE) $(AM_MAKEFLAGS) CFLAGS='$(AM_CFLAGS)' \
|
&& $(NR_MAKE) $(AM_MAKEFLAGS) $(CFGCHECK_MAKEFLAGS) \
|
||||||
&& ./make $(AM_MAKEFLAGS) check \
|
&& ./make $(AM_MAKEFLAGS) check \
|
||||||
&& ./make $(AM_MAKEFLAGS) clean
|
&& ./make $(AM_MAKEFLAGS) clean
|
||||||
|
|
||||||
|
@ -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))
|
#define alloc_seq_elt(_t) xcalloc (sizeof (_t))
|
||||||
void free_ns_chain (struct nameseq *n);
|
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. */
|
/* Use inline to get real type-checking. */
|
||||||
#define SI static inline
|
#define SI static inline
|
||||||
SI struct nameseq *alloc_ns() { return alloc_seq_elt (struct nameseq); }
|
SI struct nameseq *alloc_ns() { return alloc_seq_elt (struct nameseq); }
|
||||||
|
@ -640,9 +640,10 @@ expand_deps (struct file *f)
|
|||||||
struct dep *
|
struct dep *
|
||||||
expand_extra_prereqs (const struct variable *extra)
|
expand_extra_prereqs (const struct variable *extra)
|
||||||
{
|
{
|
||||||
|
struct dep *d;
|
||||||
struct dep *prereqs = extra ? split_prereqs (variable_expand (extra->value)) : NULL;
|
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);
|
d->file = lookup_file (d->name);
|
||||||
if (!d->file)
|
if (!d->file)
|
||||||
|
@ -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);
|
pid_t child_execute_job (struct childbase *child, int good_stdin, char **argv);
|
||||||
|
|
||||||
#ifdef _AMIGA
|
#ifdef _AMIGA
|
||||||
void exec_command (char **argv) __attribute__ ((noreturn));
|
void exec_command (char **argv) NORETURN;
|
||||||
#elif defined(__EMX__)
|
#elif defined(__EMX__)
|
||||||
int exec_command (char **argv, char **envp);
|
int exec_command (char **argv, char **envp);
|
||||||
#else
|
#else
|
||||||
void exec_command (char **argv, char **envp) __attribute__ ((noreturn));
|
void exec_command (char **argv, char **envp) NORETURN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void unblock_all_sigs (void);
|
void unblock_all_sigs (void);
|
||||||
|
@ -96,7 +96,7 @@ int chdir ();
|
|||||||
#endif
|
#endif
|
||||||
#ifndef STDC_HEADERS
|
#ifndef STDC_HEADERS
|
||||||
# ifndef sun /* Sun has an incorrect decl in a header. */
|
# ifndef sun /* Sun has an incorrect decl in a header. */
|
||||||
void exit (int) __attribute__ ((noreturn));
|
void exit (int) NORETURN;
|
||||||
# endif
|
# endif
|
||||||
double atof ();
|
double atof ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -220,19 +220,22 @@ extern int vms_legacy_behavior;
|
|||||||
extern int vms_unix_simulation;
|
extern int vms_unix_simulation;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __attribute__
|
#if !defined(__attribute__) && (__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__)
|
||||||
/* This feature is available in gcc versions 2.5 and later. */
|
/* Don't use __attribute__ if it's not supported. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
|
# define ATTRIBUTE(x)
|
||||||
# define __attribute__(x)
|
#else
|
||||||
# endif
|
# define ATTRIBUTE(x) __attribute__ (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The __-protected variants of 'format' and 'printf' attributes
|
/* The __-protected variants of 'format' and 'printf' attributes
|
||||||
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
|
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
||||||
# define __format__ format
|
# define __format__ format
|
||||||
# define __printf__ printf
|
# define __printf__ printf
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
#define UNUSED __attribute__ ((unused))
|
|
||||||
|
#define UNUSED ATTRIBUTE ((unused))
|
||||||
|
#define NORETURN ATTRIBUTE ((noreturn))
|
||||||
|
|
||||||
#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
|
#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
@ -255,8 +258,8 @@ void *malloc (int);
|
|||||||
void *realloc (void *, int);
|
void *realloc (void *, int);
|
||||||
void free (void *);
|
void free (void *);
|
||||||
|
|
||||||
void abort (void) __attribute__ ((noreturn));
|
void abort (void) NORETURN;
|
||||||
void exit (int) __attribute__ ((noreturn));
|
void exit (int) NORETURN;
|
||||||
# endif /* HAVE_STDLIB_H. */
|
# endif /* HAVE_STDLIB_H. */
|
||||||
|
|
||||||
#endif /* Standard headers. */
|
#endif /* Standard headers. */
|
||||||
@ -327,7 +330,7 @@ extern mode_t umask (mode_t);
|
|||||||
|
|
||||||
#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0)
|
#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
|
# define ENUM_BITFIELD(bits) :bits
|
||||||
#else
|
#else
|
||||||
# define ENUM_BITFIELD(bits)
|
# define ENUM_BITFIELD(bits)
|
||||||
@ -486,12 +489,12 @@ typedef struct
|
|||||||
|
|
||||||
const char *concat (unsigned int, ...);
|
const char *concat (unsigned int, ...);
|
||||||
void message (int prefix, size_t length, const char *fmt, ...)
|
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, ...)
|
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, ...)
|
void fatal (const floc *flocp, size_t length, const char *fmt, ...)
|
||||||
__attribute__ ((noreturn, __format__ (__printf__, 3, 4)));
|
ATTRIBUTE ((noreturn, __format__ (__printf__, 3, 4)));
|
||||||
void out_of_memory () __attribute__((noreturn));
|
void out_of_memory () NORETURN;
|
||||||
|
|
||||||
/* When adding macros to this list be sure to update the value of
|
/* When adding macros to this list be sure to update the value of
|
||||||
XGETTEXT_OPTIONS in the po/Makevars file. */
|
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), \
|
#define ONS(_t,_a,_f,_n,_s) _t((_a), INTSTR_LENGTH + strlen (_s), \
|
||||||
(_f), (_n), (_s))
|
(_f), (_n), (_s))
|
||||||
|
|
||||||
void die (int) __attribute__ ((noreturn));
|
void die (int) NORETURN;
|
||||||
void pfatal_with_name (const char *) __attribute__ ((noreturn));
|
void pfatal_with_name (const char *) NORETURN;
|
||||||
void perror_with_name (const char *, const char *);
|
void perror_with_name (const char *, const char *);
|
||||||
#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
|
#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
|
||||||
void *xmalloc (size_t);
|
void *xmalloc (size_t);
|
||||||
|
10
src/rule.c
10
src/rule.c
@ -71,14 +71,16 @@ snap_implicit_rules (void)
|
|||||||
{
|
{
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
size_t namelen = 0;
|
size_t namelen = 0;
|
||||||
|
struct rule *rule;
|
||||||
|
struct dep *dep;
|
||||||
struct dep *prereqs = expand_extra_prereqs (lookup_variable (STRING_SIZE_TUPLE(".EXTRA_PREREQS")));
|
struct dep *prereqs = expand_extra_prereqs (lookup_variable (STRING_SIZE_TUPLE(".EXTRA_PREREQS")));
|
||||||
unsigned int pre_deps = 0;
|
unsigned int pre_deps = 0;
|
||||||
|
|
||||||
max_pattern_dep_length = 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)
|
if (l > max_pattern_dep_length)
|
||||||
max_pattern_dep_length = l;
|
max_pattern_dep_length = l;
|
||||||
++pre_deps;
|
++pre_deps;
|
||||||
@ -86,7 +88,7 @@ snap_implicit_rules (void)
|
|||||||
|
|
||||||
num_pattern_rules = max_pattern_targets = max_pattern_deps = 0;
|
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;
|
unsigned int ndeps = pre_deps;
|
||||||
struct dep *lastdep = NULL;
|
struct dep *lastdep = NULL;
|
||||||
@ -96,7 +98,7 @@ snap_implicit_rules (void)
|
|||||||
if (rule->num > max_pattern_targets)
|
if (rule->num > max_pattern_targets)
|
||||||
max_pattern_targets = rule->num;
|
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);
|
const char *dname = dep_name (dep);
|
||||||
size_t len = strlen (dname);
|
size_t len = strlen (dname);
|
||||||
|
Loading…
Reference in New Issue
Block a user