--- /dev/null
+-----------------------------------
+
+GNU make and the GNU Make User's Manual were created by:
+ Roland McGrath <roland@gnu.ai.mit.edu>
+ Richard M. Stallman <rms@gnu.ai.mit.edu>
+
+
+Development and maintenance up to GNU make 3.75 by:
+ Roland McGrath <roland@gnu.ai.mit.edu>
+
+
+Development and maintenance starting with GNU make 3.76 by:
+ Paul D. Smith <psmith@gnu.ai.mit.edu>
+
+
+-----------------------------------
+GNU Make porting efforts:
+
+ Port to VMS by:
+ Klaus Kaempf (kkaempf@progis.de)
+
+
+ Port to Amiga by:
+ Aaron Digulla <digulla@fh-konstanz.de>
+
+
+ Port to MS-DOS (DJGPP) and MS-Windows 95/NT by:
+ DJ Delorie <dj@delorie.com>
+ Rob Tulloh <rob_tulloh@tivoli.com>
+ Eli Zaretskii <eliz@is.elta.co.il>
+
+-----------------------------------
+Other contributors:
+
+ Janet Carson <janet_carson@tivoli.com>
+ Paul Eggert <eggert@twinsun.com>
+ Klaus Heinz <kamar@ease.rhein-main.de>
+ Michael Joosten
+ Jim Kelton <jim_kelton@tivoli.com>
+ David Lubbren <uhay@rz.uni-karlsruhe.de>
+ Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ Carl Staelin (Princeton University)
+ Ian Stewartson (Data Logic Limited)
+
+With suggestions/comments/bug reports from a cast of ... well ...
+hundreds, anyway :)
+Mon Aug 18 09:41:08 1997 Paul D. Smith <psmith@baynetworks.com>
+
+ * Version 3.75.91
+
+Fri Aug 15 13:50:54 1997 Paul D. Smith <psmith@baynetworks.com>
+
+ * read.c (do_define): Remember to count the newline after the endef.
+
+Thu Aug 14 23:14:37 1997 Paul D. Smith <psmith@baynetworks.com>
+
+ * many: Rewrote builds to use Automake 1.2.
+
+ * AUTHORS: New file.
+ * maintMakefile: Contains maintainer-only make snippets.
+ * GNUmakefile: This now only runs the initial auto* tools.
+ * COPYING,texinfo.tex,mkinstalldirs,install-sh: Removed (obtained
+ automatically by automake).
+ * compatMakefile: Removed (not needed anymore).
+ * README,build.sh.in: Removed (built from templates).
+ * config.h.in,Makefile.in: Removed (built by tools).
+
+Wed Aug 13 02:22:08 1997 Paul D. Smith <psmith@baynetworks.com>
+
+ * make.texinfo: Updates for DOS/Windows information (Eli Zaretskii)
+ * README,README.DOS: Ditto.
+
+ * remake.c (update_file_1,f_mtime): Fix GPATH handling.
+ * vpath.c (gpath_search): Ditto.
+
+ * file.c (rename_file): New function: rehash, but also rename to
+ the hashname.
+ * filedef.h: Declare it.
+
+ * variable.c (merge_variable_set_lists): Remove free() of variable
+ set; since various files can share variable sets we don't want to
+ free them here.
+
+Tue Aug 12 10:51:54 1997 Paul D. Smith <psmith@baynetworks.com>
+
+ * configure.in: Require autoconf 2.12
+
+ * make.texinfo: Replace all "cd subdir; $(MAKE)" examples with a
+ more stylistically correct "cd subdir && $(MAKE)".
+
+ * main.c: Global variable `clock_skew_detected' defined.
+ (main): Print final warning if it's set.
+ * make.h: Declare it.
+ * remake.c (f_mtime): Test and set it.
+
+ * job.c (start_job_command): Add special optimizations for
+ "do-nothing" rules, containing just the shell no-op ":". This is
+ useful for timestamp files and can make a real difference if you
+ have a lot of them (requested by Fergus Henderson <fjh@cs.mu.oz.au>).
+
+ * configure.in,Makefile.in: Rewrote to use the new autoconf
+ program_transform_name macro.
+
+ * function.c (function_strip): Strip newlines as well as spaces
+ and TABs.
+
+Fri Jun 6 23:41:04 1997 Rob Tulloh <rob_tulloh@tivoli.com>
+
+ * remake.c (f_mtime): Datestamps on FAT-based files are rounded to
+ even seconds when stored, so if the date check fails on WINDOWS32
+ systems, see if this "off-by-one" error is the problem.
+
+ * General: If your TZ environment variable is not set correctly
+ then all your timestamps will be off by hours. So, set it!
+
Mon Apr 7 02:06:22 1997 Paul D. Smith <psmith@baynetworks.com>
* Version 3.75.1
-# GNU Make-specific makefile for GNU Make.
-
-# Copyright (C) 1990, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
+# This is a maintainer's-only makefile
#
-# GNU Make is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# It bootstraps a GNU make maintainer's directory
#
-# You should have received a copy of the GNU General Public License
-# along with GNU Make; see the file COPYING. If not, write to
-# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-.PHONY: default
-default:
+.SUFFIXES:
-# Set `ARCH' to a string for the type of machine.
-ifndef ARCH
-ifdef machine
-ARCH = $(machine)
-endif # machine
-endif # not ARCH
+.DEFAULT:
+ [ -f Makefile ] || ./configure
+ $(MAKE) -f Makefile $@
-override srcdir := .
-override CC := $(CC)
+.PHONY: __cfg __cfg_basic
-ifeq ($(ARCH),hp300)
-#customs=yes
-endif
-ifdef customs
-override REMOTE := cstms
-else
-override REMOTE := stub
-endif
+ACCONFIG = acconfig.h
-# Get most of the information from the Unix-compatible makefile.
-include compatMakefile
+__cfg: __cfg_basic config.h.in
+ cd glob && $(MAKE) -f ../GNUmakefile __cfg_basic ACCONFIG=
-MAKE = $(MAKE_COMMAND) $(MAKEOVERRIDES)
+__cfg_basic: aclocal.m4 stamp-h.in configure Makefile.in
-CVS = cvs
+aclocal.m4: configure.in
+ aclocal
-# Remove autoconf magic.
-prefix = /usr/local
-exec_prefix = $(prefix)
-extras := $(filter-out getloadavg.o @%@,$(extras)) getloadavg.o
-LOADLIBES := $(filter-out @%@,$(LOADLIBES))
-ALLOCA := $(filter-out @%@,$(ALLOCA))
-CPPFLAGS := $(filter-out @%@,$(defines) $(CPPFLAGS)) -DHAVE_CONFIG_H
+config.h.in: stamp-h.in
+stamp-h.in: configure.in aclocal.m4 $(ACCONFIG)
+ autoheader
+ echo timestamp > $@
-ifdef AC_MACRODIR
-configure config.h.in: $(patsubst %,$(AC_MACRODIR)/%.m4,acspecific acgeneral)
-config.h.in: $(AC_MACRODIR)/acconfig.h
-endif
configure: configure.in aclocal.m4
- autoconf $(ACFLAGS)
- -test -d CVS && $(CVS) commit -m'autoconf $(ACFLAGS)' $@
-config.h.in: configure.in aclocal.m4
- autoheader $(ACFLAGS)
- -test -d CVS && $(CVS) commit -m'autoheader $(ACFLAGS)' $@
-
-ifdef customs
-defines := $(defines) -Ipmake/customs -Ipmake/lib/include
-LOADLIBES := $(addprefix pmake/customs/,customslib.o rpc.o xlog.o) \
- pmake/lib/sprite/libsprite.a
-endif
-
-ifdef ARCH
-
-ifndef no_libc
-libc_dir = /home/gd2/gnu/libc/$(ARCH)
-ifneq ($(wildcard $(libc_dir)),)
-ifneq ($(wildcard $(libc_dir)/works-for-make),)
-#CPPFLAGS := -I$(libc_dir)/include
-#LDFLAGS := -nostdlib $(libc_dir)/lib/start.o
-#LOADLIBES := $(LOADLIBES) \
-# $(libc_dir)/lib/mcheck-init.o \
-# $(libc_dir)/lib/libc.a \
-# -lgcc \
-# $(libc_dir)/lib/libc.a
-CC := $(CC) -b glibc
-
-# getopt is in libc.
-GETOPT =
-#GETOPT_SRC = Don't clear this or dist will break.
-
-# glob is in libc too.
-GLOB =
-
-else
-
-endif # works-for-make
-endif # $(libc_dir)
-endif # !no_libc
-
-# We know the type of machine, so put the binaries in subdirectories.
-$(ARCH)/%.o: %.c
- $(COMPILE.c) -Iglob $< $(OUTPUT_OPTION)
-$(ARCH)/glob/libglob.a: FORCE
- $(MAKE) -C $(@D) $(@F)
-FORCE:
-objs := $(addprefix $(ARCH)/,$(objs))
-prog := $(ARCH)/make
-
-archpfx = $(ARCH)/
-
-$(archpfx)load.o: load.c
- $(COMPILE.c) $(LOAD_AVG) $< -o $@
-$(archpfx)load.dep: load.c
- $(mkdep) $(LOAD_AVG) $< | sed 's,$*\.o,& $@,' > $@
-
-CPPFLAGS := -I$(ARCH) -Iglob -DHAVE_CONFIG_H $(filter-out @%@,$(CPPFLAGS))
-
-ifneq "$(wildcard $(ARCH)/makefile)" ""
-include $(ARCH)/makefile
-endif
-objs := $(objs) $(addprefix $(ARCH)/,$(ALLOCA) $(extras))
-
-else # Not ARCH
-prog := make
-endif
-
-ifneq "$(findstring gcc,$(CC))" ""
-CFLAGS = -g -Wall -Wtraditional -Wid-clash-31 -Wpointer-arith \
- -Wbad-function-cast -Wconversion
-else
-CFLAGS = -g
-endif
-LDFLAGS = -g
-
-# Define the command to make dependencies.
-mkdep-nolib = $(CC) -MM $(CPPFLAGS)
-mkdep = $(CC) -M $(CPPFLAGS)
-
-depfiles = $(patsubst %.o,%.dep,$(filter %.o,$(objs)))
-
-
-.PHONY: default
-default: $(prog)
-
-$(prog): $(objs) $(globdep) #$(addprefix $(ARCH)/,gmalloc.o mcheck.o)
- $(CC) $(LDFLAGS) $^ $(globlib) $(LOADLIBES) -o $@.new
- mv -f $@.new $@
-
-libc-srcdir = ../libc
-globfiles = $(addprefix glob/,COPYING.LIB configure.in configure Makefile.in \
- Makefile.ami SCOPTIONS SMakefile \
- configure.bat glob.c fnmatch.c glob.h fnmatch.h)
-$(globfiles): stamp-glob ;
-stamp-glob: $(libc-srcdir)/posix/glob.tar
- -rm -f stamp-glob glob/*
- tar xvf $< glob
- $(CVS) commit -m'Updated from libc' glob
- touch $@
-$(libc-srcdir)/posix/glob.tar: force
- $(MAKE) -C $(@D) $(@F) no_deps=t
-.PHONY: force
-force:
-
-# Make the Unix-compatible Makefile to be distributed by appending
-# the automatically-generated dependencies to compatMakefile.
-ifeq ($(mkdep),$(mkdep-nolib))
-nolib-deps = $(depfiles)
-else
-%.dep: %.c
- $(mkdep-nolib) $< | sed -e 's,$*\.o,$(@:.dep=.o) $@,' > $(@:.dep=.dtm)
- mv -f $(@:.dep=.dtm) $@
-nolib-deps = $(patsubst $(archpfx)%,%,$(depfiles))
-endif
-# The distributed Makefile.in should contain deps for remote-stub only.
-Makefile.in: compatMakefile $(nolib-deps:remote-%.dep=remote-stub.dep)
- (sed 's/^MAKE[ ]*=.*$$/@SET_MAKE@/' $<; \
- echo '# Automatically generated dependencies.'; \
- sed -e 's/ [^ ]*\.dep//' -e 's=$(archpfx)==' $(filter-out $<,$^) \
- ) > $@
- $(CVS) commit -mRegenerated $@
-
-.SUFFIXES: .dep
-# Maintain the automatically-generated dependencies.
-ifndef no_deps
--include $(depfiles)
-endif
-$(archpfx)%.dep: %.c
- $(mkdep) $< | sed 's,$*\.o,$(@:.dep=.o) $@,' > $@
-
-ETAGS = etags -T # for v19 etags
-
-# Run the tests.
-.PHONY: tests
-testdir := $(shell ls -d1 make-test-?.? | sort -n +0.10 -0.11 +0.12 | tail -1l)
-tests:# $(testdir)/run_make_tests.pl $(prog)
-# cd $(<D); MAKELEVEL=0 perl $(<F)
-
-build.sh.in: build.template compatMakefile
- sed -e 's@%objs%@$(filter-out remote-% $(GLOB) $(ALLOCA) $(extras),\
- $(patsubst $(archpfx)%,%,$(objs)))\
- $(patsubst %.c,%.o,$(filter %.c,$(globfiles)))@' \
- $< > $@.new
- chmod a+x $@.new
- mv -f $@.new $@
- $(CVS) commit -mRegenerated $@
-\f
-# Make the distribution tar files.
-
-.PHONY: dist
-# Figure out the version number from the source of `version.c'.
-version := \
- $(strip $(shell sed -e '/=/!d' -e 's/^.*"\(.*\)";$$/\1/' < version.c))
-tarfiles := make # make-doc
-tarfiles := $(addsuffix -$(version).tar,$(tarfiles))
-tarfiles := $(tarfiles:%=%.gz) # no more compress $(tarfiles:%=%.Z)
-# Depend on default and doc so we don't ship anything that won't compile.
-dist: cvs-mark default info dvi tests tarfiles
-.PHONY: tarfiles
-tarfiles: $(tarfiles)
-
-vmsfiles = config.h-vms makefile.com makefile.vms readme.vms \
- vmsdir.h vmsfunctions.c vmsify.c
-amigafiles = README.Amiga config.ami Makefile.ami SCOPTIONS SMakefile \
- amiga.c amiga.h make.lnk
-dosfiles = README.DOS dosbuild.bat
-w32files = README.W32 build_w32.bat config.h.W32 subproc.bat NMakefile \
- $(addprefix w32/,pathstuff.c compat/dirent.c include/dirent.h \
- include/pathstuff.h include/sub_proc.h \
- include/w32err.h subproc/NMakefile \
- subproc/build.bat subproc/misc.c \
- subproc/proc.h subproc/sub_proc.c \
- subproc/w32err.c)
-distfiles=README INSTALL COPYING ChangeLog NEWS \
- configure Makefile.in configure.in build.sh.in mkinstalldirs \
- configh.dos configure.bat \
- $(amigafiles) $(vmsfiles) $(w32files) $(dosfiles) \
- aclocal.m4 acconfig.h $(srcs) remote-*.c $(globfiles) \
- make.texinfo make-stds.texi \
- $(wildcard make.?? make.??s make.toc make.aux) make.man texinfo.tex \
- TAGS tags install-sh \
- make.info make.info*
-
-ifndef dist-flavor
-dist-flavor = alpha
-endif
-.PHONY: cvs-mark
-cvs-mark: $(distfiles)
- $(CVS) tag -F make-$(subst .,-,$(version))
-
-dist: local-inst
-.PHONY: local-inst
-local-inst: $(prog)
- install -c -g kmem -o $(USER) -m 2755 $< /usr/local/gnubin/make
-
-# Put the alpha distribution files in the anonymous FTP directory.
-alpha-files = $(tarfiles) GNUmakefile compatMakefile $(testdir).tar.Z
-dist: alpha
-.PHONY: alpha
-alpha-dir := ~ftp/gnu
-alpha-files := $(addprefix $(alpha-dir)/,$(alpha-files))
-alpha: $(alpha-dir) $(alpha-files)
-$(alpha-dir)/%: %
- @rm -f $@
- cp $< $@
-
-# Implicit rule to make README and README-doc.
-%: %.template version.c
- rm -f $@
- sed 's/VERSION/$(version)/' < $< > $@
-# Make sure I don't edit it by accident.
- chmod a-w $@
- $(CVS) commit -m'Regenerated for $(version)' $@
-
-define make-tar
-@rm -fr make-$(version)
-ln -s . make-$(version)
-tar cvhof $@ $(addprefix make-$(version)/,$^)
-rm -f make-$(version)
-endef
-
-%.Z: %; compress -c $< > $@
-%.gz: %; gzip -9 -c -v $< > $@
-
-make-$(version).tar: $(distfiles)
- $(make-tar)
-
-ifneq (,)
-tests := $(filter-out %~,$(wildcard tests/*))
-make-tests-$(version).tar.Z: $(tests)
- @rm -fr make-tests-$(version)
- ln -s tests make-tests-$(version)
- tar cvhf $(@:.Z=) $(patsubst tests/%,make-tests-$(version)/%,$^)
- rm -f make-tests-$(version)
- compress -f $(@:.Z=)
-endif
+ autoconf
-$(archpfx)loadtest: $(archpfx)load.o
+Makefile.in: configure.in config.h.in Makefile.am aclocal.m4
+ automake --add-missing
--- /dev/null
+# -*-Makefile-*-, or close enough
+
+AUTOMAKE_OPTIONS = 1.2
+
+bin_PROGRAMS = make
+
+make_SOURCES = main.c commands.c job.c dir.c file.c misc.c read.c remake.c \
+ rule.c implicit.c default.c variable.c expand.c function.c \
+ vpath.c version.c ar.c arscan.c remote-$(REMOTE).c \
+ commands.h dep.h filedef.h job.h make.h rule.h variable.h \
+ signame.c signame.h \
+ getopt.c getopt1.c getopt.h
+make_LDADD = @LIBOBJS@ @ALLOCA@ glob/libglob.a
+
+info_TEXINFOS = make.texinfo
+
+INCLUDES = -I$(srcdir)/glob -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\"
+
+BUILT_SOURCES = README build.sh.in
+
+EXTRA_DIST = make.man $(BUILT_SOURCES) remote-cstms.c \
+ make-stds.texi texinfo.tex SCOPTIONS SMakefile \
+ Makefile.ami README.Amiga config.ami amiga.c amiga.h \
+ NMakefile README.DOS configh.dos configure.bat makefile.com \
+ README.W32 build_w32.bat config.h.W32 subproc.bat make.lnk \
+ config.h-vms makefile.vms readme.vms vmsdir.h vmsfunctions.c \
+ vmsify.c
+
+SUBDIRS = glob
+
+# Look for the make test suite, and run it if found. Look in MAKE_TEST, or
+# in the srcdir and its parent and the distdir and its parent.
+#
+check-local:
+ @here=`pwd`; test=""; \
+ case "$(MAKE_TEST)" in "") \
+ for d1 in $$here $(srcdir); do \
+ for d2 in .. .; do \
+ try=`ls -1 $$d1/$$d2/make-test-*/run_make_tests 2>/dev/null | tail -1`; \
+ case "$$try" in "") : ;; *) test="$$try" ;; esac; \
+ done; done ;; \
+ *) test="$(MAKE_TEST)" ;; \
+ esac; \
+ case "$$test" in \
+ "") echo "Couldn't find make-test-* test suite."; exit 1;; \
+ esac; \
+ testdir=`dirname $$test`; \
+ echo "cd $$testdir && ./run_make_tests -make_path $$here/make"; \
+ cd $$testdir && ./run_make_tests -make_path $$here/make"
+
+# Install the w32 subdirectory
+#
+dist-hook:
+ (cd $(srcdir); \
+ w32=`find w32 -follow \( -name CVS -prune \) -o -type f -print`; \
+ tar chf - $$w32) \
+ | (cd $(distdir); tar xfBp -)
+
+if MAINT_MAKEFILE
+# Note this requires GNU make. Not to worry, since it will only be included
+# in the Makefile if we're in the maintainer's environment.
+include $(srcdir)/maintMakefile
+endif
GNU make NEWS -*-indented-text-*-
History of user-visible changes.
- 06 Apr 1996
+ 18 Aug 1997
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
See the end for copying conditions.
list of words from number S to number E (inclusive) of TEXT.
* Instead of an error, detection of future modification times gives a
- warning and continues.
+ warning and continues. The warning is repeated just before GNU make
+ exits, so it is less likely to be lost.
* Fix the $(basename) and $(suffix) functions so they only operate on
the last filename, not the entire string:
$(suffix a.b) b b
$(suffix a.b/c) b/c <empty>
+* The $(strip) function now removes newlines as well as TABs and spaces.
+
* Updates to the Windows 95/NT port from Rob Tulloh (see README.W32).
* Eli Zaretskii has updated the port to 32-bit protected mode on MSDOS
When shell features like redirection or filename wildcards are
involved, Make calls the shell.
- This port supports both DOS shells (the stock COMMAND.COM and
- its 4DOS/NDOS replacements), and Unix-style shells (tested with
- the venerable Stewartson's `ms_sh' 2.3 and the recent DJGPP port
- of `bash' by Daisuke Aoyama <jack@st.rim.or.jp>).
+ This port supports both DOS shells (the stock COMMAND.COM and its
+ 4DOS/NDOS replacements), and Unix-style shells (tested with the
+ venerable Stewartson's `ms_sh' 2.3 and the DJGPP port of `bash' by
+ Daisuke Aoyama <jack@st.rim.or.jp>).
When the $SHELL variable points to a Unix-style shell, Make
works just like you'd expect on Unix, calling the shell for any
doesn't include characters illegal on MSDOS FAT filesystems,
will be automatically down-cased.) User reports that I have
indicate that this default behavior is generally what you'd
- expect; however, since this is the first DJGPP port of Make that
- supports long filenames, your input is most welcome.
+ expect; however, since support for long filenames in the DJGPP
+ port of GNU Make is relatively new, your input is most welcome.
In any case, if you hit a situation where you must force Make to
get the 8+3 DOS filenames in upper case, set FNCASE=y in the
make implicit assumptions about the pathname syntax. In
particular, the directories are assumed to be separated by `/',
and any pathname which doesn't begin with a `/' is assumed to be
- releative to the current directory. This port attempts to
+ relative to the current directory. This port attempts to
support DOS-style pathnames which might include the drive letter
and use backslashes instead of forward slashes. However, this
support is not complete; I feel that pursuing this support too
-This directory contains the VERSION test release of GNU Make.
+This directory contains the %VERSION% test release of GNU Make.
All bugs reported for previous test releases have been fixed.
Some bugs surely remain.
See README.W32 for details about GNU Make on Windows NT or 95.
See README.Amiga for details about GNU Make on AmigaDOS.
-The MSDOS port of GNU Make is available as part of DJGPP; see the
-WWW page http://www.delorie.com/djgpp/ for more information.
+A precompiled binary of the MSDOS port of GNU Make is available as part
+of DJGPP; see the WWW page http://www.delorie.com/djgpp/ for more
+information.
It has been reported that the XLC 1.2 compiler on AIX 3.2 is buggy such
that if you compile make with `cc -O' on AIX 3.2, it will not work correctly.
+/* Name of this package (needed by automake) */
+#undef PACKAGE
+
+/* Version of this package (needed by automake) */
+#undef VERSION
+
/* Define to the name of the SCCS `get' command. */
#undef SCCS_GET
# Copyright (C) 1993, 1994 Free Software Foundation, Inc.
# This file is part of GNU Make.
-#
+#
# GNU Make is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with GNU Make; see the file COPYING. If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
dnl Process this file with autoconf to produce a configure script.
AC_REVISION([$Id$])
-AC_PREREQ(2.10)dnl dnl Minimum Autoconf version required.
+AC_PREREQ(2.12)dnl dnl Minimum Autoconf version required.
AC_INIT(vpath.c)dnl dnl A distinctive file to look for in srcdir.
-AC_CONFIG_HEADER(config.h)
-AC_CONFIG_SUBDIRS(glob) dnl Run configure in glob subdirectory.
+
+AM_INIT_AUTOMAKE(make, 3.75.91)
+AM_CONFIG_HEADER(config.h)
+AC_CONFIG_SUBDIRS(glob)
+
+AM_CONDITIONAL(MAINT_MAKEFILE, test -r $srcdir/maintMakefile)
+
+dnl Regular configure stuff
AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_CPP dnl Later checks need this.
+AC_ARG_PROGRAM
AC_AIX
AC_ISC_POSIX
AC_MINIX
file_hash_enter (file, name, oldhash, file->name);
}
+/* Rename FILE to NAME. This is not as simple as resetting
+ the `name' member, since it must be put in a new hash bucket,
+ and possibly merged with an existing file called NAME. */
+
+void
+rename_file (file, name)
+ register struct file *file;
+ char *name;
+{
+ rehash_file(file, name);
+ while (file)
+ {
+ file->name = file->hname;
+ file = file->prev;
+ }
+}
+
void
file_hash_enter (file, name, oldhash, oldname)
register struct file *file;
extern struct file *lookup_file (), *enter_file ();
extern void remove_intermediates (), snap_deps ();
-extern void rehash_file (), file_hash_enter ();
+extern void rename_file (), rehash_file (), file_hash_enter ();
extern void set_command_state ();
text = expand_argument (text, end);
p2 = text;
- while ((p = find_next_token (&p2, &i)) != 0)
+ while (*p2 != '\0')
{
+ while (isspace(*p2))
+ ++p2;
+ p = p2;
+ for (i=0; *p2 != '\0' && !isspace(*p2); ++p2, ++i)
+ {}
+ if (!i)
+ break;
o = variable_buffer_output (o, p, i);
o = variable_buffer_output (o, " ", 1);
doneany = 1;
+Tue Aug 12 10:52:34 1997 Paul D. Smith <psmith@baynetworks.com>
+
+ * configure.in: Require autoconf 2.12.
+
+ * glob: Updates from latest GNU libc glob code.
+
+ * glob.c,glob.h,fnmatch.h: Change all WIN32 references to WINDOWS32.
+
+ * glob.h: OSF4 defines macros in such a way that GLOB_ALTDIRFUNC
+ is not defined. Added a test to the #if which defines it if
+ _GNU_SOURCE is defined; that's set by both glob.c and GNU make.
+
+ * glob.c: SunOS4 w/ cc needs #include <stdio.h>, since assert.h
+ requires stderr but doesn't include stdio.h :-/.
+ (next_brace_sub): De-protoize function definition.
+ (glob): Cast __alloca(); on SunOS4 it uses the default return type
+ of int.
+ (glob): Irix defines getlogin_r() to return a char*; move the
+ extern for that into the _LIBC area since it isn't used except in
+ LIBC anyway. Likewise, move extern getlogin() into the "else".
+
Sat Jul 20 21:55:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Win32 hacks from <Rob_Tulloh@tivoli.com>.
--- /dev/null
+# -*-Makefile-*-, or close enough
+
+AUTOMAKE_OPTIONS = 1.2 foreign
+
+noinst_LIBRARIES = libglob.a
+
+libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h
+
+EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \
+ configure.bat
dnl Process this file with autoconf to produce a configure script.
AC_INIT(fnmatch.c) dnl A distinctive file to look for in srcdir.
-AC_PREREQ(2.1) dnl Minimum Autoconf version required.
+AC_PREREQ(2.12) dnl Minimum Autoconf version required.
+
+AM_INIT_AUTOMAKE(glob, 0.0, nodefs)
+
AC_PROG_CC
AC_CHECK_PROG(AR, ar, ar, ar)
AC_PROG_RANLIB
-/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
Boston, MA 02111-1307, USA. */
#ifndef _FNMATCH_H
-
#define _FNMATCH_H 1
#ifdef __cplusplus
/* #define NDEBUG 1 */
#include <assert.h>
+#include <stdio.h> /* Needed on stupid SunOS for assert. */
+
/* Comment out all this code if we are using the GNU C Library, and are not
actually compiling the library itself. This code is part of the GNU C
#undef GLOB_PERIOD
#include <glob.h>
\f
-static int glob_pattern_p __P ((const char *pattern, int quote));
static int glob_in_dir __P ((const char *pattern, const char *directory,
int flags,
int (*errfunc) __P ((const char *, int)),
inline
#endif
const char *
-next_brace_sub (const char *begin)
+next_brace_sub (begin)
+ const char *begin;
{
unsigned int depth = 0;
const char *cp = begin;
while (*cp != '\0' && (*cp != '}' || depth > 0))
{
if (*cp == '}')
- ++depth;
+ --depth;
++cp;
}
if (*cp == '\0')
If a directory cannot be opened or read and ERRFUNC is not nil,
it is called with the pathname that caused the error, and the
`errno' value from the failing call; if it returns non-zero
- `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+ `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
Otherwise, `glob' returns zero. */
int
#else
if (home_dir == NULL || home_dir[0] == '\0')
{
- extern char *getlogin __P ((void));
- extern int getlogin_r __P ((char *, size_t));
int success;
-
#if defined HAVE_GETLOGIN_R || defined _LIBC
+ extern int getlogin_r __P ((char *, size_t));
size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
char *name;
/* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
a moderate value. */
buflen = 16;
- name = __alloca (buflen);
+ name = (char *) __alloca (buflen);
success = getlogin_r (name, buflen) >= 0;
#else
+ extern char *getlogin __P ((void));
char *name;
+
success = (name = getlogin ()) != NULL;
#endif
if (success)
char *pwtmpbuf;
struct passwd pwbuf, *p;
- pwtmpbuf = __alloca (pwbuflen);
+ pwtmpbuf = (char *) __alloca (pwbuflen);
success = (__getpwnam_r (name, &pwbuf, pwtmpbuf,
pwbuflen, &p) >= 0);
{
char *newp;
size_t home_len = strlen (home_dir);
- newp = __alloca (home_len + dirlen);
+ newp = (char *) __alloca (home_len + dirlen);
memcpy (newp, home_dir, home_len);
memcpy (&newp[home_len], &dirname[1], dirlen);
dirname = newp;
user_name = dirname + 1;
else
{
- user_name = __alloca (end_name - dirname);
+ user_name = (char *) __alloca (end_name - dirname);
memcpy (user_name, dirname + 1, end_name - dirname);
user_name[end_name - dirname - 1] = '\0';
}
{
#if defined HAVE_GETPWNAM_R || defined _LIBC
size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
- char *pwtmpbuf = __alloca (buflen);
+ char *pwtmpbuf = (char *) __alloca (buflen);
struct passwd pwbuf, *p;
if (__getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) >= 0)
home_dir = p->pw_dir;
char *newp;
size_t home_len = strlen (home_dir);
size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
- newp = __alloca (home_len + rest_len + 1);
+ newp = (char *) __alloca (home_len + rest_len + 1);
memcpy (newp, home_dir, home_len);
memcpy (&newp[home_len], end_name, rest_len);
newp[home_len + rest_len] = '\0';
dirname = newp;
}
}
-#endif /* Not Amiga && not Windows32. */
+#endif /* Not Amiga && not WINDOWS32. */
}
#endif /* Not VMS. */
- if (glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
+ if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
{
/* The directory name contains metacharacters, so we
have to glob for the directory, and then glob for
{
globfree (&dirs);
globfree (&files);
- return GLOB_ABEND;
+ return GLOB_ABORTED;
}
}
#endif /* SHELL. */
/* Return nonzero if PATTERN contains any metacharacters.
Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
-static int
-glob_pattern_p (pattern, quote)
+int
+__glob_pattern_p (pattern, quote)
const char *pattern;
int quote;
{
return 0;
}
+#ifdef _LIBC
+weak_alias (__glob_pattern_p, glob_pattern_p)
+#endif
/* Like `glob', but PATTERN is a final pathname component,
struct globlink *names = NULL;
size_t nfound = 0;
- if (!glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
+ if (!__glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
{
stream = NULL;
flags |= GLOB_NOCHECK;
{
if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
(flags & GLOB_ERR))
- return GLOB_ABEND;
+ return GLOB_ABORTED;
}
else
while (1)
}
if (nfound == 0 && (flags & GLOB_NOMAGIC) &&
- ! glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
+ ! __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE)))
flags |= GLOB_NOCHECK;
if (nfound == 0 && (flags & GLOB_NOCHECK))
-/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in /gd/gnu/lib.
Boston, MA 02111-1307, USA. */
#ifndef _GLOB_H
-
#define _GLOB_H 1
#ifdef __cplusplus
GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \
GLOB_NOMAGIC|GLOB_TILDE)
-#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE)
+#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE) || defined (_GNU_SOURCE)
#define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */
#define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */
#define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */
/* Error returns from `glob'. */
#define GLOB_NOSPACE 1 /* Ran out of memory. */
-#define GLOB_ABEND 2 /* Read error. */
+#define GLOB_ABORTED 2 /* Read error. */
#define GLOB_NOMATCH 3 /* No matches found. */
+#ifdef _GNU_SOURCE
+/* Previous versions of this file defined GLOB_ABEND instead of
+ GLOB_ABORTED. Provide a compatibility definition here. */
+# define GLOB_ABEND GLOB_ABORTED
+#endif
+
/* Structure describing a globbing run. */
#if !defined (_AMIGA) && !defined (VMS) /* Buggy compiler. */
struct stat;
extern void globfree __P ((glob_t *__pglob));
+#ifdef _GNU_SOURCE
+/* Return nonzero if PATTERN contains any metacharacters.
+ Metacharacters can be quoted with backslashes if QUOTE is nonzero.
+
+ This function is not part of the interface specified by POSIX.2
+ but several programs want to use it. */
+extern int __glob_pattern_p __P ((__const char *__pattern, int __quote));
+extern int glob_pattern_p __P ((__const char *__pattern, int __quote));
+#endif
+
#ifdef __cplusplus
}
#endif
message (0, (just_print_flag || (!(flags & COMMANDS_SILENT) && !silent_flag))
? "%s" : (char *) 0, p);
+ /* Optimize an empty command. People use this for timestamp rules,
+ and forking a useless shell all the time leads to inefficiency. */
+
+ if ((argv[0] && !strcmp(argv[0], "/bin/sh"))
+ && (argv[1] && !strcmp(argv[1], "-c"))
+ && (argv[2] && !strcmp(argv[2], ":"))
+ && argv[3] == NULL)
+ {
+ set_command_state (child->file, cs_running);
+ goto next_command;
+ }
+
/* Tell update_goal_chain that a command has been started on behalf of
this target. It is important that this happens here and not in
reap_children (where we used to do it), because reap_children might be
This turns on pedantic compliance with POSIX.2. */
int posix_pedantic;
+
+/* Nonzero if some rule detected clock skew; we keep track so (a) we only
+ print one warning about it during the run, and (b) we can print a final
+ warning at the end of the run. */
+
+int clock_skew_detected;
\f
/* Mask of signals that are being caught with fatal_error_signal. */
fatal ("No targets");
}
+ /* If we detected some clock skew, generate one last warning */
+ if (clock_skew_detected)
+ error("*** Warning: Clock skew detected. Your build may be incomplete.");
+
/* Exit. */
die (status);
}
--- /dev/null
+# Maintainer-only makefile segment. This contains things that are relevant
+# only if you have the full copy of the GNU make sources, not a dist copy.
+#
+
+# Find the glob source files... this might be dangerous, but we're maintainers!
+#
+globsrc := $(wildcard glob/*.c)
+
+# General rule for turning a .template into a regular file.
+#
+README : % : %.template configure.in
+ rm -f $@
+ sed 's/%VERSION%/$(version)/' < $< > $@
+ chmod a-w $@
+
+# Construct build.sh.in
+#
+build.sh.in: build.template Makefile.am
+ rm -f $@
+ sed -e 's@%objs%@$(filter-out remote-%, $(make_OBJECTS)\
+ $(patsubst %.c,%.o,$(globsrc)))@' \
+ $< > $@
+ chmod a-w+x $@
+
+# Put the alpha distribution files up for anonymous FTP.
+#
+ALPHA := ~ftp/gnu
+TARFILE := $(distdir).tar.gz
+
+.PHONY: alpha
+alpha: $(ALPHA) $(TARFILE)
+ @rm -f $(ALPHA)/$(TARFILE)
+ cp -p $(TARFILE) $(ALPHA)
makefile ] [ option ] ...
target ...
.SH WARNING
-This man paage is an extract of the documentation of
+This man page is an extract of the documentation of
.I GNU make .
It is updated only occasionally, because the GNU project does not use nroff.
For complete, current documentation, refer to the Info file
.B \-b
.TP 0.5i
.B \-m
-These options are ignored for compatibility with other versions of
+These options are ignored for compatibility with other versions of
.IR make .
.TP 0.5i
.BI "\-C " dir
.B \-I
options are used to specify several directories, the directories are
searched in the order specified.
-Unlike the arguments to other flags of
+Unlike the arguments to other flags of
.IR make ,
directories given with
.B \-I
Cancel the effect of the
.B \-k
option.
-This is never necessary except in a recursive
+This is never necessary except in a recursive
.I make
where
.B \-k
-might be inherited from the top-level
+might be inherited from the top-level
.I make
via MAKEFLAGS or if you set
.B \-k
.IR make .
.TP 0.5i
.B \-v
-Print the version of the
+Print the version of the
.I make
program plus a copyright, a list of authors and a notice that there
is no warranty.
.I touch
command on the given file before running
.IR make ,
-except that the modification time is changed only in the imagination of
+except that the modification time is changed only in the imagination of
.IR make .
.SH "SEE ALSO"
.PD 0
#endif
/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
- because such systems often declare the in header files anyway. */
+ because such systems often declare them in header files anyway. */
#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
extern int env_overrides, no_builtin_rules_flag, print_version_flag;
extern int print_directory_flag, warn_undefined_variables_flag;
extern int posix_pedantic;
+extern int clock_skew_detected;
extern unsigned int job_slots;
#ifndef NO_FLOAT
This is Edition @value{EDITION}, last updated @value{UPDATED},
of @cite{The GNU Make Manual}, for @code{make}, Version @value{VERSION}.
-Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95, '96
+Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95, '96, '97
Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
* Syntax of Functions:: How to write a function call.
* Text Functions:: General-purpose text manipulation functions.
-* Filename Functions:: Functions for manipulating file names.
+* File Name Functions:: Functions for manipulating file names.
* Foreach Function:: Repeat some text with controlled variation.
* Origin Function:: Find where a variable got its value.
* Shell Function:: Substitute the output of a shell command.
@cindex @code{-I}
@cindex @code{--include-dir}
+@cindex included makefiles, default directries
+@cindex default directries for included makefiles
@findex /usr/gnu/include
@findex /usr/local/include
@findex /usr/include
(@pxref{Options Summary, ,Summary of Options}).
Then the following directories (if they exist)
are searched, in this order:
-@file{@var{prefix}/include} (normally @file{/usr/local/include})
+@file{@var{prefix}/include} (normally @file{/usr/local/include}
+@footnote{GNU Make compiled for MS-DOS and MS-Windows behaves as if
+@var{prefix} has been defined to be the root of the DJGPP tree
+hierarchy.})
@file{/usr/gnu/include},
@file{/usr/local/include}, @file{/usr/include}.
directory. For example @file{~/bin} expands to @file{/home/you/bin}.
If the @samp{~} is followed by a word, the string represents the home
directory of the user named by that word. For example @file{~john/bin}
-expands to @file{/home/john/bin}.@refill
+expands to @file{/home/john/bin}. On systems which don't have a home
+directory for each user (such as MS-DOS or MS-Windows), this
+functionality can be simulated by setting the environment variable
+@var{HOME}.@refill
Wildcard expansion happens automatically in targets, in dependencies,
and in commands (where the shell does the expansion). In other
These are described in the following section.
@end iftex
+@cindex wildcards and MS-DOS/MS-Windows backslashes
+@cindex backslashes in pathnames and wildcard expansion
+
+Microsoft operating systems (MS-DOS and MS-Windows) use backslashes to
+separate directories in pathnames, like so:
+
+@example
+ c:\foo\bar\baz.c
+@end example
+
+This is equivalent to the Unix-style @file{c:/foo/bar/baz.c} (the
+@file{c:} part is the so-called drive letter). When @code{make} runs on
+these systems, it supports backslashes as well as the Unix-style forward
+slashes in pathnames. However, this support does @emph{not} include the
+wildcard expansion, where backslash is a quote character. Therefore,
+you @emph{must} use Unix-style slashes in these cases.
+
+
@node Wildcard Function, , Wildcard Pitfall, Wildcards
@subsection The Function @code{wildcard}
@findex wildcard
in the current directory, @code{make} searches the directories listed in
@code{VPATH} for a file with that name. If a file is found in one of
them, that file may become the dependency (see below). Rules may then
-specify the names of source files in the dependencies as if they all
+specify the names of files in the dependency list as if they all
existed in the current directory. @xref{Commands/Search, ,Writing Shell
Commands with Directory Search}.
In the @code{VPATH} variable, directory names are separated by colons or
blanks. The order in which directories are listed is the order followed
-by @code{make} in its search.
+by @code{make} in its search. (On MS-DOS and MS-Windows, semi-colons
+are used as separators of directory names in @code{VPATH}, since the
+colon can be used in the pathname itself, after the drive letter.)
For example,
@subsection The @code{vpath} Directive
@findex vpath
-Similar to the @code{VPATH} variable but more selective is the @code{vpath}
-directive (note lower case), which allows you to specify a search path for a particular class
-of file names, those that match a particular pattern. Thus you can supply
-certain search directories for one class of file names and other directories
-(or none) for other file names.
+Similar to the @code{VPATH} variable, but more selective, is the
+@code{vpath} directive (note lower case), which allows you to specify a
+search path for a particular class of file names: those that match a
+particular pattern. Thus you can supply certain search directories for
+one class of file names and other directories (or none) for other file
+names.
There are three forms of the @code{vpath} directive:
@var{pattern}.
The search path, @var{directories}, is a list of directories to be
-searched, separated by colons or blanks, just like the search path used
-in the @code{VPATH} variable.
+searched, separated by colons (semi-colons on MS-DOS and MS-Windows) or
+blanks, just like the search path used in the @code{VPATH} variable.
@item vpath @var{pattern}
Clear out the search path associated with @var{pattern}.
When a dependency is found through directory search, regardless of type
(general or selective), the pathname located may not be the one that
-@code{make} actually provides you in the dependency list. Sometimes,
+@code{make} actually provides you in the dependency list. Sometimes
the path discovered through directory search is thrown away.
The algorithm @code{make} uses to decide whether to keep or abandon a
directory search is performed.
@item
-If the directory search is successful that path is kept, and this file
+If the directory search is successful, that path is kept and this file
is tentatively stored as the target.
@item
@item
If the target does @emph{not} need to be rebuilt, the path to the file
found during directory search is used for any dependency lists which
-contain this target.
+contain this target. In short, if @code{make} doesn't need to rebuild
+the target then you use the path found via directory search.
@item
If the target @emph{does} need to be rebuilt (is out-of-date), the
pathname found during directory search is @emph{thrown away}, and the
-target is rebuilt using the filename specified in the makefile.
+target is rebuilt using the file name specified in the makefile. In
+short, if @code{make} must rebuild, then the target is rebuilt locally,
+not in the directory found via directory search.
@end enumerate
@end enumerate
-This may seem overly complex, but in fact it is almost always exactly
-what you want.
+This algorithm may seem complex, but in practice it is quite often
+exactly what you want.
@cindex traditional directory search
@cindex directory search, traditional
the current directory, in directories specified by matching @code{vpath}
search paths and the @code{VPATH} search path, and then in the
directories @file{/lib}, @file{/usr/lib}, and @file{@var{prefix}/lib}
-(normally @file{/usr/local/lib}).
+(normally @file{/usr/local/lib}, but MS-DOS/MS-Windows versions of
+@code{make} behave as if @var{prefix} is defined to be the root of the
+DJGPP installation tree).
For example,
take shortcuts that do not affect the results.)
@cindex @code{cd} (shell command)
-@strong{Please note:} this implies that shell commands such as
-@code{cd} that set variables local to each process will not affect the
-following command lines. If you want to use @code{cd} to affect the
-next command, put the two on a single line with a semicolon between
-them. Then @code{make} will consider them a single command and pass
-them, together, to a shell which will execute them in sequence. For
-example:
+@strong{Please note:} this implies that shell commands such as @code{cd}
+that set variables local to each process will not affect the following
+command lines. @footnote{On MS-DOS, the value of current working
+directory is @strong{global}, so changing it @emph{will} affect the
+following command lines on those systems.} If you want to use @code{cd}
+to affect the next command, put the two on a single line with a
+semicolon between them. Then @code{make} will consider them a single
+command and pass them, together, to a shell which will execute them in
+sequence. For example:
@example
foo : bar/lose
The program used as the shell is taken from the variable @code{SHELL}.
By default, the program @file{/bin/sh} is used.
+@vindex COMSPEC
+On MS-DOS, if @code{SHELL} is not set, the value of the variable
+@code{COMSPEC} (which is always set) is used instead.
+
+@cindex @code{SHELL}, MS-DOS specifics
+The processing of lines that set the variable @code{SHELL} in Makefiles
+is different on MS-DOS. The stock shell, @file{command.com}, is
+ridiculously limited in its functionality and many users of @code{make}
+tend to install a replacement shell. Therefore, on MS-DOS, @code{make}
+examines the value of @code{SHELL}, and changes its behavior based on
+whether it points to a Unix-style or DOS-style shell. This allows
+reasonable functionality even if @code{SHELL} points to
+@file{command.com}.
+
+If @code{SHELL} points to a Unix-style shell, @code{make} on MS-DOS
+additionally checks whether that shell can indeed be found; if not, it
+ignores the line that sets @code{SHELL}. In MS-DOS, GNU @code{make}
+searches for the shell in the following places:
+
+@enumerate
+@item
+In the precise place pointed to by the value of @code{SHELL}. For
+example, if the makefile specifies @samp{SHELL = /bin/sh}, @code{make}
+will look in the directory @file{/bin} on the current drive.
+
+@item
+In the current directory.
+
+@item
+In each of the directories in the @code{PATH} variable, in order.
+
+@end enumerate
+
+In every directory it examines, @code{make} will first look for the
+specific file (@file{sh} in the example above). If this is not found,
+it will also look in that directory for that file with one of the known
+extensions which identify executable files. For example @file{.exe},
+@file{.com}, @file{.bat}, @file{.btm}, @file{.sh}, and some others.
+
+If any of these attempts is successful, the value of @code{SHELL} will
+be set to the full pathname of the shell as found. However, if none of
+these is found, the value of @code{SHELL} will not be changed, and thus
+the line that sets it will be effectively ignored. This is so
+@code{make} will only support features specific to a Unix-style shell if
+such a shell is actually installed on the system where @code{make} runs.
+
+Note that this extended search for the shell is limited to the cases
+where @code{SHELL} is set from the Makefile; if it is set in the
+environment or command line, you are expected to set it to the full
+pathname of the shell, exactly as things are on Unix.
+
+The effect of the above DOS-specific processing is that a Makefile that
+says @samp{SHELL = /bin/sh} (as many Unix makefiles do), will work
+on MS-DOS unaltered if you have e.g. @file{sh.exe} installed in some
+directory along your @code{PATH}.
+
@cindex environment, @code{SHELL} in
Unlike most variables, the variable @code{SHELL} is never set from the
environment. This is because the @code{SHELL} environment variable is
used to specify your personal choice of shell program for interactive
-use. It would be very bad for personal choices like this to affect
-the functioning of makefiles. @xref{Environment, ,Variables from the
-Environment}.
+use. It would be very bad for personal choices like this to affect the
+functioning of makefiles. @xref{Environment, ,Variables from the
+Environment}. However, on MS-DOS and MS-Windows the value of
+@code{SHELL} in the environment @strong{is} used, since on those systems
+most users do not set this variable, and therefore it is most likely set
+specifically to be used by @code{make}. On MS-DOS, if the setting of
+@code{SHELL} is not suitable for @code{make}, you can set the variable
+@code{MAKESHELL} to the shell that @code{make} should use; this will
+override the value of @code{SHELL}.
@node Parallel, Errors, Execution, Commands
@section Parallel Execution
@samp{--jobs} option tells @code{make} to execute many commands
simultaneously.@refill
+On MS-DOS, the @samp{-j} option has no effect, since that system doesn't
+support multi-processing.
+
If the @samp{-j} option is followed by an integer, this is the number of
commands to execute at once; this is called the number of @dfn{job slots}.
If there is nothing looking like an integer after the @samp{-j} option,
@example
subsystem:
- cd subdir; $(MAKE)
+ cd subdir && $(MAKE)
@end example
@noindent
@example
@group
subsystem:
- cd subdir; $(MAKE)
+ cd subdir && $(MAKE)
@end group
@end example
The value of this variable is the file name with which @code{make} was
invoked. If this file name was @file{/bin/make}, then the command executed
-is @samp{cd subdir; /bin/make}. If you use a special version of
+is @samp{cd subdir && /bin/make}. If you use a special version of
@code{make} to run the top-level makefile, the same special version will be
executed for recursive invocations.
@cindex @code{cd} (shell command)
any commands; see @ref{Instead of Execution}.) Following the usual
definition of @samp{-t}, a @samp{make -t} command in the example would
create a file named @file{subsystem} and do nothing else. What you
-really want it to do is run @samp{@w{cd subdir;} @w{make -t}}; but that would
+really want it to do is run @samp{@w{cd subdir &&} @w{make -t}}; but that would
require executing the command, and @samp{-t} says not to execute
commands.@refill
@cindex @code{-t}, and recursion
@example
subsystem:
- cd subdir; $(MAKE) MAKEFLAGS=
+ cd subdir && $(MAKE) MAKEFLAGS=
@end example
@vindex MAKEOVERRIDES
@example
subsystem:
- cd subdir; $(MAKE) $(MFLAGS)
+ cd subdir && $(MAKE) $(MFLAGS)
@end example
@noindent
which is normally present in the environment to specify the user's choice
of interactive shell. It would be very undesirable for this choice to
affect @code{make}. So @code{make} ignores the environment value of
-@code{SHELL}.@refill
+@code{SHELL} (except on MS-DOS and MS-Windows, where @code{SHELL} is
+usually not set. @xref{Execution, ,Special handling of SHELL on
+MS-DOS}.)@refill
@node Conditionals, Functions, Using Variables, Top
@chapter Conditional Parts of Makefiles
@menu
* Syntax of Functions:: How to write a function call.
* Text Functions:: General-purpose text manipulation functions.
-* Filename Functions:: Functions for manipulating file names.
+* File Name Functions:: Functions for manipulating file names.
* Foreach Function:: Repeat some text with controlled variation.
* Origin Function:: Find where a variable got its value.
* Shell Function:: Substitute the output of a shell command.
Here the @code{subst} function replaces each space with a comma, through
the value of @code{foo}, and substitutes the result.
-@node Text Functions, Filename Functions, Syntax of Functions, Functions
+@node Text Functions, File Name Functions, Syntax of Functions, Functions
@section Functions for String Substitution and Analysis
@cindex functions, for text
@code{CFLAGS} was specified with a command argument (@pxref{Override
Directive, , The @code{override} Directive}).
-@node Filename Functions, Foreach Function, Text Functions, Functions
+@node File Name Functions, Foreach Function, Text Functions, Functions
@section Functions for File Names
@cindex functions, for file names
@cindex file name functions
For example,
@example
-$(suffix src/foo.c hacks)
+$(suffix src/foo.c src-1.0/bar.c hacks)
@end example
@noindent
-produces the result @samp{.c}.
+produces the result @samp{.c .c}.
@item $(basename @var{names}@dots{})
@findex basename
@cindex file name, basename of
Extracts all but the suffix of each file name in @var{names}. If the
file name contains a period, the basename is everything starting up to
-(and not including) the last period. Otherwise, the basename is the
-entire file name. For example,
+(and not including) the last period. Periods in the directory part are
+ignored. If there is no period, the basename is the entire file name.
+For example,
@example
-$(basename src/foo.c hacks)
+$(basename src/foo.c src-1.0/bar hacks)
@end example
@noindent
-produces the result @samp{src/foo hacks}.
+produces the result @samp{src/foo src-1.0/bar hacks}.
@c plural convention with dots (be consistent)
@item $(addsuffix @var{suffix},@var{names}@dots{})
@xref{Wildcards, ,Using Wildcard Characters in File Names}.
@end table
-@node Foreach Function, Origin Function, Filename Functions, Functions
+@node Foreach Function, Origin Function, File Name Functions, Functions
@section The @code{foreach} Function
@findex foreach
@cindex words, iterating over
there is more than one @samp{-j} option, the last one is effective.
@xref{Parallel, ,Parallel Execution},
for more information on how commands are run.
+Note that this option is ignored on MS-DOS.
@item -k
@cindex @code{-k}
within the directory. The variant variables' names are formed by
appending @samp{D} or @samp{F}, respectively. These variants are
semi-obsolete in GNU @code{make} since the functions @code{dir} and
-@code{notdir} can be used to get a similar effect (@pxref{Filename
+@code{notdir} can be used to get a similar effect (@pxref{File Name
Functions, , Functions for File Names}). Note, however, that the
@samp{F} variants all omit the trailing slash which always appears in
the output of the @code{dir} function. Here is a table of the variants:
@item $(dir @var{names}@dots{})
Extract the directory part of each file name.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(notdir @var{names}@dots{})
Extract the non-directory part of each file name.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(suffix @var{names}@dots{})
Extract the suffix (the last @samp{.} and following characters) of each file name.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(basename @var{names}@dots{})
Extract the base name (name without suffix) of each file name.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(addsuffix @var{suffix},@var{names}@dots{})
Append @var{suffix} to each word in @var{names}.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(addprefix @var{prefix},@var{names}@dots{})
Prepend @var{prefix} to each word in @var{names}.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(join @var{list1},@var{list2})
Join two parallel lists of words.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(word @var{n},@var{text})
Extract the @var{n}th word (one-origin) of @var{text}.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(words @var{text})
Count the number of words in @var{text}.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(firstword @var{names}@dots{})
Extract the first word of @var{names}.@*
-@xref{Filename Functions, ,Functions for File Names}.
+@xref{File Name Functions, ,Functions for File Names}.
@item $(wildcard @var{pattern}@dots{})
Find file names matching a shell file name pattern (@emph{not} a
You can set @code{SHELL} in the makefile to change the shell used to run
commands. @xref{Execution, ,Command Execution}.
+@item MAKESHELL
+
+On MS-DOS only, the name of the command interpreter that is to be used
+by @code{make}. This value takes precedence over the value of
+@code{SHELL}. @xref{Execution, ,MAKESHELL variable}.
+
@item MAKE
The name with which @code{make} was invoked.
++p2;
if (*p2 == '\0')
p2 = NULL;
- else if (*p2 == ':')
+ else if (p2[0] == ':' && p2[1] == '\0')
goto check_var;
/* We must first check for conditional and `define' directives before
(void) define_variable (var, strlen (var), definition, origin, 1);
free (definition);
freebuffer (&lb);
- return lineno;
+ return (lineno + nlines);
}
else
{
DEBUGPR ("Must remake target `%s'.\n");
- /* It needs to be remade. If it's VPATH and not GPATH, toss the VPATH */
+ /* It needs to be remade. If it's VPATH and not reset via GPATH, toss the
+ VPATH */
if (!streq(file->name, file->hname))
{
- char *name = file->name;
-
- if (gpath_search (&name, NULL))
- {
- register struct file *fp = file;
-
- /* Since we found the file on GPATH, convert it to use the
- VPATH filename. */
- while (fp)
- {
- fp->name = fp->hname;
- fp = fp->prev;
- }
- DEBUGPR (" Using VPATH `%s' due to GPATH.\n");
- }
- else
+ if (debug_flag)
{
- if (debug_flag)
- {
- print_spaces (depth);
- printf(" Ignoring VPATH name `%s'.\n", file->hname);
- fflush(stdout);
- }
- file->ignore_vpath = 1;
+ print_spaces (depth);
+ printf(" Ignoring VPATH name `%s'.\n", file->hname);
+ fflush(stdout);
}
+ file->ignore_vpath = 1;
}
/* Now, take appropriate actions to remake the file. */
/* vpath_search and library_search store zero in MTIME
if they didn't need to do a stat call for their work. */
file->last_mtime = mtime;
+
+ /* If we found it in VPATH, see if it's in GPATH too; if so,
+ change the name right now; if not, defer until after the
+ dependencies are updated. */
+ if (gpath_search (name, strlen(name) - strlen(file->name) - 1))
+ {
+ rename_file (file, name);
+ check_renamed (file);
+ return file_mtime (file);
+ }
+
rehash_file (file, name);
check_renamed (file);
mtime = name_mtime (name);
{
/* Files can have bogus timestamps that nothing newly made will be
"newer" than. Updating their dependents could just result in loops.
- So notify the user of the anomaly with a warning. */
+ So notify the user of the anomaly with a warning.
+
+ We only need to do this once, for now. */
static time_t now = 0;
- if (mtime != -1 && mtime > now && ! file->updated)
+ if (!clock_skew_detected && mtime != -1 && mtime > now && ! file->updated)
{
/* This file's time appears to be in the future.
Update our concept of the present, and compare again. */
extern time_t time ();
time (&now);
#endif
- if (mtime > now)
- error ("*** Warning: File `%s' has modification time in the future",
- file->name);
+#ifdef WINDOWS32
+ /*
+ * FAT filesystems round time to nearest even second(!). Just
+ * allow for any file (NTFS or FAT) to perhaps suffer from this
+ * braindamage.
+ */
+ if (mtime > now && (((mtime % 2) == 0) && ((mtime-1) > now)))
+#else
+ if (mtime > now)
+#endif
+ {
+ error("*** Warning: File `%s' has modification time in the future",
+ file->name);
+ clock_skew_detected = 1;
+ }
}
}
merge_variable_sets (list0->set, next->set);
- free ((char *) next);
-
last0 = list0;
list0 = list0->next;
}
-char *version_string = "3.75.1";
+/* We use <config.h> instead of "config.h" so that a compilation
+ using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
+ (which it would do because make.h was found in $srcdir). */
+#include <config.h>
+
+char *version_string = VERSION;
\f
/*
Local variables:
}
}
\f
-/* Search the GPATH list for a directory where the name pointed to by FILE
- exists. If it is found, we set *FILE to the newly malloc'd name of the
- existing file, *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or
- zero if no stat call was done), and return 1. Otherwise we return 0. */
+/* Search the GPATH list for a pathname string that matches the one passed
+ in. If it is found, return 1. Otherwise we return 0. */
int
-gpath_search (file, mtime_ptr)
- char **file;
- time_t *mtime_ptr;
+gpath_search (file, len)
+ char *file;
+ int len;
{
- if (gpaths != 0
- && selective_vpath_search (gpaths, file, mtime_ptr))
- return 1;
+ register char **gp;
+
+ if (gpaths && (len <= gpaths->maxlen))
+ for (gp = gpaths->searchpath; *gp != NULL; ++gp)
+ if (!strncmp(*gp, file, len) && (*gp)[len] == '\0')
+ return 1;
return 0;
}