Tue Oct 29 20:57:36 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.

	* remake.c (update_file_1): Check for deps still running before
	giving up if any dep has failed.

Sat Oct 26 16:20:00 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h [uts]: #undef S_ISREG and S_ISDIR if defined.

Fri Oct 25 19:50:39 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.17.

Thu Oct 24 16:58:36 1991  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* job.c (start_job): Don't check for empty cmds before tweaking the
	command_ptr.  Just let construct_command_argv do it.

Tue Oct 22 20:21:03 1991  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* remake.c, arscan.c [POSIX]: <fcntl.h> instead of <sys/file.h>.

	* make.h [POSIX]: Declare vfork as pid_t.

Mon Oct 21 15:37:30 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.16.

	* job.c (construct_command_argv, construct_command_argv_internal):
	Take new 2nd arg RESTP.  If non-NULL, stop parsing at newline, and
	store addr of the NL in *RESTP.
	(start_job): Don't chop expanded cmd lines up; use above code to do it.
	* function.c (expand_function: `shell'): Pass RESTP==NULL.

Sat Oct 19 15:36:34 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.15.

Fri Oct 18 15:26:55 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (start_job): If on the same cmds->command_lines elt, look
	at cmds->lines_recurse[CHILD->command_line - 1] instead of
	[CHILD->command_line].

	* dir.c [sgi]: <sys/dir.h>, not ndir or anything else.

Thu Oct 17 16:28:55 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* file.c (print_file_data_base): Remove unused var.

	* make.h [NeXT]: No #define ANSI_STRING.

Tue Oct 15 20:08:41 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.60.14.

Fri Oct 11 16:23:52 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* make.h: Use PATH_MAX for getwd defn.

	* make.h: Move getcwd/getwd outside of #ifndef POSIX, and make it
	#if USG||POSIX.

Thu Oct 10 11:53:31 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.60.13.

	* read.c (read_all_makefiles): When processing MAKEFILES, save the
	malloc'd ptr to be freed, instead of freeing part-way thru it.

	* remake.c (update_file_1): Don't tweak FILE->also_make.
	(update_file): Do it here.  After calling update_file_1, set the
	command_state, update_status, and updated members of each also_make
	elt to FILE's values.

Tue Oct  8 14:56:04 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.60.12.

	* remake.c (notice_finished_file): Set command_state of FILE and
	its also_make chain to cs_finished here.
	* commands.c (execute_file_commands), job.c (child_handler),
	remake.c (remake_file): Don't set it before calling
	notice_finished_file.

	* file.h (struct file): Changed `also_make' to struct dep *.
	* job.c (delete_child_targets), file.c (print_file_data_base),
	remake.c (notice_finished_file), implicit.c (pattern_search):
	Use dep chain instead of array of file names.

Mon Oct  7 17:04:33 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.60.11.

	* arscan.c: Declare open.
	* misc.c: Declare {get,set}{re,}[ug]id.
	* variable.c (target_environment): Declare getenv.

Sat Oct  5 15:13:03 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* make.h [NeXT]: <string.h> instead of <strings.h>.

Fri Oct  4 16:05:41 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* default.c (default_suffixes, defualt_suffix_rules): Add .texi
	just like .texinfo.

	* Version 3.60.10.

	* job.c: Move vfork decl into make.h.

Fri Sep 27 18:45:30 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* compatMakefile (glob/libglob.a): Pass CC value to submake.

Thu Sep 26 00:08:15 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* load.c (load_average): Made not static.

	* load.c [ultrix && vax]: Define LDAV_TYPE and LDAV_CVT for Ultrix 4.2.

Tue Sep 24 00:17:20 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.9.

	* read.c (record_files): Warn about extra cmds even if the target's
	name begins with a dot.  I think the lusers can handle this.

Mon Sep 23 22:33:26 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h, arscan.c: Don't declare bcmp, bzero, or bcopy if they're
	#define'd.
	* make.h: Declare write and open.

	* default.c (default_suffixes, default_suffix_rules,
	default_variables): Add .C just like .cc.
	* make.texinfo (Catalogue of Rules): Document .C.

	* make.man (-w): Fix gramo.

Fri Sep 20 17:18:16 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h: No text after #endif.

Sun Sep 15 16:20:46 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.60.8.

	* implicit.c (pattern_search): In the second pass, recurse on rule
	deps that don't have a %.  Why did I make it not do this?

Fri Sep 14 18:29:39 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* read.c (record_files): For extra cmds, use the last ones given.
	If the target's name doesn't begin with a dot (bletch!!), emit a
	two-line warning, one line giving the old cmds' location and the
	other the new cmds' location.

	* misc.c (makefile_error, makefile_fatal): New fns.
	* make.h: Declare them.
	* Use them instead of error/fatal for all msgs including a file
	name and line number.

Thu Sep 13 16:35:54 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* make.h: Declare define_default_variables.
	Declare ar_parse_name, instead of ar_name_parse (M-t).

Mon Sep 10 18:35:40 1991  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* Version 3.60.7.

	* make.texinfo (Variables: Setting): Say whitespace is removed if
	"immediately after =", rather than simply "after =".

	* job.c: Don't declare wait #ifdef POSIX.

	* make.h [__GNUC__]: #undef alloca and then #define it.

	* main.c (main): When pruning makefiles which might loop from the
	read_makefiles chain, look at all `prev' entries of double-colon rules.

Fri Sep  7 00:41:53 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* main.c (main): Only remove makefiles with cmds but no deps from
	the list of makefiles to be rebuilt if they are :: targets.
	: targets with cmds and no deps are not dangerous.

Wed Sep  5 17:35:51 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (defines): Add comment that some compilers take
	ENUM_BITFIELDS but produce bogus code.
	(LOAD_AVG): Fix examples to \ "s.
	(LOADLIBES): Add comment that SGI Irix needs -lmld for nlist.

Tue Sep  4 20:26:26 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.6.

Fri Aug 30 19:34:04 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* remake.c (update_file_1): When checking the command_state of
	deps, check through the prev chain.
	(update_goal_chain): When a target is finished, start checking its
	prev (if it has one) instead.

Wed Aug  7 17:32:03 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* rule.c (convert_to_pattern): Allow files with deps to define
	suffix rules (really this time).

Mon Aug  5 17:09:21 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* misc.c (user_access, make_access): Do saved-IDs (USG) flavor
	#ifdef POSIX.

	* file.c (enter_file): Strip ./s here.
	* read.c (parse_file_seq): Not here.

Tue Jul 23 23:34:30 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile: Added comment that -lPW alloca is broken on HPUX.

Thu Jul 18 03:10:41 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.5.

	* read.c (read_makefile): Ignore lines containing chars that are
	all isspace, not just all isblank.

	* make.texinfo (Copying): @include gpl.texinfo, rather than copying
	the text.
	* gpl.texinfo: New file (symlink to /gd/gnu/doc/gpl.texinfo).
	* GNUmakefile: Put gpl.texinfo in distribution.

Tue Jul 16 12:50:35 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* make.h: #define _GNU_SOURCE before including headers.
	Include <ctype.h> and define isblank if <ctype.h> doesn't.
	* commands.c: Don't include <ctype.h> here.
	* *.c: Use isblank instead of explicit ' ' || '\t'.

Mon Jul 15 17:43:38 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* function.c (expand_function: `filter'/`filter-out'): Fixed to not
	loop infinitely.

Fri Jul 12 12:18:12 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* function.c (expand_function: `filter'/`filter-out'): Rewritten to
	handle filter-out of multiple patterns properly.  Also no longer
	mallocs and reallocs for temp array; uses alloca and a linked-list
	instead.

Wed Jul 10 22:34:54 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.4.

	* make.texinfo: Moved some @groups that were outside @examples to
	be inside them.

	* load.c [apollo] (load_average): Define using special syscall for
	Apollo DOMAIN/OS SR10.n.

Thu Jul  4 12:32:53 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* make.texinfo (Missing): Added Unix excessive implicit rule
	search; mention that POSIX.2 doesn't require any of the missing
	features.
	(Top): Updated printed manual price to $15.

Wed Jul  3 18:17:50 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* file.c (rename_file): Carry over last_mtime when merging files.
	* remake.c (f_mtime): Tail-recurse after renaming VPATH file, to
	check for saved date in existing renamed-to file.

	* remote-cstms.c (start_remote_job): Use PATH_VAR.

	* commands.c [POSIX || __GNU_LIBRARY__]: Don't declare getpid.

	* compatMakefile (glob-{clean,realclean}): Run clean/realclean in glob.
	(clean, realclean): Require those.

	* make.h: Always declare environ.
	Don't declare old glob functions.

	* GNUmakefile: Make no-lib deps for load.c and remote.c.

Tue Jul  2 18:35:20 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.60.3.

Mon Jul  1 16:58:30 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (multi_glob): Don't pass GLOB_QUOTE flag to glob.

	* make.h [POSIX]: Include <unistd.h>, and don't declare things that
	should be there.

	* main.c (main) [USG && sgi]: malloc a buffer for broken sgi stdio.

Sat Jun 29 11:22:21 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* function.c (expand_function: `shell'): Use alloca for the error
	msg buffer, instead of assuming an arbitrary max size.

Fri Jun 28 18:15:08 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c [POSIX] (search_path): Do real 1003.1 goop to get NGROUPS_MAX.

Wed Jun 26 11:04:44 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* default.c (define_default_variables): New fn.
	(install_default_implicit_rules): Code for above fn moved there.
	* main.c (main): Do define_default_variables before reading the
	makefile.

Tue Jun 25 17:30:46 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* main.c (main): Quote ; in MAKEOVERRIDES.

Tue Jun 18 13:56:30 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* compatMakefile: Fixed typo in comment.

Tue Jun 11 00:14:59 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.60.2.

Mon Jun 10 14:46:37 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h: Always include <sys/types.h>.
	[POSIX]: Include <limits.h> and #define MAXPATHLEN to be PATH_MAX.

	* default.c (default_suffix_rules: .texinfo.dvi): Use $(TEXI2DVI).
	(default_variables): Define TEXI2DVI.

Thu Jun  6 16:49:19 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.60.1.

	* make.h (SIGNAL): Cast handler arg to SIGHANDLER type.

Wed Jun  5 06:00:43 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* read.c (multi_glob): Use POSIX.2 `glob' function.
	If a glob pattern matches nothing, leave it as is (a la sh, bash).
	Also, if can't find USER for ~USER, leave it as is (a la bash).

Mon Jun  3 16:36:00 1991  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* compatMakefile: Rewrote comments about -Ds to be easier to use.

	* make.h, arscan.c, remake.c, main.c, dir.c, job.c: Changed tests
	of _POSIX_SOURCE to POSIX.

	* job.c: Take getdtablesize out of #ifdef __GNU_LIBRARY__.
	Put separately #ifdef USG.

	* COPYING: Replaced with version 2.
	* Changed copyright notices to refer to GPL v2.

Thu May 30 00:31:11 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h: Don't declare sigblock for POSIX.

	* main.c (main, log_working_directory) [USG]: Get getcwd failure
	mode from errno, not passed buffer like BSD getwd.

	* misc.c (child_access): New fn to set access for a child process;
	like user_access, but you can't change back.
	* make.h: Declare it.
	* job.c (exec_command): Use it in place of user_access.

Wed May 29 23:28:48 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* default.c (default_variables) [pyr]: PC = pascal.

Tue May 28 20:24:56 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.c (print_variable): Put a newline before `endef'.

Sat May 25 02:39:52 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.60.

Wed May 22 19:41:37 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.59.5.

Thu May 16 13:59:24 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (main): Do USGr3 setvbuf behavior #ifdef APOLLO.
	Don't handle SIGCHLD #ifdef USG (Apollo is USG but defines SIGCHLD).

Fri May 10 14:59:33 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* remake.c [sgi]: Don't include <sys/file.h>.

Wed May  8 01:54:08 1991  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* make.h (SIGHANDLER): #define as (void *) #if __STDC__,
	else (int (*)()).
	(SIGNAL): Use it to cast return value.
	* main.c (main): Cast SIG_IGN to SIGHANDLER when comparing.
	* job.c (block_signals, unblock_signals): Use SIGNAL instead of signal.

	* main.c: Declare mktemp to return char*, not int.

	* job.c (new_job): Don't increment files_remade.
	* remake.c (notice_finished_file): Do it here.

	* read.c (do_define): Don't clobber DEFINITION[-1] on empty defns.
	Free storage that is no longer needed.

Wed Apr 24 20:49:48 1991  Roland McGrath  (roland at churchy.gnu.ai.mit.edu)

	* misc.c (message): New fn to print informational msgs with
	leading "make: " or "make[N]: ".
	* make.h: Declare it.
	* remake.c (update_file): Use it instead of printf.

Fri Apr 19 05:52:45 1991  Roland McGrath  (roland at churchy.gnu.ai.mit.edu)

	* main.c (main): When there are no targets, if there were no
	makefiles, print a different error message, which mentions makefiles.

Tue Apr 16 03:22:45 1991  Roland McGrath  (roland at geech.gnu.ai.mit.edu)

	* remake.c (update_file): Print "nothing to be done" instead of "is
	up to date" if FILE->cmds == 0.

	* job.c [!WIFEXITED]: Define if not already defined.

Thu Apr 11 18:00:50 1991  Roland McGrath  (roland at wookumz.gnu.ai.mit.edu)

	* arscan.c (ar_name_equal): Fixed truncation comparison.

Tue Apr  2 16:17:35 1991  Roland McGrath  (roland at churchy.gnu.ai.mit.edu)

	* glob.c: Use common version from djm.
	* dir.c: Snarfed #ifdef mess for <dirent.h> or whatever from glob.c.
	(dir_file_exists_p): Ignore directory entries with d_ino==0.

Mon Apr  1 20:49:45 1991  Roland McGrath  (roland at albert.gnu.ai.mit.edu)

	* Version 3.59.4.

Fri Mar 29 19:16:18 1991  Roland McGrath  (roland at albert.gnu.ai.mit.edu)

	* job.c (free_child): Free CHILD->environment and its elts.

Sat Mar 23 14:08:09 1991  Roland McGrath  (roland at albert.gnu.ai.mit.edu)

	* read.c (read_makefile): Don't ignore lines containing only
	comments if they start with a tab.  Such lines should be passed to
	the shell for it to decide about the comments.

	* job.c (free_child): Free CHILD->command_lines and its elts, not
	CHILD->commands (which is obsolete).
	* job.h, job.c: Remove obsolete `commands' member of `struct child'.

Sun Mar 17 18:40:53 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* remake.c (update_file): Print a msg for a top-level up-to-date
	phony target (a different one than for a real file).

	* read.c (conditional_line): Boundary check so we don't check the
	value of the -1th elt of the stack (which is bogus).

Sat Mar 16 16:58:47 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* read.c (conditional_line): Don't evaluate an if* when we're
	already ignoring.  Instead, just push a new level, with a value of
	1, to keep ignoring.

Tue Mar 12 00:16:52 1991  Roland McGrath  (roland at geech.ai.mit.edu)

	* Version 3.59.3.

Mon Mar 11 23:56:57 1991  Roland McGrath  (roland at geech.ai.mit.edu)

	* job.c (construct_command_argv_internal): Quote backslashes
	when building the shell -c line.

Fri Mar  8 01:40:18 1991  Roland McGrath  (roland at geech.ai.mit.edu)

	* job.c (exec_command): Call user_access rather than setgid(getgid()).

	* misc.c (remove_comments): Renamed from collapse_line; took out
	collapse_continuations call.
	* make.h: Change decl.
	* read.c (read_makefile): Collapse continuations on the line buffer
	immediately after reading it.  Call remove_comments rather than
	collapse_line (which is now defunct).

Thu Feb 21 18:06:51 1991  Roland McGrath  (mcgrath at cygint.cygnus.com)

	* misc.c (user_access, make_access): New fns to toggle btwn permissions
	for user data (files and spawning children), and permissions for make
	(for taking the load average, mostly).
	* make.h: Declare them.
	* job.c (start_job): Call make_access before wait_to_start_job, and
	user_access after.
	* main.c (main): Call user_access before doing much.

Mon Feb  3 15:02:03 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* Version 3.59.2.

Tue Jan 29 20:30:50 1991  Roland McGrath  (roland at cygint.cygnus.com)

	* read.c (read_all_makefiles): Use allocated_variable_expand to expand
	`$(MAKEFILES)', since the results are used across calls to
	read_makefile, which could clobber them.

Wed Jan 23 00:24:10 1991  Roland McGrath  (roland at cygint.cygnus.com)

	* main.c (main): Call install_default_implicit_rules after reading
	makefiles, not before.
	* default.c (install_default_implicit_rules): If a suffix-rule file
	entry has cmds, don't give it any from default_suffix_rules.

Fri Jan 17 17:39:49 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* arscan.c: Added support for AIX archives.

	* remake.c: Don't include ar.h.
	* main.c: Removed unused atol decl.
	* arscan.c (ar_scan): Declare arg FUNCTION to return long int.
	* ar.c (ar_touch): Don't perror for an invalid archive.
	* make.h: Declare lseek as long int.

	* job.c [hpux]: Define getdtablesize a la USG.

Sun Jan 12 21:08:34 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* Version 3.59.1.

Fri Jan 10 03:48:08 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* job.c (search_path): Take new arg, place to put full pathname (rather
	than mallocing it).
	(exec_command): Pass it, using auto storage.

	* main.c (print_version): Updated copyright years.

Wed Jan  8 19:46:19 1991  Roland McGrath  (roland at albert.ai.mit.edu)

	* job.c [_POSIX_SOURCE]: Just #include <sys/wait.h>, and define macro
	WAIT_NOHANG in terms of waitpid.
	[!_POSIX_SOURCE && (HAVE_SYS_WAIT || !USG)]: Don't #include <signal.h>
	(make.h does).
	Define macro WAIT_NOHANG in terms of wait3.
	(child_handler): #ifdef on WAIT_NOHANG, not HAVE_SYS_WAIT || !USG.
	Use WAIT_NOHANG macro instead of wait3.

	* file.h (struct file.command_state): Remove unused elt.

Wed Dec 26 18:10:26 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* commands.c (set_file_variables): If FILE got its commands from
	.DEFAULT, make $< == $@ (4.3 BSD/POSIX.2d11 compat).

Mon Dec 24 17:36:27 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* default.c (default_variables): Rename 2nd LINK.s defn to LINK.S.

Fri Dec 14 15:05:25 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* vpath.c (selective_vpath_search): Check for makefile-mentioned before
	checking for actual existence.  The old order loses if the containing
	directory doesn't exist (but a rule might make it).

	* make.h [__GNUC__]: Don't #define alloca if already #define'd.

	* rule.c (convert_to_pattern): Don't look at the target constructed for
	the empty rule when making the null-suffix rule.  Construct it over
	again, since the former may have been freed already.

Thu Dec 13 17:21:03 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* make.h [__GNU_LIBRARY__]: Include <unistd.h> to get random fn decls.

Wed Dec 12 17:12:59 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* make.h, arscan.c, glob.c: Only include <memory.h> #ifdef USG.

	* variable.c (define_variable_in_set): Replace env_overrides check that
	wasn't really redundant (undoing Sep 28 change).  Add comment saying
	why this check is necessary.

	* job.c, main.c [DGUX]: Needs siglist like USG.

Mon Dec 11 01:19:29 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* default.c [M_XENIX]: For rules that are different for Xenix, use the
	generic Unix version #ifdef __GNUC__.

	* main.c [M_XENIX]: Use USGr3-style setvbuf call.

	* read.c (find_percent): Do backslash folding correctly, not leaving
	extra crud on the end of the string.

Sun Dec 10 21:48:36 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* job.c: Don't declare wait3 if it's #defined.

	* GNUmakefile, compatMakefile, make.texinfo: Change make-info
	to make.info.

Thu Dec  7 21:20:01 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* make.h [STDC_HEADERS || __GNU_LIBRARY__ || _POSIX_SOURCE]: Use
	ANSI <string.h> and names for str/mem functions.
	Use <stdlib.h> to declare misc fns rather than explicit decls.
	[_POSIX_SOURCE]: Don't declare kill (<signal.h> will).
	Include <sys/types.h> before <signal.h> because some braindead
	nonconformant 1003.1 implementation needs it.
	* misc.c: Don't declare malloc, realloc.  Do it in make.h.
	* arscan.c, glob.c: Use sequence for string fns from make.h verbatim.
	* make.h (S_ISDIR, S_ISREG): Declare if necessary.
	* commands.c (delete_child_targets), job.c (search_path), read.c
	(construct_include_path): Use S_ISfoo(m) instead of
	(m & S_IFMT) == S_IFfoo.
	* dir.c, glob.c [_POSIX_SOURCE]: Use dirent.

Wed Nov 29 22:53:32 1990  Roland McGrath  (roland at geech.ai.mit.edu)

	* Version 3.59.

Tue Nov 28 16:00:04 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* arscan.c (ar_name_equal) [APOLLO]: Don't do `.o' hacking.  On Apollos
	the full file name is elsewhere, and there is no length restriction (or
	so I'm told).

Thu Nov 23 17:33:11 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* load.c [hp300 && BSD] (LDAV_CVT): Define for this system.

Tue Nov 21 07:58:40 1990  Roland McGrath  (roland at albert.ai.mit.edu)

	* read.c (record_files): Fix trivial bug with deciding to free storage
	for a file name.

Thu Nov 16 06:21:38 1990  Roland McGrath  (roland at geech.ai.mit.edu)

	* compatMakefile ($(bindir)/make): Install it setgid kmem.

Thu Nov  1 16:12:55 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* GNUmakefile (make-*.tar.Z): Use `h' option to tar (dereference
	symlinks), to grab texinfo.tex from wherever it lives.

Tue Oct 30 16:15:20 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* Version 3.58.13.

Fri Oct 26 14:33:34 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* GNUmakefile: make-*.tar.Z: Include texinfo.tex.

Tue Oct 23 19:34:33 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* main.c (define_makeflags): When there are no flags to write, make
	sure the array has two leading nulls, since `MAKEFLAGS' is defined from
	&flags[1].

	* main.c (default_keep_going_flag): New variable (constant one).
	(command_switches: -k, -S): Use above for default value.
	(define_makeflags): Only write flag/flag_off switches if they are on,
	and either there is no default value, or they are not the default.

Mon Oct 22 16:14:44 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* main.c (struct command_switch): New member `no_makefile'.
	(command_switches: -n, -q, -t): Set no_makefile == 1.
	(define_makeflags): Take new arg MAKEFILE: if nonzero, don't use
	options whose `no_makefile' flags are set.
	(main): Call define_makeflags with MAKEFILE==1 before remaking
	makefiles, and again with MAKEFILE==0 before remaking goals.

Tue Oct  2 17:16:45 1990  Roland McGrath  (roland at geech.ai.mit.edu)

	* Version 3.58.12.

Mon Oct  1 15:43:23 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* arscan.c [HPUX]: Use PORTAR==1 format.

Sat Sep 29 16:38:05 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* make.h, remake.c, arscan.c: Don't declare `open'.

Fri Sep 28 04:46:23 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* variable.c (define_variable_in_set): Remove redundant -e check.

Wed Sep 26 00:28:59 1990  Roland McGrath  (roland at geech.ai.mit.edu)

	* job.c (start_job): Set RECURSIVE from the right elt of
	CHILD->file->cmds->lines_recurse.

	* commands.c (chop_commands): Don't botch the line count for allocating
	CMDS->lines_recurse.

	* Version 3.58.11.

	* job.c (start_job): Don't always increment CHILD->command_line!  Only
	do it when CHILD->command_ptr has run out!  (Dumb bug.  Sigh.)

Thu Sep 20 02:18:51 1990  Roland McGrath  (roland at geech.ai.mit.edu)

	* GNUmakefile [ARCH]: Give explicit rule for remote.{c,dep} to use
	variable `REMOTE' for more flags.
	($(prog)): Link in $(LOADLIBES).

Wed Sep 19 02:30:36 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* commands.h (struct commands): New member `ncommand_lines', the number
	of elts in `command_lines' et al.
	* commands.c (chop_commands): Set `ncommand_lines' elt of CMDS, and
	don't put a nil pointer at the end of `command_lines'.
	* job.h (struct child): New member `command_lines' to hold
	variable-expanded command lines.
	* job.c (new_job): Store expanded command lines in `command_lines'
	member of new child.  Don't clobber FILE->cmds.
	(start_job): Use CHILD->command_lines in place of
	CHILD->file->cmds->command_lines.

	* variable.h, variable.c, job.c, expand.c: Undo yesterday's change,
	which is no longer necessary since we have cleverly avoided the issue.

	* job.c (start_job): Don't variable-expand each command line.
	(new_job): Do them all here, storing the expansions in the array.

Tue Sep 18 01:23:13 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* variable.h (struct variable): Remove `expanding' member.
	* variable.c (define_variable_in_set): Don't initialize it.
	* expand.c (struct variable_expanding): New type, a linked list
	containing `struct variable' pointers.
	(variables_expanding): New variable, the chain of variables currently
	being expanded.
	(recursively_expand): Don't test and set `expanding' member.
	Instead, run through the `variables_expanding' chain looking for a link
	referring to V to find self-reference.  Add a new link to the chain,
	describing V, before recursive expansion, and pop it off afterward.
	* job.c (child_handler): Save `variables_expanding' and clear it before
	calling start_job, and restore it afterward.  This avoids major lossage
	when the SIGCHLD comes in the middle of variable expansion.

Mon Sep 17 14:46:26 1990  Roland McGrath  (roland at geech.ai.mit.edu)

	* job.c, commands.c: Don't define sigmask.
	* make.h: Put it here instead.

	* variable.c (target_environment): If `.NOEXPORT' was specified as a
	target, only export command-line and environment variables, and
	file-origin variables that were in the original environment.

	* make.man: Add missing ?roff control for `-I' option description.

Thu Sep 13 14:10:02 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* load.c [UMAX]: Move #include <sys/sysdefs.h> to [not UMAX_43].

Wed Sep 12 15:10:15 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* expand.c (recursively_expand): Don't use `reading_filename' and
	`reading_lineno_ptr' if they're nil.

Thu Aug 30 17:32:50 1990  Roland McGrath  (roland at geech)

	* Version 3.58.10.

Tue Aug 28 04:06:29 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* job.c [USG] (unknown_children_possible): New variable, set nonzero
	when it's possible for children not in the `children' chain to die.
	(block_signals) [USG]: Set it.
	(unblock_signals) [USG]: Clear it.
	(child_handler) [USG]: Don't complain about unknown children if
	`unknown_children_possible' is set.

	* read.c (do_define): Make sure there's enough space for the newline,
	so we don't write off the end of allocated space.

	* arscan.c (ar_name_equal): Fixed to work when MEM is AR_NAMELEN-1 but
	NAME is not the same length.

Sat Aug 25 16:17:14 1990  Roland McGrath  (roland at geech)

	* job.c (construct_command_argv_internal): Use a static char array for
	a constant, since old C has no auto aggregate initializers.

Thu Aug 23 16:11:03 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* job.c (search_path): If PATH is nil or "" use a default path.

Wed Aug 22 01:05:32 1990  Roland McGrath  (roland at churchy.ai.mit.edu)

	* Version 3.58.9.

	* job.c (exec_command): Don't take PATH and SHELL args.  Get them from
	ENVP.
	(child_execute_job): Don't take FILE arg, and don't pass path and shell
	to exec_command.
	(start_job): Don't pass FILE arg to child_execute_job.
	* function.c (expand_function: `shell'): Ditto.
	* main.c (main): Don't pass path and shell to exec_command.

Fri Aug 17 23:17:27 1990  Roland McGrath  (roland at geech)

	* job.c (construct_command_argv_internal): New fn broken out of
	construct_command_argv.  Takes strings SHELL and IFS instead of doing
	variable expansion for them.  Recurse to make an argv for SHELL,
	passing SHELL==0.  When SHELL==0, don't recurse for shell argv; make a
	simple one using /bin/sh.
	(construct_command_argv): Do the variable expansions and call above.

Thu Aug 16 19:03:14 1990  Roland McGrath  (roland at geech)

	* read.c (multi_glob): For ~USER/FILE, if USER isn't found, don't
	change the file name at all.

Tue Aug  7 18:33:28 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* function.c (expand_function: `suffix'/`notdir'): Don't kill the last
	space if we never wrote one.

	* function.c (expand_function: `suffix'): Retain the dot, like the
	documentation says.

Mon Aug  6 14:35:06 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.58.8.

	* main.c (decode_switches): For positive_int and floating cases, move
	SW past the arg (and don't set it to ""), so another switch can follow.

Fri Aug  3 00:43:15 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* job.c (child_execute_job): Use unblock_signals instead of
	push_signals_blocked_p (0).

	* main.c (fatal_signal_mask): New variable, mask of signals caught with
	fatal_error_signal.
	(main): Set it.
	* job.c ({block,unblock}_children): Renamed to {block,unblock}_signals.
	Block/unblock both child signal and signals in fatal_signal_mask.
	(children_blocked_p_{stack,max,depth}, {push,pop}_children_blocked_p):
	Renamed from children to signals.  Use {block,unblock}_signals instead
	of {block,unblock}_children.
	* commands.c (fatal_error_signal), job.c (wait_for_children, new_job,
	child_execute_job, main, log_working_directory), function.c
	(expand_function: `shell'), job.h: Rename {push,pop}_children_blocked_p
	to {push,pop}_signals_blocked_p.
	* job.c (child_handler): Call {block,unblock}_signals instead of just
	{block,unblock}_remote_children.  We need to block the fatal signals.

Thu Aug  2 22:41:06 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* main.c, function.c: Fixed typos in comments.

	* file.c (print_file_data_base): Fix computation of avg files/bucket.

Tue Jul 31 22:11:14 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.58.7.

Wed Jul 25 16:32:38 1990  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* arscan.c (ar_name_equal): Fixed to really do it right.
	(ar_member_pos): Fixed order of args.
	* ar.c (ar_member_date_1): Ditto.

Fri Jul 20 15:30:26 1990  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* arscan.c (ar_name_equal): Rewritten.  Accounts for a possible
	trailing slash in MEM.

	* remake.c (f_mtime): Keep track of whether ARNAME is used and free it
	if not.  Also free MEMNAME.
	* ar.c (ar_member_date, ar_touch): Ditto.

	* arscan.c (arscan) [HPUX or hpux]: Treat same as USGr3 PORTAR==1.

	* make.h: If NSIG is not defined, but _NSIG is, #define NSIG _NSIG.

	* compatMakefile: Don't use $* in explicit rules.

	* default.c (default_variables: "PREPROCESS.S"): Include $(CPPFLAGS).

	* remake.c (f_mtime): If FILE is an ar ref, get the member modtime.

	* function.c (string_glob): Terminate the string properly when it's
	empty.

Wed Jul 18 11:26:56 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.58.6.

	* commands.c (set_file_variables): Fixed computation for ^F/?F elt len.

Sat Jul 14 13:41:24 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* job.c (construct_command_argv): Always use
	allocated_variable_expand_for_file instead of variable_expand_for_file
	because we might be called from inside a variable expansion (for the
	`shell' function).

	* function.c (expand_function: `shell'): Free the arglist's storage
	correctly.  construct_command_argv only allocates ARGV and ARGV[0].

	* job.c (children_blocked_p_idx): Renamed to children_blocked_p_depth.
	(push_children_blocked_p, pop_children_blocked_p): Use ..._depth
	instead of ..._idx, and do it right!

Wed Jul 11 15:35:43 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.h (SIGNAL): New macro to replace `signal' calls.  Does arg and
	ret value casts to (void *) #ifdef __STDC__ to avoid conflicts btwn
	ANSI and BSD `signal' and handler types.
	* main.c (main), job.c (child_handler): Use it.

Fri Jul  6 00:00:38 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* ar.c (ar_member_date, ar_touch): Pass 2nd arg to f_mtime.

	* read.c (read_makefile): Search the include path for MAKEFILES
	variable makefiles (TYPE == 1), like it says in the manual.

	* file.h (struct file), main.c (struct command_switch): Remove trailing
	commas from enums.

	* commands.c (execute_file_commands): Remove unused variables.
	* commands.h: Declare chop_commands.
	* make.h: Declare uniquize_deps.
	* main.c (main): Remove unused variable.
	(decode_switches): Remove unused label.
	* remake.c: Include "ar.h" for ar_parse_name decl.
	* implicit.c (try_implicit_rule): Remove unused variable.
	* function.c (expand_function: `shell'): Declare fork, pipe.
	* ar.c: Declare ar_name_equal.

	* GNUmakefile: If using gcc, add warning flags to CFLAGS.

	* remake.c: Remove decl of ar_member_date, since it's done in make.h.

	* remake.c (f_mtime): For ar refs, allow the archive to be found via
	VPATH search if we're searching, and change the ar ref accordingly.

	* ar.c (ar_parse_name): New global fn to parse archive-member
	references into the archive and member names.
	(ar_member_date, ar_touch): Use it.
	* make.h: Declare it.

	* remake.c (f_mtime): After doing rename_file, do check_renamed instead
	of assuming rename_file will always set FILE->renamed (which it won't).

	* vpath.c (selective_vpath_search): Only accept prospective files that
	don't actually exist yet are mentioned in a makefile if the file we are
	searching for isn't a target.

Wed Jul  4 04:11:55 1990  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* remake.c (update_goal_chain): Do check_renamed after calling
	file_mtime.
	(check_dep): Ditto after update_file.

	* file.c (rename_file): Prettied up long message for merging cmds.

	* remake.c (update_file_1): Get each dep file's modtime, and allow for
	it being renamed, before checking for a circular dep, since a renaming
	may have introduced one.

Tue Jul  3 18:15:01 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* ar.c (ar_touch): Don't free ARNAME since enter_file holds onto the
	storage.

	* function.c (string_glob): Don't leave a trailing space.

	* read.c (do_define): Allow leading whitespace before `endef'.

Mon Jul  2 14:10:16 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* implicit.c (pattern_search): No longer take NAME arg.  Instead take
	ARCHIVE flag.  If ARCHIVE is nonzero, FILE->name is of the form
	"LIB(MEMBER)"; rule for "(MEMBER)" is searched for, and LASTSLASH is
	set to nil.  Since NAME was only non-nil when it was the archive member
	name passed by try_implicit_rule, this change easily allows turning off
	LASTSLASH checking for archive members without excessive kludgery.
	(try_implicit_rule): Pass ARCHIVE flag instead of file name.

	* Version 3.58.5.

	* commands./c (set_file_variables): Don't kill last char of $(^D) elts.

Sat Jun 30 00:53:38 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* ar.c (ar_member_date): Don't free ARNAME since enter_file holds onto
	the storage.

	* arscan.c (ar_scan) [sun386 && PORTAR == 1]: Treat like USGr3.

Wed Jun 27 14:38:49 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* main.c (main): Put a newline on the debugging message when deciding
	not to remake a makefile to avoid a possible loop.
	Only decide not to remake makefiles that have commands (as well as
	being targets and having no deps).

Fri Jun 22 12:35:37 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* default.c (default_variables): Define `LINK.s' and `LINK.S'.
	(default_suffix_rules): Define .S.o rule.

	* job.c (construct_command_argv): If we decide to go the slow route,
	free all storage for the chopped args.
	(start_job): Free the argument list's storage correctly.
	construct_command_argv only allocates ARGV and ARGV[0].

Tue Jun 19 18:27:43 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.58.4.

Fri Jun 15 21:12:10 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* glob.c: New version from ai-lab which doesn't do [^abc].

Thu Jun  7 00:30:46 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* dir.c: Copied dirent vs direct et al mess from glob.c.

	* glob.c: Replaced with updated version from djm.
	* glob.c: Check macro DIRENT instead of _POSIX_SOURCE for <dirent.h>.
	__GNU_LIBRARY__ implies DIRENT and STDC_HEADERS.

Thu May 31 22:19:49 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* vpath.c (vpath_search): Don't stop the loop if a pattern matches but
	the search fails.  All matching patterns have their paths searched
	(like it says in the manual).

	* make.texinfo (Rules: Directory Search: Selective Search): Say that
	multiple `vpath' directives with the same pattern DO accumulate, not
	supersede earlier ones.

	* vpath.c (print_vpath_data_base): Increment the count of vpaths on
	each loop iteration, rather than letting it stay zero.

	* Version 3.58.3.

	* job.c (block_children, unblock_children): Made static.
	(push_children_blocked_p, pop_children_blocked_p): New functions to
	push and pop whether children are blocked or not.
	* job.h: Declare push_children_blocked_p, pop_children_blocked_p and
	not block_children, unblock_children.
	* commands.c (fatal_error_signal), job.c (wait_for_children, new_job,
	child_execute_job), main.c (main, log_working_directory): Use sequences
	of push_children_blocked_p (1) and pop_children_blocked_p () instead of
	explicitly blocking and unblocking children.
	* function.c (expand_function: `shell'): Don't unblock children.  The
	push-pop sequence in wait_for_children makes it unnecessary.

Tue May 29 21:30:00 1990  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* read.c (do_define): Don't include the last newline in the definition.

	* function.c (expand_function: `shell'): Call construct_command_argv
	before forking and don't fork if it returns nil.  Free the argument
	list's storage before finishing.

	* job.c (start_job): Free the storage for the child's argument list
	in the parent side of the fork after the child has been spawned.

	* job.c (start_job): If construct_command_argv returns nil, go to the
	next command line.

	* job.c (construct_command_argv): Use the shell if the command contains
	an unterminated quote.

Wed May 23 19:54:10 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.58.2.

	* read.c (read_makefile): Parse "override define" correctly.

Thu May 17 15:25:58 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* arscan.c [USG]: Don't declare memcpy and memcmp.  <memory.h> should
	do this anyway (and lack of declarations is harmless).

	* remote-customs.c: Renamed to remote-cstms.c for System V.
	* remote.c [CUSTOMS]: Changed accordingly.

Sun May 13 14:38:39 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* GNUmakefile: Use same cmds for doc tar.Z as for dist tar.Z (so the
	contents go in make-N.NN).

Thu Apr 26 19:33:25 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.58.1.

Wed Apr 25 20:27:52 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* job.c (init_siglist): Don't do SIGUSR1 and SIGUSR2 if they are the
	same as SIGIO and SIGURG (true on Cray).

Tue Apr 24 20:26:41 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* arscan.c (ar_scan): Do behavior for PORTAR == 1 and USGr3 also
	#ifdef APOLLO.

Wed Apr 11 10:00:39 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* job.c (exec_command): Set the effective GID to the real GID.  Somehow
	this code got lost.

	* implicit.c (pattern_search): Use the right index variable when
	seeing if we need to expand FILE->also_make.

Sun Mar  4 09:18:58 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.58.0.

	* remake.c (remake_file): Treat non-targets without commands under -t
	the same as anything else without commands.

Sat Feb 24 17:46:04 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* default.c (default_variables: PREPROCESS.S): Removed $< from defn.

	* main.c (main): Ignore arguments that are the empty string, rather
	than feeding them to enter_file and barfing therein.

Wed Feb 14 16:28:37 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* main.c (main): Call construct_include_path after doing chdirs.

Thu Feb  8 13:43:44 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.58.

Sat Feb  3 22:06:55 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.57.7.

	* make.texinfo (Implicit: Catalogue of Rules): For RCS, noted that
	working files are never overwritten by the default rule.

Thu Feb  1 17:27:54 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* rule.c (count_implicit_rule_limits): Redid loop control to not run
	twice on freed rules.

	* GNUmakefile: Made `.dep' files be architecture-specific too.

	* main.c (main, log_working_directory) [USG]: Block children around
	calls to `getwd' (actually `getcwd' on USG), because that function
	sometimes spawns a child running /bin/pwd on USG.

Tue Jan 30 14:02:50 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* function.c (subst_expand): Pay attention to SUFFIX_ONLY, putz.

Wed Jan 24 21:03:29 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* make.man: Fixed repeated word.

	* make.texinfo (Missing): Reworded a buggy sentence.

Mon Jan 22 12:39:22 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* main.c (print_version): Added 1990 to copyright notice.

	* Version 3.57.6.

Sat Jan 20 11:52:01 1990  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* file.c (rename_file): Don't free the storage for the old name, since
	it might not have been malloc'd.

	* job.c (construct_command_argv): Call
	allocated_variable_expand_for_file instead of variable_expand_for_file
	to expand `$(SHELL)'.

	* make.texinfo (Bugs): Change address from roland@wheaties.ai.mit.edu
	to roland@prep.ai.mit.edu.

Tue Jan 16 19:22:33 1990  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.57.5.

Sun Jan 14 16:48:01 1990  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* job.c (start_job): Only call wait_to_start_job for the first command
	line in each sequence.

Thu Jan  4 14:27:20 1990  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* load.c [LDAV_BASED] (wait_to_start_job): Loop while job_slots_used >
	0, not > 1.

	* job.c (search_path): Don't return a pointer to local storage.
	Allocate data space for the pathname instead.

	* function.c (expand_function: `shell'): Don't write garbage if the
	child wrote no output.

Wed Jan  3 15:28:30 1990  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.57.4.

	* file.h (struct file): New member `renamed', a `struct file *' that is
	the place this file has been renamed to (or nil).
	(check_renamed): Macro to check for a file having been renamed.
	Dereferences the renaming and sets the given variable.
	* file.c (rename_file): Completely rewritten.  Renames in place if
	possible, or moves FILE to a different hash bucket if there is no
	existing file with the new name.  If there is an existing file with the
	new name, FILE is merged into it and FILE->renamed is set to point to
	it.
	* variable.c (merge_variable_sets): New fn to merge two variable sets.
	(merge_variable_set_lists): New fn to merge two variable set lists.
	* variable.h: Declare merge_variable_set_lists.
	* remake.c (update_file_1, check_dep): Run `check_renamed' after
	calling file_mtime, check_dep.
	(update_file): Same after update_file_1.
	(update_goal_chain, update_file_1, check_dep): Same after update_file.

	* read.c (uniquize_deps): New fn, broken out of record_files, to remove
	duplicate deps from a chain.
	(record_files): Use it.
	* implicit.c (pattern_search): Use uniquize_deps.

	* file.h (file_mtime_1): New macro, like file_mtime, but take second
	arg, passed to f_mtime.
	(file_mtime): Implement as file_mtime_1 (file, 1).
	(file_mtime_no_search): New macro: file_mtime (file, 0).
	* remake.c (f_mtime): Take new arg SEARCH.  Only do VPATH and `-lNAME'
	searching if it is nonzero.
	* main.c (main): Use file_mtime_no_search for makefiles.
	* remake.c (update_goal_chain): Use file_mtime_no_search if MAKEFILES.

	* main.c (printed_version): New variable, init'd to zero.
	(print_version): Set it to nonzero before returning.
	(die): If -v and !printed_version, call print_version before clean up
	and death.

	* main.c (log_working_directory): Keep track of whether or not the
	"Entering" message has been printed, and return without printing the
	"Leaving" message if not.

	* main.c (decode_switches): Don't complain about missing args before
	checking for a noarg_value elt in the command_switch structure.

Tue Jan  2 15:41:08 1990  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.texinfo (Commands: Recursion: Options/Recursion): Document
	special case of -j.

	* make.texinfo, main.c, job.c: Changed copyright notices to include
	1990.

	* make.texinfo (Top): Fixed introductory paragraph, which said that
	`make' itself (instead of the manual) has various chapters.
	(Variables: Advanced: Substitution Refs): When pxref'ing about
	`patsubst', use node `Text Functions', not `Functions'.
	Add an xref about `patsubst' after description of $(var:a%b=c%d).
	(Functions: Syntax of Functions): Explain why mixing delimiters in
	function/var refs is unwise.  Clarify fn arg evaluation order.
	(Options): Reworded sentence about `-e'.
	(Implicit: Implicit Variables): Don't say `RM' is unused.
	Say the dflt values for the flag vars is empty unless otherwise noted,
	since some have defaults.
	(Implicit: Pattern Rules: Pattern Examples): Clarified use of $< and $@
	in first example.
	(Implicit: Last Resort): Don't say the .DEFAULT example creates files
	"silently".  It's automatic, but not silent.
	(Implicit: Search Algorithm): Fixed confusing ungrammatical sentence
	for item 5.1.
	(Archives: Archive Update): Added missing `next' pointer.
	(Archives: Archive Symbols): Note that GNU `ar' deals with this
	automatically.

	* job.c (search_path): New fn, to search for an executable file in a
	search path (broken out of exec_command).
	(exec_command): Take fourth arg, the shell program to use (if
	necessary).  Use search_path for the program, and the shell program.
	Pass args "file args ..." to shell program (with no -c), where FILE is
	the full pathname of the program (script) to be run.
	(child_execute_job): Pass shell program to exec_command.
	* main.c (main): Ditto.

	* main.c (main): Don't write a message if exec_command returns, because
	it will never return.

Fri Dec 22 16:19:58 1989  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* default.c (default_variables: "LINK.cc"): Use $(C++FLAGS) instead of
	$(CFLAGS).

Wed Dec 20 09:58:48 1989  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* job.c (new_job): If start_job set the child's `command_state' to
	`cs_finished', call notice_finished_file.

Sun Dec 17 19:45:41 1989  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* Version 3.57.3.

Wed Dec 13 17:57:12 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* rule.c (convert_to_pattern): Accept files with dependencies as
	suffix rules.

Thu Nov 30 15:47:13 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.57.2.

	* function.c (expand_function: `shell'): Don't clobber BUFFER and then
	try to free it.

	* remake.c (update_file_1): Took code to force remake of nonexistent
	deps out of #if 0, and changed the test to nonexistent non-intermediate
	deps.  In version 4, I think removing this test completely will
	implement the new feature that if a: b and b: c and c is newer than a,
	b need not be remade.

Sun Nov 26 16:12:41 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* compatMakefile (load.o, remote.o): Use $*.c instead of explicit file
	names so that using VPATH works.

Tue Nov 21 14:57:18 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.57.1.

Fri Nov 10 03:28:40 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* remake.c (check_dep): Set *MUST_MAKE_PTR if FILE does not exist after
	being updated.  (The exact opposite test was here before; why???)
	(update_file_1): Set a dep's `changed' member after updating it if it
	is phony and has commands (because they will then always be executed).

Thu Nov  9 13:47:12 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* load.c [UMAX]: #ifdef UMAX_43 include different headers for the
	`inq_stats' call.
	* compatMakefile (LOAD_AVG): Document UMAX_43.

	* Version 3.57.0.

	* commands.c (chop_commands): New function to chop commands into lines.
	* job.c (new_job): Break that code out, and call chop_commands.
	* remake.c (remake_file): Call chop_commands before looking at
	FILE->cmds->any_recurse.

	* make.texinfo (Running: Goals): Don't say that the default target
	won't be taken from an included makefile.

	* remake.c (update_file_1): #if 0 out setting MUST_MAKE if a dep
	doesn't exist.

Fri Nov  3 15:53:03 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.57.

	* variable.c (try_variable_definition): Don't calculate useless value.

	* main.c (define_makeflags): Fixed -j propagation.

	* commands.c (execute_file_commands): Removed unused variable.

Sun Oct 29 11:11:15 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (execute_file_commands): If the commands are empty, call
	notice_finished_file before returning.

Sat Oct 28 23:06:32 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* remake.c (update_file_1): Don't always update a target that has no
	deps.  Only do this for double-colon targets.

Wed Oct 25 16:36:16 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* main.c (main) [hpux]: hpux == HPUX.
	* compatMakefile (defines): Document that HPUX should be defined.

Tue Oct 24 19:19:48 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.8.

	* job.c (exec_command): Fixed what mode bits are checked.

	* remake.c (update_file_1): "No cmds and no deps actually changed"
	loses if ! FILE->is_target.

	* make.texinfo (Variables: Setting): Don't say that spaces after a
	variable definition are ignored (since they aren't).

Mon Oct 23 14:34:23 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.7.

	* remake.c (update_file_1): If, after being updated, any dependency
	does not exist, remake the target.

	* remake.c (update_file_1): Always update if FILE has commands but no
	deps.

	* commands.c (execute_file_commands): If we return early because there
	are no commands, set FILE->updated.

Thu Oct 19 18:47:37 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* arscan.c (ar_scan) [M_XENIX]: Don't run atoi or atol on the
	`struct ar_hdr' members that are int or long int on Xenix.

Sat Oct 14 10:43:03 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* arscan.c (ar_scan): Cosmetic clean ups.
	(ar_name_equal): New function to compare names, handling truncated
	member names and special `.o' truncation.
	(ar_member_pos): Use ar_name_equal.
	* ar.c (ar_member_date_1): Use ar_name_equal.

	* Version 3.56.6.

	* file.h (struct file): Made `update_status' a `short int', and moved
	it before `command_state' so the bitfields can be packed better.

	* remake.c (files_remade): Made global.
	(notice_finished_file): Don't increment files_remade.
	* job.c (new_job): Do.

	* job.c (start_job): Don't return a value.  Always set
	CHILD->file->command_state to either cs_running or cs_finished.
	(new_job, child_handler): Don't expect start_job to return a value.
	Instead, look at the file's command_state.

	* commands.c (chop_commands): Merged into job.c (new_job).
	* commands.h: Don't declare chop_commands.

	* job.c (start_job): Made static.
	(new_job): New function to create a `struct child' and call start_job.
	(free_child): New function to free a `struct child'.
	(child_handler, new_job): Call it.
	* job.h: Don't declare start_job.  Do declare new_job.
	* commands.c (execute_file_commands): Call new_job.

	* commands.c (execute_file_commands): Don't set FILE->update_status if
	start_job fails.

	* function.c (expand_function): Don't use `reading_filename' and
	`reading_lineno_ptr' if they're nil.

Fri Oct 13 18:16:00 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* read.c (find_semicolon): New function to look for an unquoted ; not
	preceded by an unquoted # in a string.
	(read_makefile): Call it before expanding the line.  If it finds a ;,
	cut the line short there before expanding it.  If not, call it again
	after expanding.

	* commands.c (execute_file_commands): Don't check FILE->command_state.
	We won't get called unless it's cs_not_started.

	* read.c (read_makefile): Call collapse_line on the variable-expanded
	rule line after checking for ; and #.

	* job.c (start_job): When there are no more commands, always return 0.
	* commands.c (execute_file_commands): Don't put the new child in the
	`children' chain unless FILE->command_state is cs_running.

	* read.c (read_makefile): Rewrote ;-handling to only do it once (why
	did I do it twice??) and to check for a # before the ;.

	* job.c (start_job): Set CHILD->file->update_status to 0 when we run
	out of commands.  Set it to 1 before returning failure.
	(child_handler): Don't set C->file->update_status to 0 when start_job
	returns success and commands are not running.

	* read.c (read_makefile): If there is a # before the ; for commands,
	forget the ; and commands.

Thu Oct 12 15:48:16 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* job.c (child_execute_job): Pass -c to the shell.

Wed Oct 11 18:41:10 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.5.

	* main.c (define_makeflags): Cleaned up to keep better track of dashes
	written, etc.

	* function.c (expand_function: `shell'): When converting newlines to
	spaces in output, search with `index' calls rather than a simple loop.

	* main.c (main): Make sure stdout is line-buffered.

	* main.c (decode_switches): Always check for missing switch arg.

Mon Oct  9 17:17:23 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.4.

Sat Oct  7 00:32:25 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (set_file_variables): #ifdef NO_ARCHIVES, still set $@ and
	$%.

	* commands.c (set_file_variables): Include a trailing slash in the
	directory variables (@D, etc.).

	* job.c (child_handler): Call notice_finished_file after changing a
	child's state to `cs_finished'.
	* remake.c (update_file_1): Don't call notice_finished_file if
	FILE->command_state == cs_finished.

Wed Oct  4 16:09:33 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.3.

Tue Oct  3 21:09:51 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* read.c (read_all_makefiles): When setting elements of MAKEFILES from
	the contents of read_makefiles, make sure we're using the right
	element.

	* dir.c, glob.c [USGr3 || DIRENT]: Don't define d_ino as d_fileno.

	* Version 3.56.2.

	* remake.c (update_file_1): Return zero after calling remake_file if
	FILE->command_state != cs_finished.  Test update_status thoroughly.

	* commands.c (execute_file_commands): Don't call notice_finished_file.

	* remake.c (remake_file): Return immediately after calling
	execute_file_commands.

Sat Sep 30 14:57:05 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.1 (alpha).

	* file.h (struct file): Made `update_status' not be a bitfield, since
	some broken compilers don't handle it right.

	* function.c (expand_function: `join'): Don't clobber the pointers and
	then try to free them.

	* job.c (exec_command): Fixed & vs = precedence problem.

Thu Sep 28 17:29:56 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* remake.c (update_file_1): Fixed typo in debugging output.

	* remake.c (library_file_mtime): Search for /usr/local/lib/libLIB.a
	after /usr/lib/libLIB.a.

Tue Sep 26 16:07:58 1989  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* read.c (conditional_line): For `ifeq (a, b)', swallow space after the
	comma.

Sun Sep 24 13:25:32 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* function.c (patsubst_function): If BY_WORD and the match is not a
	full word, update the text pointer correctly.

	* function.c (expand_function: `word'): Don't lose track of the second
	arg's expansion and free something else instead.

Fri Sep 22 16:15:29 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.56.

Thu Sep 21 14:28:42 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* main.c (main): Make an array of the mtimes of the makefiles before
	updating them, and compare their file_mtimes against this later.  Don't
	re-exec if a makefile was successfully updated but didn't change.  If a
	makefile failed to be remade and no longer exists, die.  If a makefile
	failed to be remade, but changed anyway, re-exec.  If a makefile failed
	to be remade, but is unchanged, continue on.

Wed Sep 20 18:02:07 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.55.6.

	* implicit.c (pattern_search): Maintain an array CHECK_LASTSLASH of the
	CHECK_LASTSLASH flag values used to match each member of TRYRULES.
	When making FILE->stem, if CHECKED_LASTSLASH[FOUNDRULE], prepend the
	part of FILENAME before LASTSLASH.

Tue Sep 19 17:44:08 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* dir.c (dir_file_exists_p): Check for FILENAME being nil before
	checking for it being "".

	* main.c (define_makeflags): Fixed test for whether a flag/flag_off
	option was non-default.  Also changed to generate a string that Unix
	Make will grok (except for FP/int values and new flags).

	* job.c (child_execute_job): Don't use the shell's -c option.
	Also fixed an off-by-one bug in the ARGV -> shell arg list copying.

Mon Sep 18 15:17:31 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.55.5.

	* read.c (parse_file_seq): Check the beginning of the file name for a
	`./', not the two chars after the end of the name (Q rather than P).

	* job.c (child_execute_job): Include all of ARGV in the arg list for
	the shell.

	* main.c (define_makeflags): Don't include floating and positive_int
	options in !PF.

	* job.c (exec_command): Set the effective gid to the real gid before
	execing.

	* job.c (child_execute_job): Don't clobber the arg list when execing
	the shell.

Sun Sep 17 15:27:19 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* main.c (define_makeflags): Moved all the checking inside the switch.

	* load.c [LDAV_BASED] (load_average): When we can't get the load
	average, return zero instead of running off the end.

	* file.c: Include variables.h.
	* job.c: Declare dup2 and {block,unblock}_remote_children.
	* file.h: Declare f_mtime.
	* job.c: Don't declare construct_command_argv, since job.h does.
	* function.c, main.c, load.c, remake.c: Include job.h.
	* load.c [LDAV_BASED] (load_average): Declare nlist.
	* variable.h: Declare print_file_variables.
	* job.c [!USG]: Don't declare sigsetmask.
	[!USG]: Declare getdtablesize.
	Don't declare load_average.  Do declare wait_to_start_job.
	Declare vfork, gete[gu]id, execve.
	* commands.c: Declare remote_kill, getpid.
	* make.h: Declare kill, exit, sigblock, pipe, close, ctime, open,
	lseek, read.
	* make.h [not USG]: Declare sigsetmask.
	* job.h: Declare wait_for_children and {block,unblock}_children.

	* dir.c (dir_file_exists_p): If FILENAME is nil, read in the whole
	directory.
	(find_directory): When we want to read in the whole directory, call
	dir_file_exists_p with nil instead of "".

	* file.h (struct file), job.h (struct child),
	  variable.h (struct variable): Use bitfields for flags.
	* make.h (ENUM_BITFIELD): If GCC or #ifdef ENUM_BITFIELDS, define as
	:BITS, else empty.
	* compatMakefile (defines): Document ENUM_BITFIELDS.

Sat Sep 16 12:38:58 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.55.4 (alpha).

	* GNUmakefile (dist): Depend on default and doc.

	* load.c [LDAV_BASED]: Include <nlist.h> rather than <a.out.h>; #ifdef
	NLIST_NAME_UNION, use n_un.n_name instead of n_name.
	* compatMakefile (LOAD_AVG): Document NLIST_NAME_UNION.

	* job.c [USG-ish]: Don't redefine WIF{SIGNALED,EXITED} if they're
	already defined.

Fri Sep 15 13:59:42 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* glob.c, dir.c [USGr3 or DIRENT]: If neither d_ino, nor d_fileno is
	defined, define d_ino as d_fileno.

Thu Sep 14 18:29:38 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* job.c: Don't declare exec_command static.

	* make.texinfo (Name Index): Changed title to include directives.

	* Version 3.55.3 (alpha).

	* make.texinfo (Running: Options): Document -e.

	* main.c (main): Always give imported environment variables origin
	`o_env'.
	* variable.c (define_variable_in_set): Under -e, if ORIGIN, or an
	existing variable's origin, is `o_env', make it `o_env_override'.

	* load.c: Use the symbol KERNEL_FILE_NAME instead of KERNEL_FILE.
	* compatMakefile: Changed the comment for `LOAD_AVG' accordinly.

Thu Sep  7 16:46:26 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.55.2 (alpha).

	* variable.c (print_variable_set), rule.c (print_rule_data_base),
	file.c (print_file_data_base): If NO_FLOAT is defined, don't use
	floating-point for printing statistics.
	* compatMakefile (defines): Document NO_FLOAT.

	* make.h (HASH): New macro to add the hashing value of one char to a
	variable.c.
	* file.c (lookup_file, enter_file, rename_file): Use it.
	* dir.c (find_directory, dir_file_exists_p, file_impossible_p): Ditto.
	* variable.c (define_variable_in_set, lookup_variable): Same here.

	* variable.c, file.c, dir.c: Don't define *_BUCKETS if they are already
	defined.

	* compatMakefile (defines): Added comment about defining NO_ARCHIVES.
	(ARCHIVES, ARCHIVES_SRC): New variables for {ar,arscan}.[oc].
	(objs, srcs): Use $(ARCHIVES) and $(ARCHIVES_SRC).
	* commands.c (set_file_variables), dir.c (file_exists_p),
	remake.c (touch_file, name_mtime), implicit.c (try_implicit_rule,
	pattern_search), make.h: If NO_ARCHIVES is #defined, don't do any
	archive stuff.

	* commands.c (set_file_variables): Don't kill the last char of
	directory names in $([@*<%?^]D).

Wed Sep  6 15:23:11 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* default.c (default_terminal_rules {%:: %,v}, {%:: RCS/%,v}): Don't
	run co if the target exists.

	* glob.c (glob_match): [!xyz], rather than [^xyz], means none of [xyz].

	* glob.c: Misc minor cosmetic changes.

Tue Sep  5 14:49:56 1989  Roland McGrath  (mcgrath at saffron.Berkeley.EDU)

	* load.c [LDAV_BASED] (load_average): Check for == -1, rather than < 0
	to see if lseek fails.  On some systems, `avenrun' is at an offset >
	(2**31)-1, and lseek succeeds, returning a negative value.

Mon Sep  4 11:07:58 1989  Roland McGrath  (mcgrath at saffron.Berkeley.EDU)

	* rule.c (new_pattern_rule): Return `int' instead of `void': nonzero if
	the passed rule was used, zero if not.
	(install_pattern_rule): Pay attention to the return from
	new_pattern_rule, and don't set the rule's `terminal' flag or give it
	commands unless it's used.
	(create_pattern_rule): Same idea.

	* dir.c (find_directory): Removed unused variable.

	* commands.c (execute_file_commands): Removed unused variable.

	* read.c (record_files): Don't use NAME after freeing it.

Sat Sep  2 00:33:19 1989  Roland McGrath  (mcgrath at saffron.Berkeley.EDU)

	* Version 3.55.1 (alpha).

	* function.c (string_glob): Don't add spaces after file names that
	aren't added.  (Also means don't add spaces without checking the size
	of the buffer.)

	* remake.c (update_goal_chain): Don't remove makefiles with cmds and no
	deps from the chain.
	* main.c (main): Do it here, before calling update_goal_chain.

	* remake.c (update_goal_chain): When updating fails, change STATUS even
	if MAKEFILES is set.  Also stop remaking when updating fails if not
	under -k and MAKEFILES is not set.

	* remake.c (remake_file, update_file_1, notice_finished_file),
	commands.c (execute_file_commands), make.h, commands.h: The functions
	remake_file, notice_finished_file, and execute_file_commands no longer
	return values, and their callers no longer expect values returned.

	* remake.c (notice_finished_file): Don't set FILE's modtime to now if
	it is a non-target with no commands.

Fri Sep  1 00:04:39 1989  Roland McGrath  (mcgrath at saffron.Berkeley.EDU)

	* read.c (read_all_makefiles): After freeing each element on MAKEFILES,
	replace it with the name stored in read_makefiles by read_makefile.

	* remake.c (update_file_1): Don't decide not to remake if FILE has no
	cmds and no deps actually changed if FILE doesn't have any deps.

	* file.c (remove_intermediate): Remove precious files that also have
	the `dontcare' flag set.

	* remake.c (update_file_1): Don't always remake if FILE has cmds but no
	deps; only if FILE is double-colon.  (I don't know why this should be
	done for double-colon targets, but that's what Unix make does.)

	* load.c [LDAV_BASED] (load_average): Write error messages if the
	various system calls fail.  Keep track of if we've failed before.
	The first time we fail, write a message saying -l won't be enforced.
	The first time we succeed after having failed, write a message saying
	-l will be enforced again.

	* remake.c [USG]: Don't #include <sys/file.h>

	* load.c [generic Unix LDAV_BASED]: #include <fcntl.h> #ifdef USG,
	else <sys/file.h> instead.

	* job.c [USG && !USGr3 && !HAVE_DUP2]: Remove redundant
	#include <errno.h> and declaration of `errno'.
	[...] (dup2): Fixed so it won't always lose.

	* default.c (default_suffix_rules: .texinfo.dvi): Copy, rather than
	move, the aux and index files, so the TeX run can use them.

	* compatMakefile: Remove redundant comment.

	* load.c [generic Unix LDAV_BASED]: Include <a.out.h> instead of
	<nlist.h>, since the `struct nlist' declaration in <nlist.h> varies
	more than the one in <a.out.h>.
	(load_average): Use the `n_un.n_name' field of the `struct nlist',
	since the <a.out.h> declaration uses the union.

	* main.c (main): For the temporary files made for stdin makefiles, set
	the `intermediate' and `dontcare' flags.
	* file.c (remove_intermediates): Don't print any messages for files
	whose `dontcare' flag is set.  (The only files that will be
	intermediate and `dontcare' will be the temporary files made for stdin
	makefiles.)

	* job.c (exec_command): Made global.
	* job.h: Declare it.
	* main.c (main): Use exec_command when re-execing.

	* make.h: Declare environ.
	* make.c: Don't.

	* job.c (child_execute_job): New function to perform everything done in
	the child side of a fork (for a job or `shell' function).
	(start_job): Call it.
	* job.h: Declare construct_command_argv and child_execute_job.
	* function.c (expand_function: `shell'): Use child_execute_job.

Thu Aug 31 18:42:51 1989  Roland McGrath  (mcgrath at saffron.Berkeley.EDU)

	* function.c (expand_function: `shell'): Remove a trailing newline
	instead of turning it into a space.

	* main.c (main): Do init_siglist #ifdef HAVE_SIGLIST.

	* job.c [WTERMSIG || (USG && !HAVE_SYS_WAIT)]: Test each W* macro
	separately and define all those that aren't defined.

Sat Aug 26 15:13:21 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* ar.c (ar_name): Return zero for `(foo)'.

	* Version 3.55.

	* make.texinfo (Rules: Multiple Targets): Make this node's `next'
	pointer point to `Static Pattern'.
	* make.texinfo (Makefiles: MAKEFILES Variable): Make this node's `prev'
	pointer point to `Makefile Names'.

	* make.1: Renamed to make.man.
	* compatMakefile: Define `mandir' and `manext'.
	(install): Depend on $(mandir)/make.$(manext).
	($(mandir)/make.$(manext)): Depend on make.man and copy it to $@.
	($(bindir)/make): Use `make' rather than $<; so Unix make can grok it.

Thu Aug 24 03:35:48 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* variable.c (target_environment): Allow variables that start with
	underscores.

Wed Aug 23 22:50:32 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* variable.c (target_environment): Reject variables that don't start
	with letters.

Tue Aug 22 04:14:29 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* GNUmakefile (make-$(version).tar.Z): Put make.1 (the Unix manual
	page) in the tar file.

	* variable.c (target_environment): Don't write variables with origin
	o_default (i.e., ones from default.c).
	* make.texinfo (Commands: Recursion: Variables/Recursion): Document
	that default variables are not put in the environment.

	* remake.c (update_file_1): Remake all targets with commands but no
	deps.

Sat Aug 19 06:03:16 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* remake.c (update_file_1): In the final loop, set the deps'
	`changed' members if they are newer than FILE.

	* remake.c (update_goal_chain): Under -d, print a message if we decide
	not to remake a makefile so as to avoid a possible infinite loop.

Fri Aug 18 20:30:14 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* remake.c (remake_file): Cleaned up.

	* commands.c (execute_file_commands): If the commands are empty, set
	FILE->update_status to zero before returning.

	* remake.c (notice_finished_file): Set `last_mtime' fields to zero
	instead of calling name_mtime; file_mtime will do that later if anybody
	cares.

Thu Aug 17 10:01:11 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* make.texinfo (Rules: Wildcards: Wildcard Examples): Give this node a
	`prev' pointer.

	* Version 3.54.9 (alpha).

	* make.texinfo: Fixed some @nodes.

	* remake.c (check_dep): Don't set *MUST_MAKE_PTR if FILE doesn't exist
	after running update_file.

	* remake.c (notice_finished_file): If FILE has no commands, pretend its
	modtime is now.

	* remake.c (update_file_1): In the loops that call update_file on the
	deps, compare modtimes before and after (unless deps are still being
	made) and set the deps' `changed' members.  Do not set the `changed'
	members in the loop that prints the newer/older debugging messages.
	* remake.c (update_file_1): If no deps changed and FILE has no
	commands, decide it doesn't need remaking.

	* remake.c (update_file_1): Print a debugging message if we take
	commands from default_file.

	* make.texinfo (Rules: Directory Search: Selective Search): Removed
	note about warning for `vpath' with a constant pathname, since it isn't
	warned about anymore.

	* remake.c (update_goal_chain): If MAKEFILES, remove makefiles which
	are targets and have no deps.
	* make.texinfo (Makefiles: Remaking Makefiles): Document that makefiles
	will not be remade if they are targets but have no dependencies.

Tue Aug 15 00:00:08 1989  Roland McGrath  (roland at apple-gunkies.ai.mit.edu)

	* remake.c (notice_finished_file): Increment files_remade for non-phony
	files if they didn't exist before (even if they still don't).

	* job.c: Include <errno.h> and declare errno.

	* job.c (exec_command): If the execve fails with ENOEXEC (Exec format
	error), return instead of exiting the child process.

	* job.c (start_job): In the child side, if exec_command fails, try
	using the shell.

	* job.c (start_job): In the child side, call unblock_children instead
	of sigsetmask.

	* remake.c (notice_finished_file): Under -n or -q, always increment
	files_remade for non-phony files.

	* rule.c (intall_pattern_rule): Use find_percent.

	* vpath.c (vpath_search): Pass the `percent' members to
	pattern_matches.

Mon Aug 14 23:30:24 1989  Roland McGrath  (roland at apple-gunkies.ai.mit.edu)

	* vpath.c (struct vpath): New member `percent', to hold a pointer into
	the pattern where the % is.
	(construct_vpath_list): Call find_percent on the pattern and set the
	new `percent' member.
	* read.c (read_makefile): Don't run find_percent on `vpath' directive
	patterns.

	* function.c (pattern_matches): Take new arg PERCENT, a pointer into
	PATTERN where the % is.  If PERCENT is nil, copy PATTERN into local
	space and run find_percent on it.
	(expand_function: `filter', `filter-out'): Pass new arg to
	pattern_matches.
	* read.c (record_files): Pass PATTERN_PERCENT to pattern_matches for
	static pattern rules.  Save the percent pointer into implicit rule
	targets, and pass them to create_pattern_rule.
	* rule.c (convert_to_pattern): Pass new arg to create_pattern_rule.
	(create_pattern_rule): Take new arg TARGET_PERCENTS, nil or an array of
	pointers into the corresponding elements of TARGETS, where the %s are.

Sun Aug 13 00:29:19 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.54.8.

	* README.templatate, README-doc.template: New files, turned into README
	and README-doc to go into the two distribution tar files.
	* GNUmakefile: Added a rule to edit the version number in
	README.template and README-doc.template, producing README and
	README-doc.

	* remake.c (update_goal_chain): If -n or -q is in effect for a
	makefile, and it got updated, don't change STATUS, so we can still
	return -1 (meaning nothing was done).  This avoids an infinite loop on
	"make -n Makefile".

Sat Aug 12 23:14:24 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* remake.c (notice_finished_file): Treat -q the same as -n.

	* remake.c (update_goal_chain): Fixed handling of return from
	update_file.  If -n or -q is in effect, ignore it.

	* job.c (start_job): Don't test for -t.  We should never get called in
	that case.

Fri Aug 11 04:09:14 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* function.c (expand_function): Removed unused variables.
	(handle_function): Removed unused variable.

	* main.c (main): Removed unused variable.

Wed Aug  9 09:37:10 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.54.7.

	* remake.c (notice_finished_file): If FILE's modtime actually changed,
	increment files_remade.
	(remake_file): Don't increment files_remade.

	* remake.c (update_file): Don't print "up to date" messages for
	phony files.

	* job.c (child_handler): Don't set C->file->update_status to 1 if
	start_job returns nonzero under -n or -t.

	* expand.c (variable_expand): Count parens in $(foo:a=b) refs.

	* main.c: Removed old declaration of `glob_tilde' (which hasn't existed
	for a few months).

Tue Aug  8 23:53:43 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* job.c (exec_command): Fixed to not ignore the last path component and
	to do the right thing with an empty path.

Fri Aug  4 15:58:19 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* remake.c (library_file_mtime): Look for libLIB.a, not /libLIB.a.
	Do VPATH search on libLIB.a, not /usr/lib/libLIB.a

Thu Aug  3 20:42:00 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* job.c [HAVE_SYS_WAIT or not USG]: If WIFSIGNALED is not defined by
	<sys/wait.h>, define it as (WTERMSIG != 0).

Tue Aug  1 19:25:34 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* remake.c (remake_file): If FILE has no commands and is a target,
	don't set its time to now.  The time gets reset by notice_finished_file
	anyway, and it isn't needed since check_dep checks for nonexistence.

	* Version 3.54.6.

	* read.c (read_makefile): Don't read off the end of the string after an
	`include'.

	* job.c (exec_command): New function to search the path for a file and
	execute it.
	(start_job): Use exec_command rather than execvp.

	* read.c (read_makefile): Expand `include' directive args before
	parsing them.  Allow trailing whitespace after filename.

	* variable.c (target_environment): Put makelevel + 1, rather than
	makelevel, in the `MAKELEVEL' envariable.

Sat Jul 29 10:27:04 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* remake.c (notice_finished_file): Don't get the new modtime of phony
	files.

	* remake.c (remake_file): Run commands instead of touching under -t if
	FILE->cmds->any_recurse is set.

	* commands.h (struct commands): Add new member `any_recurse', to be set
	nonzero if any `lines_recurse' element is nonzero.
	* commands.c (chop_commands): Set the `any_recurse' member.

	* commands.c (execute_file_commands): Split chopping of commands into
	lines into new function chop_commands.
	* commands.h: Declare chop_commands.

	* read.c (read_makefile): Test for a line beginning with a tab after
	checking for conditional lines, but before all other checks.

Fri Jul 28 18:10:29 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* read.c (read_makefile): Match directives against collapsed line
	and use that for their args.

	* read.c (read_makefile): Warn about extra text after `include'.

Tue Jul 25 14:34:25 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* make.texinfo (Rules: Directory Search: Selective Search): Fixed
	example to use correct `vpath' syntax.

Mon Jul 24 12:10:58 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.54.5.

	* job.c (start_job): In the child side, unblock SIGCHLD.

Fri Jul 21 18:25:59 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* make.h: Don't include <sys/types.h> #ifdef sun.

Mon Jul 17 14:29:10 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* implicit.c (pattern_search): If ar_name (FILENAME), don't check for
	directory names.

	* job.c (wait_for_children): Changed "waiting for children" message to
	"waiting for unfinished jobs".

Fri Jul 14 13:17:13 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* load.c (load_average): Use an unsigned offset into kmem.

Thu Jul 13 18:44:49 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* variable.c (pop_variable_scope): Don't free the head of the chain of
	variables in each bucket twice.

Tue Jul 11 06:45:24 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* GNUmakefile: Include COPYING in the doc tar file.

	* variable.c, read.c, misc.c, job.c, function.c: Replace some identical
	"for" loops with next_token or end_of_token calls.

Mon Jul 10 16:55:08 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.54.4.

	* compatMakefile: Documented new conditionals.

	* job.c: Don't define sys_siglist if HAVE_SIGLIST is defined.
	Don't define dup2 if HAVE_DUP2 is defined.

	* job.c (child_handler): Interpret the return from start_job correctly.

	* remake.c (update_file_1): Don't write "target not remade because of
	errors" message under -n or -q.

	* read.c: Declare getpwnam.

	* glob.c: Use <dirent.h> if DIRENT is defined.
	[USG]: Don't declare memcpy, since <memory.h> does.

Fri Jul  7 20:53:13 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* misc.c (collapse_line): Copy the line over in the right place.

Fri Jul  7 18:33:24 1989  Roland McGrath    (fsf at void.ai.mit.edu)

	* remake.c: Conditionalize inclusion of <sys/file.h> on not
	USG, since HP-UX defines a `struct file' there.

Fri Jul  7 12:11:30 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* job.c: If WTERMSIG is defined by <sys/wait.h>, define WAIT_T as int,
	and don't define other macros; this covers HP-UX.
	If WTERMSIG is not defined, use int or union wait based on USG and
	HAVE_SYS_WAIT; this covers BSD and SysV.

	* Version 3.54.3 (alpha).

	* job.c [USG and not USGr3]: Include <errno.h> and declare errno.

	* job.c (unblock_children [USG]): Declare child_handler.

	* job.c: Renamed WRETCODE to WEXITSTATUS.
	[HAVE_SYS_WAIT or not USG]: Undefine WTERMSIG, WCOREDUMP, and
	WEXITSTATUS before defining them.  The HP-UX <sys/wait.h> defines them.

	* main.c (main): If there are no goals, fatal AFTER printing the data
	base under -p.

Thu Jul  6 22:43:33 1989  Roland McGrath  (roland at apple-gunkies.ai.mit.edu)

	* glob.c [USG]: #define rindex as strrchr.

	* job.c [USG]: Include <sys/param.h> and #define getdtablesize() as
	NOFILE.

Wed Jul  5 09:36:00 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.54.2 (alpha).

	* expand.c (variable_expand): When expanding recursive variable
	references (${${a}}), use the correct delimiters in the constructed
	variable reference.

Mon Jul  3 18:29:26 1989  Roland McGrath  (roland at apple-gunkies.ai.mit.edu)

	* compatMakefile: Clear out and redefine the .SUFFIXES list because
	silly Sun 4 make defines .cps.h.

	* compatMakefile: Fix comment about -DNO_MINUS_C_MINUS_O.

	* remake.c: Include <sys/file.h> for O_* on 4.2.

	* commands.c: Define sigmask if it's not defined.

Fri Jun 30 07:33:08 1989  Roland McGrath  (roland at apple-gunkies.ai.mit.edu)

	* remake.c (remake_file): Don't always increment files_remade.

	* variable.c (push_new_variable_scope): Zero the new variable hash
	table.

Thu Jun 29 17:14:32 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* expand.c (variable_expand): When terminating the variable expansion
	buffer, use variable_buffer_output instead of a simply zero store,
	because the buffer may need to be enlarged.

Wed Jun 28 16:53:47 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.54.

	* default.c (default_suffixes): Added `.ln'.
	(default_suffix_rules): Changed lint rules to use -C.

Thu Jun 22 20:49:35 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* job.c (start_job): Set `environ' to CHILD->environment before execing
	in the child process!

Tue Jun 20 17:23:13 1989  Roland McGrath  (roland at spiff.ai.mit.edu)

	* compatMakefile: Put job.h and rule.h in `srcs'.

	* Version 3.53.

Mon Jun 19 16:25:18 1989  Roland McGrath  (roland at spiff.ai.mit.edu)

	* job.c (start_job): If there are no more commands, return nonzero
	under -n or -t.

	* compatMakefile (make): Pass `-f' to mv.

	* GNUmakefile: If `ARCH' or `machine' is defined, make $(ARCH)/*.o and
	$(ARCH)/make instead of *.o and make.

	* function.c (string_glob): Don't try to use freed storage!

	* read.c (readline): If there is only one byte of space in the buffer,
	enlarge the buffer before reading more.

	* arscan.c [M_XENIX]: Miscellaneous minor changes for Xenix.

Sun Jun 18 13:07:45 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* GNUmakefile (depend): Split commands into two lines so they won't be
	so long when variable-expanded.

	* compatMakefile: Documented MINUS_C_MINUS_O meaning.  The line
	describing it got removed when the USG/wait stuff was documented.

Sat Jun 17 22:56:54 1989  Roland McGrath  (roland at hobbes.ai.mit.edu)

	* Version 3.52.

Mon Jun 12 17:45:11 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* remake.c (check_dep): Drop circular dependencies instead of fataling.
	(update_file_1 already does this.)

	* default.c (default_suffix_rules): For .s -> .o, put the -o flag to
	the assembler before the source file name.

Sun Jun 11 12:00:52 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.51.

	* make.texinfo (Features): Noted 1003.2 requirement of `+' meaning.

	* file.c (remove_intermediates): If !SIG, write a single "rm" command
	line, listing all files.

	* read.c (read_makefile): Don't free the storage for the passed
	filename, since it might not be malloc'd.  When doing an included
	makefile, free the name's storage.
	(read_all_makefiles): Use variable_expand to find the value of
	`MAKEFILES'.  Free the storage for the names of -f makefiles.
	(read_makefile): Allocate storage for the makefile name in the
	`struct file' in read_makefiles.

	* make.texinfo (Running: Instead of Execution): Document the effect of
	+ and $(MAKE)/${MAKE}.

	* make.texinfo (Functions: Foreach Function): Document that if the
	iteration variable was undefined before the `foreach' call, it will be
	undefined after the call.

	* commands.c: Split into commands.c, job.h, and job.c.

	* rule.c (try_implicit_rule, pattern_search): Moved to new file
	implicit.c.

	* rule.c: Split into rule.h, rule.c, and default.c.
	* default.c (install_default_pattern_rules): Renamed to
	install_default_implicit_rules.
	* make.h, main.c (main): Renamed uses.

	* make.c: Renamed to misc.c.

	* make.c (main, log_working_directory, decode_switches,
	decode_env_switches, define_makeflags, die, print_version,
	print_data_base): Moved to new file main.c.

	* commands.c (execute_file_commands): Don't collapse backslash-newlines
	here.  When chopping the commands up into lines, don't chop at
	backslash-newlines.
	(start_job): Collapse backslash-newlines after printing the line.

	* commands.c (start_job): Don't collapse backslash-newlines here.
	(execute_file_commands): Collapse backslash-newlines before chopping
	the commands up into lines.

	* commands.c (set_file_variables): Initialize the length counters for
	$^ and $? to zero!

	* commands.c (start_job): Use vfork instead of fork.  Someone else says
	the child and parent DO have separate file descriptors.

	* variable.c: Split internals into variable.c, function expansion into
	function.c, and variable expansion into expand.c.
	* function.c (handle_function): New function to check for a function
	invocation and expand it.
	* expand.c (variable_expand): Use handle_function.
	* variable.c (push_new_variable_scope): New function to push a new
	empty variable set onto the current setlist.
	(pop_variable_scope): New function to pop the topmost set from the
	current setlist and free its storage.
	* function.c (expand_function: `foreach'): Push a new variable scope
	for the iteration variable and pop the scope when finished.
	* variable.h: Declare new functions.
	* variable.c (initialize_variable_output): New function to return a
	pointer to the beginning of the output buffer.
	(save_variable_output): New function to save the variable output state.
	(restore_variable_output): New function to restore it.
	* expand.c (variable_expand): Use initialize_variable_output.
	(allocated_variable_expand): Use {save,restore}_variable_output.
	* variable.c (current_setlist): Renamed to current_variable_set_list
	and made global.

Sat Jun 10 00:11:25 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* remake.c (library_file_mtime): Check for libNAME.a in the current
	directory before doing VPATH search.

	* variable.c (print_variable_set): Don't write "# Variables", and write
	fewer blank lines.
	(print_variable_data_base): Precede the variables with "# Variables".

	* make.c (main): Print the data base under -p after doing everything
	else, just before exitting.  This way it gets info determined in
	updating the goal targets.

	* variable.c (print_variable_data_base): Split into print_variable,
	which prints one variable, and print_variable_set, which prints a set.
	Replaced with a call to print_variable_set for the global set.
	(print_file_variables): New function to print a given file's local
	variables.

	* file.c (print_file_data_base): Call print_file_variables to print
	each file's local variables.

	* commands.c (set_file_variables): Actually define the values for
	the $^ and $? variables!!!

	* make.texinfo (Implicit: Pattern Rules: Automatic): Document new D and
	F versions of $^ and $?.

	* commands.c (start_job): In the child fork, use getdtablesize and a
	loop to close all file descriptors other than 0, 1, and 2.  We need to
	do this since not only the bad stdin pipe, but also some directories,
	may be open.

	* commands.c (start_job): Use fork instead of vfork, because a vfork
	parent and child share file descriptors, and our child needs to diddle
	with stdin.

	* variable.c (initialize_file_variables): When created a new variable
	set, zero out the hash table.

	* variable.c (target_environment): Don't use variables whose names are
	not made up of alphanumerics and underscores.

	* remake.c (update_file_1): Set the `parent' member of each dependency
	to FILE before updating it.

	* file.h (struct file): Add `parent' member.

	* variable.c (initialize_file_variables): Don't take second arg PARENT.
	Use FILE->parent instead.  If FILE->parent->variables is nil, recurse
	to initialize it.

	* variable.h: Declare {allocated_}variable_expand_for_file.

	* variable.c (allocated_variable_expand): Now
	allocated_variable_expand_for_file, calling variable_expand_for_file,
	and taking second arg FILE.
	(allocated_variable_expand): New function, a wrapper around
	allocated_variable_expand_for_file, passing a nil second arg.

Fri Jun  9 12:11:45 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (start_job): On the child side of the fork, always close
	the bad stdin file descriptor.

	* commands.c (struct child): New member `environment', to hold the
	environment for the child.
	(execute_file_commands): Set the new childs `environment' member to nil
	before calling start_job.
	(start_job): Set up CHILD->environment before running the commands if
	it is nil.

	* make.c (main): Don't call new_environ.  `shell' functions will now be
	run with the environment make was called with.

	* commands.c (child_handler): Don't check C->command_ptr before calling
	start_job since we now have to check C->file->cmds->command_lines and
	it's easier to let start_job handle all that.

	* commands.c (struct child): New member `command_line', to hold an
	index into file->cmds->command_lines.
	(execute_file_commands): Set the new child's `command_line' to 0 and
	its `commands' and `commands_ptr' to nil.
	(start_job): When CHILD->command_ptr runs out, increment
	CHILD->command_line and run the corresponding line from
	CHILD->file->cmds->command_lines.  Run it even under -t, -q, or -n if
	the CHILD->file->cmds->lines_recurse element for that line is set.

	* commands.c (execute_file_commands): Chop CMDS up into lines, setting
	its `command_lines' and `lines_recurse' members, if it wasn't already
	chopped.

	* commands.h (struct commands): New members `command_lines' and
	`lines_recurse'.  The first is an array of chopped-up lines; the second
	is an array of flags, each nonzero if the corresponding line is
	recursive.

	* variable.c (variable_expand_for_file): If FILE is nil, just do a
	vanilla variable_expand.
	(expand_function: `shell'): Pass second arg (as nil) to
	construct_command_argv.

	* commands.c (construct_command_argv): Use variable_expand_for_file on
	`$(SHELL)' and `$(IFS)' instead of lookup_variable to check those
	variables.  This handles file-local and recursive values correctly.
	To support this, take an additional argument FILE.

	* variable.c (initialize_file_variables): New function to initialize
	FILE's variable set list from PARENT's setlist.  PARENT is the
	immediate dependent that caused FILE to be remade, or nil if FILE is a
	goal.  (When user-level per-file variables are implemented, PARENT
	should be passed as nil when defining per-file variables.)

	* variable.c (variable_expand_for_file): New function to expand a line
	using the variable set of a given file, and reporting error messages
	for the file and line number of that file's commands.

	* variable.h: Don't declare lookup_variable_for_file.

	* variable.c (lookup_variable_*): Turned back into lookup_variable.  It
	now uses current_setlist.
	(global_setlist): New static `struct variable_set_list', a setlist
	containing global_variable_set.
	(current_setlist): New static `struct variable_set_list *', a pointer
	to the current variable set list.
	(define_variable): Define in the current top-level set, not the global
	set.

	* commands.c (set_file_variables): New function to set up the automatic
	variables for a file in its own variable set.
	(execute_file_commands): Use set_file_variables.

	* variable.c (new_environ): Replaced with target_environment, taking an
	argument FILE, and returning an environment for FILE's commands.

	* variable.c, variable.h: Remove all global special variable pointers.

	* variable.c (define_variable_for_file): New function like
	define_variable, but takes additional arg FILE, and defines the
	variable in the variable set at the top of FILE's chain.
	(lookup_variable_for_file): New function like lookup_variable, but
	takes additional arg FILE, and looks the variable up in all of FILE's
	variable sets.

	* file.h (struct file): New member `variables', a `struct
	variable_set_list' containing the list of variable sets used in the
	expansion of the file's commands.

	* variable.c (variables): Replaced with static `struct variable_set'
	global_variable_set.
	(define_variable): Now define_variable_in_set, taking additional
	argument SET, the `struct variable_set' to define it in.
	(define_variable): Use define_variable_in_set with global_variable_set.
	(lookup_variable): Now lookup_variable_in_set, taking additional
	argument SET, the `struct variable_set' to look it up in.
	(lookup_variable): Use lookup_variable_in_set with global_variable_set.
	(lookup_variable_in_setlist): New function to look up a variable in a
	`struct variable_set_list' using lookup_variable_in_set.

	* variable.h (struct variable_set): New structure, containing a hash
	table and the number of hash buckets.
	(struct variable_set_list): New structure, containing a link for a
	linked-list, and a `struct variable_set'.

	* commands.c (start_job): Under -n, return what the recursive start_job
	call returns, since it might actually start a child.

	* make.texinfo (Rules: Wildcards): Document ~ and ~USER expansion.

	* commands.c (execute_file_commands): If start_job returns
	failure, but -t is set, set FILE->update_status to success.
	(start_job): If -t is set, and the commands are not recursive, return
	failure (is is done for -q).

	* remake.c (touch_file): New function to touch FILE.
	(remake_file): Use touch_file.  When touching a file, still do
	execute_file_commands.

	* remake.c (remake_file): Don't check question_flag (-q), since we
	can't know here if the commands are recursive.

	* commands.c (start_job): Don't use the `recursive' member of
	CHILD->file->cmds.  Instead, check for leading +s and $(MAKE) or
	${MAKE} in the command line here.

	* commands.h (struct commands): Remove `recursive' member.

	* rule.c (install_default_pattern_rules): Remove use of `recursive'
	member.

	* read.c (record_files): Don't check commands from $(MAKE) and set
	their `recursive' member.

	* commands.c (fatal_error_signal): Treat SIGQUIT like SIGINT, SIGHUP,
	and SIGTERM, but don't send it to ourselves because it will cause a
	core dump.

Thu Jun  8 20:30:04 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.50.

	* variable.c (variable_expand): Use allocated_variable_expand instead
	of expand_argument in a few places.

	* variable.c (allocated_variable_expand): Do static variable shuffling
	here instead of using expand_argument.
	(expand_argument): Use allocated_variable_expand.

	* variable.c (recursively_expand): New function to recursively expand
	its argument (a `struct variable'), returning the malloc'd value.
	(variable_expand): Use recursively_expand.

Sun May 28 12:49:27 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (main): Fixed buggy fix in deciding to increase space for
	command-line variable definitions.  (First it never did it, then it
	always did it; now it does it when necessary.)

Sat May 27 14:01:54 1989  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* make.c (main): Fixed bug in deciding to increase space for
	command-line variable definitions.

Fri May 26 15:48:01 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* read.c (multi_glob): Use allocated_expand_variable for checking
	`HOME' variable for ~ expansion, since this may be called from inside a
	`wildcard' function expansion.

	* variable.h: Declare allocated_expand_variable.

	* variable.c (allocated_expand_variable): New function to do variable
	expansion in an allocated buffer, rather than the static one.

	* make.c (main): Don't set glob_tilde (it no longer exists).

	* variable.c (string_glob): Use multi_glob and parse_file_seq.

	* read.c (multi_glob): Do ~ expansion here.

	* glob.c (glob_tilde, glob_filename): Removed ~ expansion.

	* variable.c (define_variable, lookup_variable): Use a smarter hashing
	algorithm (the same one used for files and directories).
	(VARIABLE_BUCKETS): Increased to 523.

	* file.c (enter_file, lookup_file, rename_file): Use a smarter hashing
	algorithm, spreading the bits about somewhat.

	* make.c (log_working_directory): Under `-p', precede the directory
	message with a `#'.

	* make.c (print_version): Under `-p', precede each line with a `#'.
	(print_data_base): Precede the header line with a `#' and include the
	date and time on it.

	* vpath.c (print_vpath_data_base): Precede non-directive
	lines with `#'s.

	* commands.c (print_commands): Precede the non-command line with a `#'.

	* rule.c (print_rule_data_base), file.c (print_file_data_base): Precede
	non-rule lines with `#'s.

	* dir.c (print_dir_data_base): Precede all lines with `#'s.

	* variable.c (print_variable_data_base): Changed format so that it can
	be makefile input.  Lines that are not variable definitions are
	preceded with `#'.  Nonrecursive variable definitions are made with all
	dollar signs doubled to reproduce the initial value.  Recursive
	variable definitions containing newlines are done with `define'
	directives.  Nonrecursive variable definitions containing newlines, and
	variable names containing :, =, or newlines, will come out garbled.

Wed May 24 00:20:04 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.49.

Tue May 23 19:18:00 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* variable.c (expand_function: `filter'/`filter-out'): Use
	find_percent instead of pattern_p.

	* variable.c (expand_function: `patsubst'): Pass new args (both nil)
	to patsubst_expand.
	(variable_expand): For $(var:pat%=rep%) references, pass new args to
	patsubst_expand so as to avoid find_percent and thus disallow
	quoting the %s.

	* read.c (record_files): Pass new args to patsubst_expand.

	* variable.c (patsubst_expand): Take two new args: PATTERN_PERCENT
	and REPLACE_PERCENT.  Each of these, if non-nil, means that PATTERN
	(or REPLACE) has already been run through find_percent, and
	PATTERN_PERCENT (or REPLACE_PERCENT) is the result.

	* make.h: Declare find_percent instead of pattern_p.

	* read.c (pattern_p): Changed to find_percent, returning a pointer
	to the %, or nil if there is none.
	(record_files): Take another arg, PATTERN_PERCENT, a pointer to the
	% in PATTERN.
	(read_makefile): Pass PATTERN_PERCENT to record_files.

	* make.texinfo (Rules: Static Pattern: Static Usage,
	Rules: Directory Search: Selective Search,
	Functions: Text Functions): Documented that `%' can be quoted.

	* variable.c (expand_function: `filter'/`filter-out'): Use pattern_p
	to allow quoted %s in patterns.

	* variable.c (patsubst_expand): Use pattern_p on PATTERN and REPLACE
	to allow quoted %s.  Quoting backslashes are removed from REPLACE
	even if PATTERN contains no unquoted %.

	* read.c (pattern_p): Made global.
	* make.h: Declare pattern_p.

	* read.c (pattern_p): New function to search for an unquoted % in a
	string.  Backslashes quote %s and backslashes.  Quoting backslashes
	are removed from the string by compacting it into itself.  Returns
	nonzero if an unquoted % was found, zero if not.
	(record_files): Use pattern_p to check for implicit rules.
	(read_makefile): Use pattern_p to check for static pattern rules.
	Also use it to allow quoted %s in `vpath' patterns; warn about
	`vpath' patterns with no %s.

Mon May 22 16:31:52 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* glob.c (glob_filename): Replace a `1' with the `l' that should
	have been there.  This incidentally stops it from dumping core.

	* glob.c (glob_filename): If the path is just a directory, with no
	file name pattern, return the directory alone.

	* glob.c (glob_tilde): New global variable (int), defaults to zero.
	(glob_filename): If glob_tilde is nonzero, expand ~ or ~USER.

	* variable.c (string_glob): Keep a static allocated buffer for file
	names taken from the list, instead of allocating and freeing one
	every time.

Fri May 19 18:06:26 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.c (decode_switches): Get floating numbers from the right string.

Sun May 14 13:48:04 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* commands.c (delete_child_targets): When deleting `also_make'
	files, include the target's name in the message:
		make: *** [foo] Deleting file `bar'

Sat May 13 17:34:26 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (max_load_average, default_load_average): Default to -1.

	* load.c (wait_to_start_job): Return if max_load_average is < 0.0,
	not equal.

Fri May 12 16:08:05 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* variable.c (variable_buffer_output): Don't try to do pointer
	arithmetic between objects not in the same array.

Wed May 10 15:55:29 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* rule.c [M_XENIX] (default_suffix_rules, default_variables): Minor
	changes to allow for strange compiler syntax.

	* rule.c (default_variables): Don't include "> $@" in
	$(PREPROCESS.S), since it's already in the .S.s rule.

	* file.c (enter_file): Make a new double-colon file the `prev'
	member of the bottom `prev' file (the one whose `prev' is nil).

	* read.c (do_define): Append newlines after copying the lines into
	the value buffer, so we end up with a trailing newline.

	* make.c (print_version): If the global variable
	`remote_description' is not nil or "", append "-%s" (its value) to
	the version number.
	* remote-*.c: Define remote_description appropriately.

Sun May  7 15:15:53 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (error_status): Converted to new function child_error,
	taking new arguments TARGET_NAME and IGNORED, and writing an error
	message: "*** [target] Error 1" (or signal #, etc.), appending
	" (ignored)" if IGNORED is nonzero.
	(child_handler): Use child_error instead of error_status.

	* compatMakefile (all): Don't depend on `doc'.

	* compatMakefile (clean): Don't remove make-info*.
	(realclean): New rule, depends on `clean', removes tags, TAGS,
	and all Info and TeX files.

Thu May  4 17:00:46 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* variable.c (print_variable_data_base), file.c
	(print_file_data_base), rule.c (print_rule_data_base),
	Use floating-point for averages and percentages.

	* make.c (print_data_base): Print messages before and after the data
	base information.

	* commands.c (print_commands): Changed output format to separate
	lines in commands and prefix them with tabs.

	* dir.c (print_dir_data_base): Changed output format slightly.

	* vpath.c (struct vpath, construct_vpath_list,
	selective_vpath_search): Remove the `exists' member and its uses.

	* vpath.c (print_vpath_data_base): New function to print all
	selective and general VPATH search paths (for -p).

	* make.c (print_data_base): Call print_vpath_data_base.

	* file.c (print_file_data_base): Changed format to look more like a
	makefile rule.  Now reports all information in the `struct file'.

	* rule.c (print_rule_data_base): Changed format of display from:
	  %: (terminal)
	   depends on: RCS/%,v
	to:
	  %: RCS/%,v
	    is terminal.
	    references nonexistent subdirectory.
	Also include number and percent that refer to nonexistent
	subdirectories.

Thu Apr 27 15:45:40 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.c (main): Figure out the level of recursion before writing
	the `Entering directory' message.
	* variable.c (define_automatic_variables): Don't figure out the
	level of recursion from `MAKELEVEL'.  It's now done in main.

	* Version 3.48.

Wed Apr 26 16:39:17 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (child_handler): Set `update_status' to zero when there
	are no more commands.

	* make.c (log_working_directory): If MAKELEVEL > 0, indicate the
	recurson in the message (make[1]: ...).

	* commands.c (child_handler): Change status to `cs_finished' when
	commands fail.

	* commands.c (start_job): Return 0 (success) if there were no more
	commands for the child.
	(child_handler): Change the status to `cs_finished' when start_job
	fails to start the commands.

	* make.c (main): Don't handle SIGEMT if it's not defined.
	Do handle SIGDANGER if it is defined.

	* commands.c (child_handler): Reorganized inner loop so that it
	doesn't try to inspect the child before finding it.

Tue Apr 25 16:28:24 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.c (end_of_token): Fixed bug wherein backslashes caused
	immediate return.

	* Version 3.47.

	* make.texinfo (Implicit: Pattern Rules: Automatic): Document
	setting of `$*' for explicit rules.  Add note clarifying that
	automatic variables, though referred to in the documentation as
	`$<', etc. are no different than `$(<)', etc.

Fri Apr 21 18:00:12 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* file.c (enter_file): Don't strip leading `./'s.

	* read.c (parse_file_seq): Strip leading `./'s.

Thu Apr 13 17:26:41 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.texinfo (Commands: Parallel, Running: Options): Document that
	-l with no argument removes a previous load limit.

	* make.c (struct command_switch): New member `default_value'.
	(default_job_slots): Default value (of 1) for -j.
	(default_load_average): Default value (of 0, unlimited) for -l.
	(command_switches): Use default values for -j and -l.
	Also, -l without an arg now means no load limit.
	(define_makeflags): Don't write positive_int or floating options
	whose values are their defaults.

	* make.c (main): Under -w, write a `Leaving directory' message
	before re-execing.

Tue Apr 11 16:46:29 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.46.

	* Makefile: Provide an easy place for system-specific definitions
	(-DUSG, etc.) and extra object files (for whatever).

	* make.texinfo: Miscellaneous fixes from RMS.

Mon Apr 10 19:31:34 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* rule.c (pattern_search): Put rules with `subdir' flags set in
	TRYRULES, since these might be valid with VPATHs.  In the TRYRULES
	loop, don't do lookup_file or file_exists_p calls for dependencies
	of rules with `subdir' flags set, but still do vpath_search calls
	and intermediate-file searches.

Thu Apr  6 16:33:00 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.texinfo (Implicit: Pattern Rules: Automatic): Document the
	new definition of $* for explicit rules.

	* commands.c (execute_file_commands): If FILE->stem is nil, figure
	out if FILE->name ends in a suffix in the .SUFFIXES list; if so,
	store the name sans suffix in FILE->stem (and $*).

Wed Apr  5 15:24:48 1989  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* file.c (remove_intermediates): Don't use `file_exists_p' to check
	for the existence of intermediate files, because the hashed
	directories will probably be out of date.

	* commands.c (child_handler): Free the good stdin before running the
	next command line.

	* commands.c [USG] (init_siglist): Don't case SIGEMT if it's not
	defined.  Do case SIGDANGER (for IBM RT) if it is defined.

	* commands.c: Changed `SYS_WAIT' to `HAVE_SYS_WAIT'.
	(child_handler): Use `wait3' if HAVE_SYS_WAIT is #defined.

	* file.c (enter_file): If any `./'s are stripped off, allocate a new
	copy of the shortened name.

	* rule.c (pattern_search): Allocate the right length strings for
	`also_make' members.

Sat Apr  1 13:28:38 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.45.

	* GNUmakefile: Make a separate tarfile of the DVI and info files.

	* make.c (define_makeflags): If a switch that takes an argument has
	its default value, put the switch in MAKEFLAGS with no arguments.

	* make.c (command_switches): Pass `-l' in MAKEFLAGS.

Wed Mar 29 17:50:05 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* GNUmakefile: Don't include the DVI and info files in the dist.

	* commands.c (child_handler): Don't call
	check_changed_{directories,vpaths}.

	* make.h: Don't declare check_changed_{directories,vpaths}.

	* vpath.c (check_changed_vpaths): Removed this function.

	* dir.c (struct directory): Remove `modtime' member.
	(find_directory): Don't set `modtime' member.
	(check_changed_directories): Removed this function.

	* remake.c (update_file_1): Set FILE->command_state to cs_finished
	if it didn't need to be remade.

	* remake.c (update_file): Only write the "up to date" message if the
	target went from `not_started' state to `finished' state without
	incrementing the count of files remade.

	* commands.c [USG] (init_siglist): If both SIGCHLD and SIGCLD are
	defined, don't put them both in the `switch'.

Tue Mar 28 15:37:02 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* file.c (rename_file): Change FILE's name!!!

	* rule.c (create_pattern_rule): Set the `terminal' member of the new
	rule after calling new_pattern_rule, which zeros it.

	* rule.c (default_variables): Use $(C++) in $(COMPILE.cc)!

Sun Mar 26 15:52:30 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Makefile: Added a `clean' target.

Fri Mar 24 15:08:46 1989  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* Version 3.44.

	* file.c (rename_file): If a `struct file' for the renamed-to name
	exists, and it is a target or has deps or commands, barf.
	If not just remove the old one for put in the new one.

	* remake.c (update_file_1, check_dep): Changed it back so that equal
	modtimes to NOT make dependencies be considered newer.  RCS checks
	out files with equal modtimes as the RCS files, so this screws it.

	* make.h, glob.c: If __GNUC__ is defined, use __builtin_alloca.

	* Makefile: Use variables `ALLOCA' and `ALLOCASRC' so systems
	without a good standard alloca can get it from the Emacs
	distribution (or somewhere).

	* dir.c: Don't include <sys/stat.h>, since make.h does.

	* make.c: Removed debugging version of getwd.

Thu Mar 23 16:16:27 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.43.

	* remake.c (update_file_1): If a dependency loop is found, don't
	fatal.  Emit an error message and remove the dependency.

	* remake.c (library_file_mtime): Fixed to use the right names.
	(update_file_1, check_dep): Consider a dependency "newer" than its
	dependent if they have the same modification time.

Wed Mar 22 19:31:35 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* file.c (remove_intermediates): Don't try to remove nonexistent files.

Mon Mar 20 10:21:22 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.42.

	* rule.c (default_variables): Set F77 to $(FC) and F77FLAGS to
	$(FFLAGS) so explicit rules expecting these (which are in System V)
	will work.  However, there is no way to make setting these affect
	the implicit rules, unless we trash FC and FFLAGS (which BSD uses).
	[USG]: Set GET to `get' rather than `/usr/sccs/get'.

Sun Mar 19 20:00:27 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* vpath.c (construct_vpath_list): Don't replace VPATH[ELEM] with
	dir_name (V), because the latter may get freed.

Sat Mar 18 15:01:39 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.41.

	* make.texinfo: Cleaned-up edition 0.1 Beta from RMS and Bob Chassell.

	* file.c (rename_file): If a file with the new name already existed,
	use the same storage space, after freeing the old file's name, deps,
	and `also_make' member, preserving the link in the chain.
	Also write an error message telling the user to report the incident;
	I don't think this should be able to happen, but I'm not sure.

	* file.c (rename_file): Don't add the hash values of the old and new
	names together!  Reset HASHVAL before computing the second value.

	* dir.c (check_changed_directories): Zero the new file hash table
	after allocating it.

	* dir.c (dir_file_exists_p): If FILENAME is "", return 1 if the
	directory exists.

	* vpath.c (check_changed_vpaths): New function to run through the
	search paths of all VPATHs, making the `exists' members correspond
	to reality.

	* commands.c (child_handler): Call check_changed_vpaths.

	* make.h: Declare check_changed_vpaths.

	* vpath.c (struct vpath): New element `exists', an array of char
	flags; exists[N] is nonzero if searchpath[N] exists.
	(construct_vpath_list): Set the `exists' member.
	(selective_vpath_search): Don't search directories whose `exists'
	elements are zero.

	* read.c (read_makefile): Set the `dontcare' flag of makefiles
	from the MAKEFILES variable if they were not mentioned anywhere but
	in the MAKEFILES variable.

	* read.c (read_makefile): Don't write an error message if fopen
	fails for a makefile from the MAKEFILES variable.

	* dir.c (struct directory): Add `modtime' member to record the
	modification time of the directory when it was opened.
	(check_changed_directories): New function to check all known
	directories; if their modtimes have changed since they were opened,
	their file tables are cleared and they are reset to be read in.

	* commands.c (child_handler): Call check_changed_directories before
	returning.
	make.h: Declare check_changed_directories.

Tue Mar 14 20:07:13 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.40.

	* make.c (print_version): Made the copyright say 1988, 1989.

	* read.c (read_all_makefiles): Don't set *MAKEFILES to the name of
	the end of the read_makefiles chain, since the latter may be from an
	included makefile.  (Why did I do this before?)

	* make.c (main): Set argv[0] to "" if it was nil.  Don't put the
	command-line variable definitions into argv[0], only into the MAKE
	variable!

Sun Mar  5 20:44:08 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* ar.c (ar_member_date, ar_touch): Remove the trailing ) from the
	member name.

Fri Mar  3 18:15:15 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (construct_command_argv): Initialize NEW_ARGV to 0.  At
	`slow' label, if NEW_ARGV is not 0, free it; then allocate 4 strings.

Tue Feb 28 14:29:39 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.39.

	* COPYING, make.texinfo: New GNU General Public License, version 1.

	* *.c, *.h, Makefile: New copyright notices for the new GNU General
	Public License, version 1.

	* commands.c [USG]: Define WRETCODE correctly (again).

	* variable.c (expand_function: `shell'): Don't capture the standard
	error output of the shell command.

	* ar.c (ar_touch, ar_member_date): Allocate MEMNAME with the right
	length.

	* load.c [not UMAX] (load_average): Don't clobber the first nlist
	member when trying to set the second!

Thu Feb 23 13:13:53 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* commands.c (child_handler): Really ignore errors under -i and for
	- lines, don't just print a different message.

	* make.c (decode_switches): Fixed handling of arguments (or lack
	thereof) to switches.

Wed Feb 22 16:25:39 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* commands.c (construct_command_argv): Don't clobber LINE when
	checking the IFS variable.

Sun Feb 19 11:17:07 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* load.c [UMAX, not NO_LDAV] (load_average): Return 0.0 rather than
	randomness when calls fail.

	* Version 3.38.

	* commands.c (fatal_error_signal): If handling a user kill signal
	(TERM, INT, HUP), wait for the children without printing the
	"Waiting for children" message, since they will die quickly.

	* Version 3.37.

	* remote-stub.c (remote_status): Take another arg, BLOCK.  If this
	is nonzero block waiting for remote children.  If not, return 0 if
	we would have to block.

	* commands.c (child_handler) [not USG]: If called as a signal
	handler, use wait3 and don't block.
	[USG]: If called as a signal handler, return after handling one child.

Sat Feb 18 13:37:04 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* file.c (snap_deps): Process all double-colon entries of each file,
	not just the first one.

	* Version 3.36.

	* remote-stub.c: remote.c renamed.
	remote.c: Just include remote-stub.c

	* commands.c (child_handler): If we were called as a signal handler,
	return after handling one child.

	* commands.c [not USG]: Include <signal.h> and define `sigmask' if
	<signal.h> doesn't.
	(block_children, unblock_children): Use sigmask rather than
	bitshifting explicitly (and incorrectly).

	* remote.c (remote_kill): New function to send a signal to a
	remote child.

	* commands.c (fatal_error_signal): If we get a SIGTERM, send one to
	each living child.  If we get a SIGTERM, SIGINT, or SIGHUP, delete
	all pending targets before waiting for children.
	(struct child): Add new member `deleted'.
	(start_job): Initialize `deleted' member to 0.
	(delete_child_targets): New function to delete a given child's
	targets, unless the `deleted' flag in the `struct child' says they
	have already been deleted.  Sets this flag before returning.

Thu Feb 16 18:32:07 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c [USG]: Define `WRETCODE' correctly (X & 0xff00).

Tue Feb 14 16:05:00 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (construct_command_argv): Don't make the 0th element of
	the argument list be "sh" when executing /bin/sh, because start_job
	uses the 0th element as the program name.

Sun Feb 12 17:42:05 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.35.

	* read.c (readline): Put a null in the beginning of the buffer
	before starting the reading loop.

	* read.c (read_makefile): Made main reading loop while
	!feof (infile), and removed EOF check after calling readline.

Sun Feb  5 19:52:38 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* remote.c (block_remote_children, unblock_remote_children): New
	(stub) functions to block and restore asynchronous notification of
	remote child death.

	* commands.c (block_children): Call block_remote_children.
	(unblock_children): Call unblock_remote_children.
	(child_handler): If called as a signal handler, block remote
	children on entry and unblock them before returning.

	* commands.c (child_handler): For unknown children, if they are
	remote, give their remote ID; if local, give their PID and make's.

	* commands.c (execute_file_command): Don't put a new child in the
	chain unless start_job succeeds.  Block children before calling
	start_job, and unblock them after putting the child in the chain and
	incrementing `job_slots_used' (if start_job succeeded).

	* commands.c (block_children, unblock_children): Make these globally
	visible (not `static').
	commands.h: Declare block_children and unblock_children.

	* variable.c (expand_function: `shell'): Use
	`shell_function_completed'.  Block children before forking and
	unblock after `shell_function_pid' is set properly and
	`shell_functon_completed' is reset to 0.

	* commands.c (child_handler): When the child of the `shell' function
	completes, set `shell_function_completed' to 1 if it actually ran,
	or -1 if it didn't (due to fork or exec failure).

	* commands.c (block_children, unblock_children): New functions to
	block and unblock the child termination signal.
	(wait_for_children): Use block_children and unblock_children.
	(execute_file_commands): Block children around the critical section
	wherein a new child is put on the chain.

	* make.c (main): Change the environment to contain the correct
	MAKELEVEL before re-execing.

Sat Feb  4 18:28:48 1989  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.34.

Fri Feb  3 16:36:49 1989  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* rule.c (default_variables): Fixed $(LINK.c).

Wed Feb  1 18:05:07 1989  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* Version 3.33.

	* version.c: Removed copyright notice, since this is a one-line file.

	* commands.c (error_status): Made it return BUF, rather than running
	off the end (this apparently worked on Sun 3s for some reason).

	* ar.c, commands.c, dep.h, load.c, make.c, make.h, read.c, remake.c,
	rule.c, variable.c, Makefile: Changed copyrght notices to cover 1989.

Mon Jan 30 15:51:28 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.32.

Fri Jan 27 20:09:24 1989  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* remake.c (remake_file): Don't touch phony targets.

	* rule.c (convert_to_pattern): Fixed an incorrect length passed to
	savestring.

	* variable.c (expand_function: `shell'): Close the read side of the
	pipe on the parent side of the fork.

	* commands.c (start_job): On the child of the fork, close the
	BAD_STDIN fd if we're not using it.

	* read.c (record_files): A file beginning with a dot can be a
	default target if it also contains a slash (as in `../foo').

	* commands.c (wait_for_children): For BSD, block SIGCHLD rather than
	ignoring it to avoid a race condition when child_handler is returning.

	* commands.c (child_handler): Do blocking waits.
	(error_status): Return a string describing exit status.  (Split out
	of child_handler).

	* read.c (multi_glob): Change VECTOR to VEC for Alliant.

Thu Jan  5 00:06:51 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.31.

	* make.texinfo (Features): Noted $(foo:PAT=SUB) from SunOS 4.0.

	* make.texinfo (Options/Recursion): -d and -p go in the environment.

	* load.c: Include "commands.h".

Wed Jan  4 17:49:25 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* make.c (switches): -d and -p can come from the environment and are
	put into it.

	* read.c (record_files): Fixed the checking for duplicate deps so it
	doesn't clobber the first one.

	* make.texinfo: Documented default implicit rule changes.

	* rule.c: Revamped default suffix rules.  They now use Sun's style
	of using variables `COMPILE.c', `LINK.c', etc. for each suffix, and
	use `TARGET_ARCH' and `TARGET_MACH' variable where appropriate.
	Also support Modula-2 compilation (suffixes .sym, .def, and .mod).
	Ratfor Yacc support is gone, since nobody has yacc -r.
	All EFL support is gone, since nobody uses EFL.

	* ar.c, arscan.c: Don't assume `long int' and `int' are the same.

	* commands.c [USG]: Fixed wait status bit encoding.
	[USG and not USGr3] (dup2): Define this for SysVr2.

	* make.h, dep.h, make.c [iAPX286]: Make allowances for this
	brain-damaged compiler.

	* make.texinfo (Variables: Flavors): Fixed a typo.

Tue Jan  3 18:09:31 1989  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* ar.c (ar_member_date, ar_touch): Truncate member names to 15 chars.

	* Version 3.30.

	* commands.c [SYS_WAIT]: If this is defined, use BSD <sys/wait.h>
	and wait3 even if USG.

	* read.c (record_files): Defining .DEFAULT with no deps or commands
	clears its commands.

	* rule.c (default_suffixes): Added `.sh'.
	(default_suffix_rules): Added single-suffix .sh rule, copies source
	to target and makes target executable.
	make.texinfo (Catalogue of Rules): Documented .sh rule and its use
	in conjunction with SCCS.

	* rule.c (set_default_suffixes): Define variable `SUFFIXES' to the
	default list ("" under -r).
	make.texinfo (Suffix Rules): Document `SUFFIXES' variable.

	* rule.c (default_variables), make.texinfo (Implicit Variables):
	Variable AR defaults to `ar', ARFLAGS to `rv', and RM to `rm -f'.

	* rule.c (install_default_pattern_rules): Default variables are made
	recursive.
	(default_variables): Added "CPP", defined to "$(CC) -E".
	(default_suffixes): Added `.S', before `.s'.
	(default_suffix_rules): New rule for .S to .s, runs CPP.
	All rules that use CPP now include "$(CPPFLAGS)".
	make.texinfo (Catalogue of Implicit Rules, Implicit Variables):
	Documented above changes.

	* commands.c [USG] (sys_siglist): Don't define.
	[USG] (init_siglist): New function to initialize sys_siglist.

	* make.texinfo (Variables: Reference): Documented `$(foo:PAT=SUB)'
	references.

	* variable.c (variable_expand): A reference `$(foo:PAT=SUB)' is
	equivalent to `$(patsubst PAT,SUB,$(foo))'.

	* variable.c (variable_expand): Free the storage for the expansion
	of a recursive variable when it is nod longer needed.

	* variable.c (variable_expand): When checking for `$($(foo))', use
	lindex so as not to search for the second `$' outside the parens.

	* make.c (struct stringlist, main, decode_switches): Changed `index'
	member to `idx'.

Sat Dec 24 16:02:32 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (wait_for_children [USG]): Handle SIGCLD with SIG_DFL,
	rather than SIG_IGN.  Ignoring SIGCLD reportedly makes wait return -1.

	* arscan.c [USGr3]: Define PORTAR to 1 (as with sun386).
	(ar_scan [USGr3]): Remove trailing slashes from member names.

Thu Dec 22 17:54:05 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* make.texinfo (Makefiles: Overriding Makefiles): New node
	documenting use of .DEFAULT to have one makefile defer unmakeable
	targets to another.

	* make.texinfo (Implicit: Using Implicit, Implicit: Last Resort):
	Mention empty commands and xref node `Empty Commands'.

Wed Dec 21 20:12:40 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.29.

	* make.c (struct command_switch, command_switches, et al): New
	member `noarg_value', if not nil, ptr to value to use if no arg is
	given to a switch that would otherwise require one.  The -j option
	can now be given w/o an arg, to mean infinite jobs.
	* commands.c: If job_slots is zero, infinite jobs.

	* read.c (read_all_makefiles, read_makefile): Make makefiles precious.

	* make.c (decode_switches): For a positive_int or floating option,
	if we moved to the next argument word, but found no argument for the
	option, move back to the correct word.

	* make.c (decode_switches): If we got any unknown options, die after
	processing all arguments.

	* GNUmakefile: Moved `include depend' to the end, so the default
	goal will be set before then.

	* load.c (wait_to_start_job [Unix, UMAX]): Merged into one version
	under #ifdef LDAV_BASED.  Only loop while we have jobs running.
	Sleep for increasing amounts (increase one second per iteration)
	before checking the load average (after the first check).
	Get the load average from function load_average.
	(wait_to_start_job [not LDAV_BASED]): Always return.
	(load_average [UMAX]): Fetch load average for Encore UMAX.
	(load_average [not NO_LDAV]): Fetch load average from /dev/kmem.
	[not NO_LDAV]: Define LDAV_BASED.

Tue Dec 20 18:54:50 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.28.

	* commands.c (wait_for_children): Take second arg, ERROR.  If
	nonzero, and there are children, print a message on stderr.
	(execute_file_commands, fatal_error_signal): Pass second arg.
	* make.c (die), remake.c (update_goal_chain), variable.c
	(expand_function: `shell'): Ditto.

Sat Dec 17 01:05:38 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* commands.c (start_job): Call wait_to_start_job before forking.

	* load.c (load_average): Converted to wait_to_start_job.

	* remote.c: New file for remote execution functions.
	(start_remote_job_p): Return nonzero if the next job should be run
	remotely.
	(start_remote_job): Start a remote job and return an ID for it.
	(remote_status): Get status of dead remote children.

Fri Dec 16 16:51:07 1988  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* commands.c (start_job): If start_remote_job_p () returns nonzero,
	call start_remote_job to start the job rather than fork and exec.
	(child_handler):

	* commands.c (execute_file_commands): Moved load average checking to
	start_job.

	* commands.c (child_handler: USG): Record the pid wait returns.

	* load.c (UMAX): Added some #include's needed for UMAX.

	* read.c (multi_glob), variable.c (string_glob): Ignore a (char **)
	-1 return from glob_filename.

	* variable.c (variable_expand): Make sure we don't increment past
	the end of the string we were passed.

	* variable.c (variable_expand): Terminate the expansion.

	* file.c (rename_file): If there is already a file under the new
	name, set its contents equal to FILE's (ick).

	* variable.c (define_automatic_variables): Pass all the args to
	define_variable when defining MAKELEVEL!

	* commands.c (execute_file_commands): If max_load_average > 0, and
	we have children running, don't start up another child until the
	load average goes below max_load_average.

	* make.c: New variable `max_load_average'.
	(struct command_switch, decode_switches, decode_env_switches):
	Handle floating-point (double) args.
	(command_switches): Added `-l' switch to set `max_load_average'.

	* load.c (load_average): New file and function to return a double
	that is the current load average (1.00 scale).
	* GNUmakefile, oldMakefile: Pass flags in $(LOAD_AVG) for load.c.

Thu Dec 15 15:22:08 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Makefile: Renamed to oldMakefile.
	* GNUmakefile: Make Makefile from oldMakefile and depend.

	* read.c (read_all_makefiles): When putting the default makefiles in
	the read_makefiles chain so they will be remade, put them in the
	right order.

	* remake.c (update_goal_chain): If MAKEFILES is nonzero, always make
	in serial, and return as soon as one goal whose `changed' member is
	nonzero  is successfully remade.

	* commands.c: Don't include <sys/fcntl.h>.

	* commands.c (construct_command_argv): Added ` to sh_chars.

	* make.h: Don't declare construct_makeflags.

	* make.c (main): Set up MAKEFLAGS and MFLAGS and make an environment
	both before and after reading the makefiles, so the makefiles can
	use them and possible change them, and later children will get the
	right information.
	(construct_makeflags): Replaced with define_makeflags (static void),
	which defines the two variables.
	* variable.c (define_automatic_variables): Don't define MAKEFLAGS
	and MFLAGS.

Mon Dec 12 14:40:31 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* Version 3.27.

	* commands.c (child_handler): Reset the handler to ourselves when
	called for USG, since it has no safe signals.

	* commands.c: For USG, use an int rather than a `union wait' for
	wait calls, and dissect it with bitmasks.
	(child_handler): No wait3 system call in USG.  Since we can't
	protect from hanging, always return immediately if we have no
	children we know about and we're not running a `shell' function.
	(There is still the danger of hanging waiting for a child that died
	without our being notified.)

	* remake.c: Include <fcntl.h> instead of <sys/file.h>.  What we need
	is really in <fcntl.h>, and while BSD <sys/file.h> includes
	<fcntl.h>, USG doesn't.

	* make.c (main): Figure out the program name before doing anything
	which might need it (in a call to error or fatal).

	* dir.c, glob.c: Use `struct dirent' and <dirent.h> for USGr3.

	* arscan.c (ar_scan): Added missing & before buf (which is an int)
	if SARMAG is not defined (SysV).

Fri Dec  9 18:44:13 1988  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* Version 3.26.

	* dir.c (find_directory, dir_file_exists_p): Keep track of how many
	directories we have open and don't let it be more than
	MAX_OPEN_DIRECTORIES (currently 10).

	* variable.c (expand_function: `foreach'): Use expand_argument
	rather than variable_expand so each repetition doesn't clobber the
	last!!!

Mon Dec  5 15:58:46 1988  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* Version 3.25.

	* Makefile: Define `install' target.

	* GNUmakefile: Don't include GNUmakefile or depend in the
	distribution file.

Wed Nov 30 15:53:42 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* commands.c (execute_file_commands): Don't clobber a null into
	random storage if there were no $^ and/or $? words.

	* remake.c (check_dep): Set *MUST_MAKE_PTR nonzero if a dependency
	doesn't exist.

	* ar.c (ar_member_date, ar_touch): Make sure the modtime of the
	archive file itself is known before we fetch or change the modtime
	of one of its members.

	* read.c (read_makefile): Expand variable and function references
	before parsing rules so variable can contain special characters
	(colons and semicolons).

Sat Nov 26 11:36:31 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* variable.c (expand_function: `filter', `filter-out'): Fixed so
	that filter-out works right.

	* variable.c (expand_function: `filter', `filter-out'): Made these
	functions use each word of their first argument as a pattern.

Fri Nov 25 10:51:47 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.24.

	* read.c (record_files): If a target is listed more than once in a
	single rule (that defines commands), give a warning message rather
	than the counter-intuitive message saying commands were already
	defined (in the same place).

	* make.c (fatal, error): Made them both take 6 args since there is
	at least one error message that need that many.  Too bad vfprintf is
	not universal!

	* Version 3.23.

	* read.c (read_makefile): Moved the construction of the `struct
	commands' into record_files.  Call record_files before recursing for an
	included makefile so the higher-up will determine the default goal.
	(record_files): Take arguments COMMANDS, COMMANDS_IDX and
	COMMANDS_STARTED and construct a `struct commands.

Thu Nov 24 14:36:33 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.22.

	* make.c (main): Made it a fatal error if we can't move back to the
	directory we started in before re-execing.

	* make.c (main): Get the current directory before doing anything
	else, so we know it even if we don't need it for the value of
	`MAKE', since we might want it when re-execing.

Wed Nov 23 13:34:44 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.21.

	* read.c (record_files): Eliminate duplicate deps in a chain.

	* variable.c (expand_function: `sort'): Pass the right number to
	qsort, not one less.

	* remake.c (remake_file): Always call notice_finished_file if
	FILE->command_state == cs_finished.

	* commands.c (execute_file_commands): Call notice_finished_file to
	set FILE's status correctly when start_job fails (because it's out
	of commands or running under -n).

Fri Nov 18 15:31:12 1988  Roland McGrath  (mcgrath at saffron.Berkeley.EDU)

	* Version 3.20.

	* remake.c (update_file_1): Set the `update_status' of FILE to
	nonzero and set FILE's `updated' bit if we have decided to give up
	on remaking FILE because of errors in the dependencies.

	* rule.c (pattern_search): Debugging messages use `dependency' (vs.
	`dependent') properly.

	* make.texinfo (Conditionals: Conditional Syntax): Function index
	entries for `ifndef' and `ifneq'.

	* variable.c (define_automatic_variables): Define `MAKELEVEL' to the
	decimal number of the makelevel, since it may be malformed or blank.

	* remake.c (remake_file): Call notice_finished_file after touching.

Sat Nov 12 19:29:34 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.19.

	* GNUmakefile (dist): Pass the `-f' flag to compress.

	* vpath.c (build_vpath_lists): Check for VPATHS being nil after
	constructing the general VPATH list from the `VPATH' variable.

Fri Nov 11 08:02:26 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (fatal, error): Made error messages for recursive runs be
	shorter.

Thu Nov 10 16:51:36 1988  Roland McGrath  (mcgrath at basil.Berkeley.EDU)

	* Version 3.18.

	* read.c (read_makefile): Made it eat leading spaces and formfeeds
	(but not tabs), like it's documented to.

	* read.c (read_makefile): Let included makefiles determine the
	default goal, as is done by System V Make.

Tue Nov  1 19:03:08 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* variable.c (new_environ): Don't increment VCNT when a variable is
	rejected.

Fri Oct 28 16:54:15 1988  Roland McGrath  (mcgrath at basil.Berkeley.EDU)

	* Version 3.17.

	* rule.c (convert_to_pattern): Don't use the same storage for a name
	in two rules since new_pattern_rule may free this storage when a
	rule is discarded.

	* rule.c (new_pattern_rule): Undid useless change I made Oct 25.

Thu Oct 27 19:17:53 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.16.

	* GNUmakefile, Makefile: Fixed a typo in a comment.
	* Makefile: Removed malloc.o from object file list.

	* variable.c: Removed old debugging #define's for xmalloc and
	xrealloc so non-ANSI cpp's won't barf.

	* make.c (main): Made local array for temp file name static so
	compilers that don't do auto aggregate initialization won't barf.

	* read.c: Removed static declaration of copy_dep_chain since it is
	no longer static.

Tue Oct 25 16:59:30 1988  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* rule.c (new_pattern_rule): If we threw out the new rule because it
	matched an old one and OVERRIDE was zero, don't put the freed
	pointer in the chain!

Wed Oct 19 15:07:43 1988  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* Version 3.15.

	* variable.c (expand_function: `sort'): Don't do the sorting and
	writing out if there were no words in the first place.

	* remake.c (remake_file): Only fail with a "no way to make" message
	for a dependency (non-target) file.  If we don't know how to remake
	a target file, pretend it was successfully remade and is very new.

	* remake.c (remake_file): Don't increment `files_remade' for a
	non-target file we don't know how to remake.

	* read.c (record_files): Don't die with "both : and :: entries" for
	a file whose `is_target' flag is not set.

Tue Oct 18 17:24:11 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* variable.c (expand_function: `patsubst', `subst'): Free the right
	things!

	* variable.c (expand_function: `subst'): Don't clobber the
	pointer to the end of the second arg and then try to use it!!!

Mon Oct 17 16:44:45 1988  Roland McGrath  (mcgrath at catnip.Berkeley.EDU)

	* variable.c (expand_function: `patsubst'): Don't clobber the
	pointer to the end of the second arg and then try to use it!!!

	* variable.c (expand_function: `word' function): Made it parse its
	second argument correctly.

	* ar.c (ar_touch): Return 1 rather than -1 for on errors.

Sat Oct 15 15:12:16 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.14.

	* GNUmakefile: Removed explicit rule for make.dvi since the built-in
	implicit rule now works.

	* rule.c (default_suffix_rules): Fixed .texinfo.dvi rule yet again
	so that it really works, now that parens are counted.

	* remake.c (update_file_1): Set FILE's `updated' flag after calling
	remake_file if it failed or finished immediately.

	* remake.c (update_file): Use the `updated' flag rather than the
	command state to decide if a file was fully considered, and
	therefore might give an "up to date" message.

	* variable.c (expand_function): Made all functions that take more
	than one argument count parens of the appropriate flavor in their
	args and ignore commands nested in parens.

Fri Oct 14 18:35:00 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* read.c (read_all_makefiles): Pass second arg to read_makefile for
	default makefiles.

Thu Oct 13 16:40:08 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.13.

	* GNUmakefile: Added an explicit rule for make.dvi since the
	built-in .texinfo.dvi implicit rule is screwed up.

	* rule.c (default_suffix_rules): Added a comment that the
	.texinfo.dvi rule does not work because of an ahem, feature of Make
	that at some point will be fixed--er, enhanced to alleviate this
	difficulty.

	* rule.c (default_suffix_rules): Fixed Texinfo -> DVI rule (again).

	* make.texinfo (Commands: Execution): Documented new competing for
	standard input among children.

	* commands.c (struct child): Added `good_stdin' flag to tell if this
	child has the stdin that doesn't point into nirvana.
	(good_stdin_used): New variable to tell if any child has the good
	standard input.
	(child_handler): Reset `good_stdin_used' if a dead child's
	`good_stdin' flag is set.
	(start_job): Give the new child the good standard input if
	`good_stdin_used' is no set, and set the child's `good_stdin' flag
	appropriately.

	* rule.c (default_suffix_rules): Changed Texinfo -> DVI rule to work
	better (I hope).

	* read.c (read_all_makefiles): Stop reading default makefiles after
	one is found.

	* read.c (read_makefile): Reset `reading_filename' and
	`reading_lineno_ptr' after recursing for an included makefile.

	* GNUmakefile: New GNU Make-specific makefile that does everything
	Makefile does plus distribution stuff, and doesn't contain any hacks
	to try to work with Unix make.

	* Makefile: Removed distribution stuff.

	* make.c (main): Use mktemp to construct the names of temporary
	files used for standard input makefiles.

	* make.c (main): Don't turn standard input into a broken pipe.

	* commands.c (start_job): Keep two extra file descriptors around: a
	good standard input, and a bad one that reads from a broken pipe.
	On the child side of the fork, if there are other children, give
	this one the broken pipe so they won't compete; if this is the only
	one, give it the good standard input.

	* make.h: Declare notice_finished_file.

	* commands.c (execute_file_commands): Use noticed_finished_file
	after waiting for the child when there is only one job slot.

	* remake.c (notice_finished_file): New function to re-check mtime's
	and such things to be done when commands finish.
	(update_file_1): Use notice_finished_file.

	* commands.c (child_handler, execute_file_commands): Use new
	variable `job_slots_used' to record the number of jobs currently
	running, rather than diddling with `job_slots'.
	(execute_file_commands): Increment `job_slots_used' before calling
	start_job and decrement it on failure to avoid race condition.
	If there is only one job slot, wait for the child to finish and
	return its status so commands are run in linear order, as if there
	were no parallelism.

Wed Oct 12 15:59:03 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* remake.c (remake_file): Don't print a "No way to make" message for
	targets whose `dontcare' flags are set.

	* read.c (read_all_makefiles): Set the `dontcare' flag of the
	`struct file' each default makefile added to the chain.

	* file.h (struct file): Add `dontcare' member.

	* read.c (read_all_makefiles): When no default makefiles are found,
	put the names of all those tried in the `read_makefiles' chain so
	they will be updated if possible, giving their `struct dep's'
	`changed' members the value of 0 so we won't care if they cannot be
	found or remade.

	* make.texinfo (Makefiles: Remaking Makefiles): Documented that
	default makefiles will be remade if not found.

	* read.c (read_all_makefiles): If no default makefiles can be found,
	go through the list of default names, trying to make one, stopping
	if one is made.

	* remake.c (remake_file): Set STATUS to 0 after successfully touching.

	* dir.c (file_impossible, file_impossible_p): Don't clobber FILENAME
	to "" and then try to to a strcmp on it!!!

Mon Oct 10 16:09:18 1988  Roland McGrath  (mcgrath at cinnamon.Berkeley.EDU)

	* make.c (main): Don't do `dir_load (".")'.

	* rule.c (count_implicit_rule_limits), vpath.c
	(construct_vpath_list): Test the existence of a given directory by
	`dir_file_exists_p (DIR, ".")' and assume that if this returns zero,
	it means the directory really does not exist.

	* dir.c (struct dirdata): Replaced with `struct directory' for
	directories, each containing a chain of `struct dirfiles', one for
	each file (real or impossible).
	(dir_load): Removed.
	(find_directory): New function to find the `struct directory' for a
	named directory and return it (possibly creating a new one).
	(dir_file_exists_p): Read the directory on the fly if its stream is
	still valid (and ever was) if the file we're looking for is not
	already in the hash tables.
	(file_impossible, file_impossible_p, dir_name, print_dir_data_base):
	Use the new directory/file scheme.

	* make.texinfo: Miscellaneous editorial changes and clarifiactions.

	* commands.c (struct child): Remove `environ' member.
	(child_handler, start_job, execute_file_commands): Remove use of
	`environ' member and new_environ.

	* make.c (main): Call new_environ after reading makefiles.

	* variable.h: Declare `new_environ' to return void.

	* variable.c (new_environ): Put the environment in `environ' and
	return void.

Fri Oct  7 15:48:39 1988  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* Version 3.12.

	* Makefile: Don't make the uncompressed tar file.

	* variable.c (expand_function: `shell' function): Made it not expect
	read to null-terminate the buffer.

	* Makefile: Made it use a temporary symlink to . rather than a
	temporary directory to make the distribution tar file.

Thu Oct  6 17:52:35 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.11.

	* make.texinfo: Fixed a line that got garbaged somehow.

Mon Oct  3 16:14:39 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* make.c (main): Try to move back to the directory we started in
	before re-exec ourself.

	* remake.c (update_file_1): A double-colon target with no deps
	always needs to be remade.

	* remake.c (remake_file): Changed "No way to make" message to say
	`target' rather than `file'.

Sun Oct  2 12:50:47 1988  Roland McGrath  (mcgrath at catnip.Berkeley.EDU)

	* remake.c (update_file_1): Set FILE->update_status to the return
	value of remake_file.

	* rule.c (convert_to_pattern): Fixed swapped lengths passed to
	xmalloc for source/target suffixes.

	* make.texinfo: Documented that MAKEFLAGS and MFLAGS are read in
	from makefiles.  Updated the `Features' section a bit.

	* make.c (main): Read switches from MAKEFLAGS and MFLAGS variables
	after reading in makefiles.

	* make.c (main): Put a line "/tmp/foo:;" rather than ".PHONY:
	/tmp/foo" in front of temp files made for stdin makefiles.

	* remake.c (update_file): Test the state of the right `struct file'
	for double-colon files.

	* make.c (main): Put a ".PHONY: /tmp/foo" line in front of temp
	files made for stdin makefiles so they won't be remade when we
	re-exec.  Kludge-o-matic!!

	* remake.c (update_goal_chain): Judge files as being finished based
	on their `updated' flag, not their state.

	* read.c (read_makefile): Don't check for FILENAME being "-".
	(read_all_makefiles): Set each element of MAKEFILES to the name put
	in READ_MAKEFILES by read_makefile, since read_makefile may free the
	storage for the name it is passed, and someone might want to look at
	the elements of MAKEFILES again.

	* make.c (main): For each `-f' flag with arg `-' (standard input),
	read standard input into a temp file and pass the temp file's name
	to read_all_makefiles, after making sure it will not be remade.

	* make.c (construct_makeflags): Always put out `-j1'.

Sat Oct  1 00:19:59 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* commands.c (execute_file_commands): If commands are nothing but
	whitespace, set the state to `cs_finished' before returning 0.

	* make.c (decode_switches): Allocate space for args in stringlists
	so they can be freed later.

	* make.h: Declare `makelevel'.

	* variable.c (makelevel): Moved to make.c (and made global).

	* make.c (fatal, error): Print the makelevel if it's > 0.
	(perror_with_name): Use error rather than calling fprintf directly.
	(pfatal_with_name): Use fatal rather than fprintf and die.

	* variable.c (new_environ): Don't put default variables (origin
	`o_default') into the environment; they just take up space.

	* read.c (read_makefile): Don't add FILENAME to the chain of read
	makefiles if it's "-" (standard input).

	* remake.c (update_goal_chain): Set STATUS correctly when nothing
	happens (as well as in all other situations).

	* make.c (construct_makeflags): Put a `-' before each switch and
	spaces between them.

	* Version 3.10.

	* commands.c (wait_for_children): Don't check if `children' is nil.
	This is the case when waiting for the child of a `shell' function.

	* dir.c (dir_load): Don't add a hash-table entry for directory
	DIRNAME and filename "" if DIRNAME doesn't exist.

	* commands.c (execute_file_commands): Return 0 after start_job
	returns 1 (failure) under the -n flag.

	* remake.c (remake_file): Set the state to `cs_finished' when not
	calling execute_file_commands.

	* remake.c (update_goal_chain): Second arg is now MAKEFILES, nonzero
	meaning to disable -t, -q, and -n for each target unless the target
	was also given on the command-line.

	* read.c (read_makefile): Enter the `struct file's for the makefiles
	added to the `read_makefiles' `struct dep' chain.

	* remake.c (update_goal_chain): Made it not enter the files for the
	goals in the chain.  It will already have been done.

	* rule.c (convert_to_pattern): Null-terminate the names of targets
	and deps of the pattern rules properly.

Fri Sep 30 18:56:20 1988  Roland McGrath  (mcgrath at nutmeg.Berkeley.EDU)

	* make.c (main): Call install_default_pattern_rules.

	* make.h: Declare copy_dep_chain.

	* read.c (copy_dep_chain): Moved to make.c (and made global).

	* make.c (main): Call update_goal_chain to update goals.
	Update read makefiles and re-exec self if they change.

	* remake.c (update_file): Make this function static.
	(update_goal_chain): New function to update a `struct dep' chain of
	goals, waiting until they are all finished before returning.

	* make.h: Don't declare update_file.  Declare update_goal_chain.

	* make.c (main): Call snap_deps, etc. that were in read_all_makefiles.

	* read.c (find_makefile): Removed this function.
	(read_all_makefiles): Don't update makefiles, don't diddle with
	pattern rules, don't call snap_deps, etc.  Return a `struct dep'
	chain of all makefiles read.
	(read_makefile): Now takes two args: FILENAME and TYPE, which is 0
	for a normal makefile, 1 for MAKEFILES variable or 2 for an included
	makefile.  Add a `struct dep' containing the name of the makefile
	(as it was found in the search path for type 2s), and TYPE in the
	`changed' member to the global `read_makefiles' chain.

	* make.h, rule.c (displace_pattern_rules,
	add_displaced_pattern_rules): Removed these functions.

	* read.c (read_makefile): Variable-expand the name of an `include'd
	makefile before calling find_makefile on it.

	* file.c (snap_deps): If the `struct file' for a `struct dep'
	already exists, free the `struct dep's `name' member before setting
	it to nil (since this info is in the `struct file').

	* read.c (copy_dep_chain): Made it copy each name rather than
	leaving multiple `struct dep's with the same pointers.

Thu Sep 29 19:08:13 1988  Roland McGrath  (mcgrath at catnip.Berkeley.EDU)

	* make.c (decode_switches): Fixed second decode_env_switches call to
	use correct length of "MFLAGS" (6, not 5).

	* read.c (read_makefile): Don't stop reading when readline returns
	zero lines read.  Only stop when the stream reaches EOF.  This makes
	it recognize the last line of a makefile without a newline.

	* remake.c (remake_file): If we don't know how to make FILE, set its
	command state to `cs_finished'.

	* remake.c (update_file): Don't write the "up to date" message if
	update_file_1 returned a nonzero status.

Wed Sep 28 16:30:07 1988  Roland McGrath  (mcgrath at catnip.Berkeley.EDU)

	* commands.c (child_handler): Set the `update_status' member
	properly for ignored errors.

	* rule.c (convert_to_pattern): Made it not care about if the target
	suffix comes before the source suffix in the .SUFFIXES list.

	* make.texinfo: Misc editorial changes.

	* commands.c (wait_for_children): Return immediately if `children'
	is nil (there are no children).

Tue Sep 27 15:33:14 1988  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* Version 3.09.

	* commands.c (struct child): New member `command_ptr' to hold the
	current position in the commands.  The `commands' member is never
	changed.
	(start_job, child_handler, execute_file_commands): Use new method
	for `commands' and `command_ptr' members.

	* make.c (decode_env_switches): Skip past an invalid letter (instead
	of looping forever).

	* commands.c (struct child): Add `environ' member to hold the
	environment for this child.
	(execute_file_commands): Get a new environment from new_environ and
	put in the the new `struct child's `environ' member.
	(child_handler): When freeing a child, free its `commands' member, the
	elements of its `environ' array and its `environ' member itself.
	(start_job): Set `environ' to the child's `environ' member before
	exec'ing the command.

	* variable.h, variable.c (new_environ): Made it return the new
	environment, not putting it in `environ'.

	* remake.c (update_file): Don't give a "is up to date" message
	unless no files were remade and the state went from `cs_not_started'
	to `cs_finished', so repeat calls to finish jobs won't get the message.

Mon Sep 26 16:26:08 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* Version 3.08.

	* make.texinfo (Commands: Execution): Documented that children will
	be waited for rather than killed.

	* commands.c (fatal_error_signal): Wait for children.
	(kill_children): Removed this function.

	* make.c (main, die): Wait for children to die, don't kill them.

	* variable.c (expand_function): Use wait_for_children.

	* make.c (main): Use wait_for_children rather than child_handler.

	* commands.c (wait_for_children): New function to block waiting for
	children, insuring that child_handler is not called recursively.
	(execute_file_commands, kill_children): Use wait_for_children.

	* commands.c (child_handler): Start up additional commands in a
	sequence after an ignored error.

	* remake.c (update_file): Don't print "`foo' is up to date" messages
	when update_file_1 returns while commands are executing.

	* remake.c (update_file_1): Pass the file name to name_mtime, not
	the bloody `struct file', dammit!!

	* commands.c (child_handler): Print out the "*** ..." error message
	when not under -i.  (I somehow forgot this.)

	* remake.c (update_file_1): Use name_mtime rather than file_mtime to
	re-get the mtime of a file whose commands have finished.

	* make.c (command_switches, decode_switches, decode_env_switches):
	Make all switches that take string args allow them right after the
	switch letter.

	* commands.c (child_handler): Check for a child being the `shell'
	function's command returning and set the global variable for
	expand_function to check.

	* variable.c (expand_function): For the `shell' function, instead of
	waiting for the child shell ourselves, let child_handler do it and
	loop around waiting for something to happen.

	* make.c (print_version): Made the copyright year static, not dynamic.

	* make.h, make.c: Remove construct_argv function.

	* make.c (main): Say "no goal target" instead of "no target".

	* make.texinfo (Commands: Parallel): Don't send SIGKILL.

	* commands.c (kill_children): Don't send SIGKILL to children that
	aren't killed by the first signal.

	* make.c (main), commands.c (kill_children): Decide between SIGCHLD
	and SIGCLD based on whether or not SIGCHLD is defined, not on USG.

	* Makefile: Link make with $(LOADLIBES).

	* read.c (construct_include_path): Fixed another bad xrealloc call.

	* make.c (decode_switches): Fixed an xrealloc call with no first arg.

Sat Sep 24 01:16:21 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* Version 3.07.

	* remake.c (update_file_1): If deps are running, set state to
	`cs_deps_running' and return 0.  If deps are done, run commands.

	* commands.c (child_handler): Made it delete non-precious targets
	killed by fatal signals.

	* make.texinfo: Documented parallelism.

Fri Sep 23 16:52:27 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* remake.c (update_file_1): Don't return if FILE's state is
	`cs_deps_running'.  In that case, we need to run through and check
	the states of all our dependencies.

	* commands.c (execute_file_commands): Decrement `job_slots' after
	starting a new job to run file commands.

	* commands.c (start_job): Made it set the state to `cs_running'.

	* make.c (main): Fixed usage of `g', `lastgoal', and `goals' in the
	goal-making loop.

	* commands.c (child_handler): When commands finish, set the
	corresponding file's `update_status' and `updated' flags as
	appropriate, and reset the modtimes of the file and any `also_make'
	files it has.

	* remake.c (remake_file): Don't re-set `last_mtime' and set `updated'.

	* commands.c (fatal_error_signal): Don't swallow all the children
	with a loop around `wait ((union wait *) 0)'!!!

	* make.c (struct command_switch): Added `positive_int' type.
	(switches): Added -j (job_slots).
	(construct_makeflags, decode_switches, decode_env_switches):
	Handle`positive_int'-type switches.

	* glob.c (glob_vector): Rename local variable `vector' to `VeCtOr'.
	This is said to avoid a conflict with some system's global `vector'
	variable.

	* variable.c (expand_function): Made the `shell' function use
	construct_command_argv and do its own child control and piping.

	* make.c (main): Turn standard input into a broken pipe after
	reading in all makefiles (the last time it will be needed).

	* commands.c (struct child): Remove `pipe_fd' member.  We don't use
	pipes any more.
	(start_job): Return 0 for success, 1 or failure (rather than void).
	Don't use pipes.  Don't turn the child's stdin into a broken pipe.
	(child_handler): Print "*** Error" messages when necessary.
	Die on failed commands when -k was not given.
	(execute_file_commands): Check the return of start_job and remove
	the child from the chain and return failure if it is nonzero.

	* make.c (die): New function to clean up and exit.
	(fatal, pfatal_with_name): Use die.

Thu Sep 22 14:27:11 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* commands.c (struct child): Added `commands', `pipe_fd', and
	`noerror' members to keep track of info about a command thread.
	(start_job): New function to start a job and update the argument
	`struct child' to reflect its status.
	(execute_file_commands): Merged run_file_commands back in.
	Made it use new start_job function.

	* rule.c (freerule): Don't free the `struct commands' of the
	discarded rule.  It may be used in more than one place.

	* commands.c (execute_command_line): Made it not try to delete the
	possibly partly-made file.  The child_handler function will do this.
	(fatal_error_signal): Ditto + call kill_children.

	* make.h: Declare job_slots.

	* make.c (main): Collect goals in a dep chain and run through this
	chain waiting for a child, eliminating finished goals, updating all
	remaining goals, and quitting if they fail and not -k.

	* commands.c (child_handler): If called with SIG < 0, - SIG is the
	max number of children to bury.

	* commands.c (child_handler): If called with SIG as zero,
	block waiting for running children.
	(kill_children): Call child_handler with zero rather than SIGCHLD.

	* remake.c (update_file_1): Use the `command_state' member of FILE
	and its dependencies to determine what commands are running, what to
	do, etc.  If commands or dep commands are running when we are
	called, return success (0).  If commands finished since the last
	time we were called, return their status.

	* commands.h: Declare kill_children.

	* commands.c: Define `struct child' to keep track of child
	processes, with the chain in `children'.
	(child_handler): New function to catch child-termination signals
	(SIGCHLD, or SIGCLD for USG), store the returned status in the
	appropriate structure, take the now-obsolete `struct child' out of
	the chain, and free its storage.
	(execute_file_commands): Put all of the stuff invloving running the
	commands into new function run_file_commands.  Execute_file_commands
	now does process management for the commands, while
	run_file_commands (which is run in a subprocess) runs the commands.
	(kill_children): New function to kill all running children by
	sending them signal SIG.  If there are any children still living
	after they are all sent SIG, they are all sent SIGKILL.

	* make.c (main): Catch SIGCHLD (SIGCLD for USG) with child_handler.

	* commands.h: Declare child_handler function.

	* commands.c (execute_file_commands): Check the `command_state'
	member of FILE and return 0 if it is `cs_running' or
	`cs_deps_running' and return the stored status if it is `cs_finished'.

	* file.h (struct file): Added `command_state' member.

	* commands.c (execute_command_line): Add `$' to the list of
	characters special to the shell.

Wed Sep 21 15:57:41 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* read.c (read_all_makefiles): Call convert_to_pattern before
	recomputing the limits after adding the displaced rules.

	* make.c (main): Move calls to snap_deps, convert_to_pattern, and
	build_vpath_lists to read_all_makefiles.

	* read.c (read_all_makefiles): Install the default pattern rules
	before checking to remake the makefiles, displace these rules before
	reading in the makefiles, and then add the displaced rules to the
	chain after reading in all the makefiles.

	* make.c (main): Don't call install_default_pattern_rules or
	count_implicit_rule_limits.

	* make.h: Declare displace_pattern_rules and
	add_displaced_pattern_rules.

	* rule.c (displace_pattern_rules, add_displaced_pattern_rules): New
	functions to stow the chain and add the stowed chain on the end of
	the current chain.

	* make.texinfo (Implicit: Search Algorithm): Fixed PREV reference.

	* make.c (main): Call construct_include_path right after decoding
	the switches.

	* read.c (find_makefile): Use rename_file.

	* file.h: Declare rename_file.

	* file.c (rename_file): New function to rename a `struct file' and
	put it in the correct hash bucket.

	* read.c (find_makefile): New function to find and update a makefile.
	 (read_all_makefilese): Use find_makefile.
	 (read_makefile): Don't do updating.  Removed UPDATEIT arg.

	* remake.c (update_file_1): Took out setting the `updated' member to
	-1 rather than 1 sometimes.

	* make.c (main): Made it print version info before doing anything else.

	* remake.c (library_file_mtime, f_mtime): Removed use of last two
	arguments to vpath_search.

	* rule.c (pattern_search): Removed use of last two arguments
	to vpath_search.

	* vpath.c (vpath_search, selective_vpath_search): Removed unused
	DIRPREFIX and DPLEN args.

	* read.c (read_makefile): Also turn off -n when updating makefiles.

Tue Sep 20 17:01:10 1988  Roland McGrath  (mcgrath at pepper.Berkeley.EDU)

	* Makefile: Put tags files in the tarfile.

	* read.c (read_makefile): Get the modtime of the makefile via a stat
	call so that a later file_mtime call won't do VPATH search for it.

	* read.c (read_makefile): Don't turn off -t and -q if the makefile
	was a command-line target.

	* make.c (main): Enter command-line targets as files and set their
	`cmd_target' members.

	* file.h (struct file): Added `cmd_target' member.

	* read.c (read_makefile): Temporarily turn off -t and -q while
	updating makefiles.

	* make.c (main): Don't use arg 0 from other_args (which is now
	argv[0]; i.e., the program's name).

	* read.c (read_makefile): Only return nonzero if commands were
	actually run to remake the makefile.

	* remake.c (update_file_1): Set FILE->updated to -1 if no commands
	were actually run (because no update was done or -t was given).

	* make.c (decode_switches): Fixed bug wherein xrealloc was passed
	bad args if it tried to expand other_args->list.

	* read.c (read_all_makefiles): Made it not look at the `MAKE'
	variable, just use argv[0].

Sun Sep 18 17:34:11 1988  Roland McGrath  (mcgrath at paris.Berkeley.EDU)

	* read.c (rerun_make): New function to re-exec make.

	* make.c (construct_makeflags, construct_argv): New functions to
	construct the `MAKEFLAGS' variable and to construct an arg list from
	parsed info.

	* read.c (read_makefile): New arg UPDATEIT, if nonzero, says to
	update the makefile as a target before reading it in.  When reading
	included makefiles, pass this as zero.  Now returns nonzero if the
	makefile was updated, zero if not.
	(read_all_makefiles): Pass a nonzero UPDATEIT arg to read_makefile
	for all default and -f makefiles and all makefiles from the
	`MAKEFILES' variable.  If any of the makefiles has changed, re-exec
	self to re-read them.

	* remake.c (update_file): Print a "File `foo' up to date'" message
	under -p.

	* commands.c (execute_file_commands): Allocate one byte for each of
	$^ and $< rather than zero if they are to be empty.

Fri Sep 16 13:59:59 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Version 3.06.

	* make.c (command_switches): Fixed entry for `-o' switch.

	* make.texinfo: Renamed -c switch to -C.

	* make.c: Renamed -c switch to -C.

	* Miscellaneous de-linting.

	* read.c (record_files): Made it not free the storage for the name
	if it started with `./' and was therefore not quite the same as in
	the `struct file'.

	* read.c (record_files): If commands were specified twice, the error
	message specifies in what files and at what line numbers.

	* make.c (main): If any of the signals we usually fatal on were
	ignored by the parent (probably a shell), ignore them.

	* make.c (main): Print version info for -v, -p, or -d.
	(print_data_base): Don't print version info.  It will be done in main.

	* variable.c: Increased number of hash buckets to 257.

	* file.c: Increased number of hash buckets to 1007.

	* rule.c (count_implicit_rule_limits): Moved comptation of
	`maxsuffix' to convert_to_pattern, since that function uses
	`maxsuffix', and must be called before count_implicit_rule_limits.

	* rule.c (pattern_search): If an existent (non-intermediate)
	dependendency was found via a terminal rule, set its
	`tried_implicit' flag, so it will never have implicit rule search done.

	* glob.c: Bug fix to avoid alloca(0).

	* arscan.c: USG and Sun386i fixes.

Thu Sep 15 19:40:26 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* make.texinfo: Fixed some typos and spelling errors.

Wed Sep  7 14:20:39 1988  Roland McGrath  (mcgrath at helen.Berkeley.EDU)

	* make.c (decode_switches): Fixed bug wherein a bad option would
	give a useless error message and loop forever.

Tue Sep  6 14:36:02 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.texinfo: Documented `shell' function.

	* variable.c (expand_function): New function `shell', does
	backquote-style command expansion of its arg.

	* commands.c (execute_command_line): Second arg OUTBUF, if not nil,
	gets filled in with a malloc'd buffer containing the piped stdout of
	the command.
	(execute_file_commands): Use above (pass nil).

Mon Sep  5 17:03:49 1988  Roland McGrath  (mcgrath at hecuba.Berkeley.EDU)

	* Makefile: Added copyright notice.
	Added a comment about defining `NO_MINUS_C_MINUS_O' if necessary.

	* Version 3.05.

	* rule.c (default_suffix_rules): Don't pass `-o' switches with `-c'
	switches if `NO_MINUS_C_MINUS_O' is #define'd.

	* make.texinfo: Documented `GNUmakefile'.

	* read.c (read_all_makefiles): Made it try default makefile
	`GNUmakefile' before others.

	* make.texinfo: Added new-style Texinfo header thingies.

Sat Sep  3 18:09:39 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* Version 3.04.

	* make.texinfo (Chained Rules): Added a @cindex about using
	.PRECIOUS to preserve intermediate files.

	* remake.c (update_file_1): Made it not just return before executing
	commands under -p.

	* rule.c (default_pattern_rules, default_variables): Made it use
	`$(AR)' for `ar r' (to put files in archives).

	* vpath.c (build_vpath_lists): Made it recursively expand the
	`VPATH' variable (by using variable_expand instead of lookup_variable).

	* read.c (conditional_line): Made it not swallow whitespace after
	the comma in an `ifeq' using the `(a,b)' syntax.

	* rule.c (count_implicit_rule_limits): Made it not crash if a
	pattern rule dep begins with `/'.

Sun Aug 28 15:51:12 1988  Roland McGrath  (mcgrath at homer.Berkeley.EDU)

	* make.texinfo: Clarified that the arg to the `origin' function is a
	variable *name*, not a reference.

	* make.texinfo: Clarified that both -Idir and -I dir are allowed.

Sat Aug 27 13:49:28 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* remake.c (remake_file): Made touching phonies work right.

Wed Aug 24 20:40:48 1988  Roland McGrath  (mcgrath at nutmeg.Berkeley.EDU)

	* make.texinfo: Removed reference to `RANLIB' variable.

	* Version 3.03.

	* variables.c (expand_function): Added `origin' function.
	* make.texinfo: Documented same.

	* read.c (record_files): Made double-colon entries work.

Sat Aug 20 21:09:39 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (collapse_continuations): Bug fix from RMS.

	* rule.c (install_default_pattern_rules): Made it set the
	`in_use' flag of the created rules to zero, rather than letting
	it be random garbage.

	* rule.c (pattern_search): Fixed putting `also make' targets into
	file strucutres.

	* read.c (record_files): Fixed bug which made double-colon entries
	make it read off into space.

	* make.c (decode_switches): Made it understand `ignored' switches
	rather than dumping core.

Sun Aug 14 16:49:00 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* read.c (read_makefile): Made `include' filenames be
	variable-expanded.

	* read.c (read_makefile): Fixed an error message.

	* read.c (read_makefile): Made it accept ^L's as whitespace.
	* make.c (next_token, end_of_token): Ditto.

	* vpath.c (vpath_search): Fixed it so that the general VPATH (from
	the variable) is always checked, even if a selective VPATH (from a
	directive) matched the filename.

Sat Aug 13 14:20:46 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (decode_switches, main): Made the command switches be
	processed from a table of switches, variables, and types.  No
	functions are passed argc and argv any more.  They are passed arrays
	of strings they need to process.
	* read.c (read_all_makefiles): Made it take an array rather than
	argc and argv.
	(construct_include_path): Ditto.

	* make.c (collapse_continuations): Made it work right (I hope).

	* make.texinfo: Minor editorial changes.

	* read.c (read_makefile): Minor speed improvement by freeing and
	then mallocing something rather than reallocing it to avoid the
	unnecessary bcopy.

Thu Aug 11 00:10:43 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.texinfo: Fixed some unquoted @'s.

	* make.texinfo: Documented multiple-target pattern rules.
	Miscellaneous minor editorial changes and corrections.

	* make.texinfo (Implicit: Catalogue of Rules): Removed the list of
	variables.  That's what the next section is for.
	(Implicit: Implicit Variables): Made it agree with reality.

Wed Aug 10 00:55:39 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* variable.c (print_variable_data_base): Fixed bug which made -p
	dump core.  (This was a really idiotic bug.)

	* rule.c (pattern_search): Fixed a bug which made it make the
	`also_make' member of the file in question nil if the first of
	the successful rule's targets was the matching one.
	Made it use only as much storage as necessary in the `also_make'
	member.
	(create_pattern): Made it use only as much storage as necessary in
	the `lens' and `suffixes' members of the created rule.

	* remake.c (library_file_mtime): Made it `static'.

	* file.c: Added a declaration for `errno', which is declared in some
	<errno.h>'s, but not all.

	* file.h (struct file): Added `also_make' member for multiple-target
	implicit rules.
	* rule.c (pattern_search): Made it put the names of files updated by
	the given file's commands in its `also_make' member.
	* remake.c (update_file_1): Made it mark the files in a file's
	`also_make' member as updated when the file is updated.

	* variable.c (try_variable_definition): Fixed a bug which made it
	define a variable with the name of the whole definition when there
	was no space before the = or :=.

	* make.texinfo (Features): Made the changes which were made in RCS
	revision 2.7 but somehow lost since then.  Added -W.

Tue Aug  9 10:04:50 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* variable.h: Added `o_default' to `enum variable_origin'.
	* variable.c (print_variable_data_base): Made it print the origins of
	the variables.
	* rule.c (install_default_pattern_rules): Made it define the default
	variables with origin `o_default'.

	* make.texinfo: Documented -W.

	* make.c (decode_switches, main): Added the -W flag to give files a
	time-stamp of now, for a `what if' effect when used with -n.

	* commands.c (print_commands): Made it say `(built-in)' for commands
	that are built into the default ruleset.

	* read.c (record_file): Made .SUFFIXES get its deps frontwards (again).
	* rule.c (set_default_suffixes, convert_to_pattern): Made it read
	.SUFFIXES's deps frontwards, so the converted rules will not be in
	reverse order.

	* rule.c (new_pattern_rule): Fixed a bug wherein it would keep
	searching after it had removed a matching rule and ended up diddling
	with freed storage.

	* rule.c (freerule): Made it take the given rule off the chain.
	(new_pattern_rule, count_implicit_rule_limits): Use freerule to
	remove rules from the chain.

	* vpath.c (construct_vpath_list): Made it return after cleaning out
	all previous searchpaths when given a nil DIRPATH arg, so it won't
	go into the construction code and dump core dereferencing a nil
	pointer.

	* variable.c (patsubst_expand): Fixed a bug which made it not match
	correctly and sometimes dump core.

Mon Aug  8 16:35:48 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* rule.c (default_suffix_rules): Made the .texinfo.dvi rule remove
	the files used in the comparison to determine whether or not a
	second TeX run is necessary.

	* make.texinfo: Fixed some overfull TeX hboxes.

	* make.texinfo (Implicit: Catalogue of Rules): Fixed a Texinfo error.

	* rule.c (create_pattern_rule): Fixed bug wherein index was not
	being passed its second arg.

	* read.c (getline): Merged back into readline.

	* rule.c (default_suffixes, default_suffix_rules,
	default_variables): Added .texinfo.info rule.
	* make.texinfo (Implicit: Catalogue of Rules): Documented
	.texinfo.dvi and .texinfo.info rules.

	* make.texinfo (Top): Changed `last updated' date to be correct (for
	the last time it was updated, not today).  Changed `for version
	3.00' since it's not going to be called that.

Sat Aug  6 19:51:10 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* commands.c (print_commands): Added this function to print the
	contents of a `struct commands' for -p.
	* rule.c (print_rule_data_base): Use above.
	* file.c (print_file_data_base): Ditto.

	* rule.c (count_implicit_rule_limits, new_pattern_rule,
	install_pattern_rule, print_rule_data_base): Made it understand the
	changed `struct rule' and act accordingly.
	(freerule): Added this function to free all the storage used by a rule.

	* rule.c (pattern_search): Made it grok multiple targets of pattern
	rules.  The matching is done properly, but at present, only the
	matching pattern's target is used to give deps and commands.

Fri Aug  5 18:00:29 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* rule.c (struct rule): Changed name, namelen, and patsuffix members
	to targets, lens, and suffixes, which are arrays, for multiple targets.
	(create_pattern_rule): Now takes first arg TARGETS, a nil-terminated
	array of targets, rather than a single target and patsuffix pointer.

	* read.c (record_files): If it finds an implicit pattern rule, it
	collects all the targets into an array and passes the whole thing to
	create_pattern_rule.  If there are non-pattern targets, it is a
	fatal error.

Tue Aug  2 15:06:38 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (readline): Split backslash-newline checking from reading
	and buffer-expanding.
	(getline): Created to do the reading and buffer-expanding formerly
	done in readline.

	* rule.c (pattern_search): Made it reject nonterminal match-anything
	rules when a specific rule has matched, rather than rejecting
	terminal match-anything rules in this case.

	* rule.c (convert_to_pattern): Fixed a bug caused when the change to
	make it only recognize two-suffix rules whose target suffixes
	precede their dependency suffixes which made it work in the opposite
	direction (even worse than it started out).

	* rule.c (pattern_search): Made it reject nonterminal match-anything
	rules as intermediate targets when searching for both real and
	intermediate dependencies, rather than only when searching for
	intermediate ones.

Sun Jul 31 00:33:56 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* rule.c (convert_to_pattern): Made it only recognize two-suffix
	rules whose target suffix comes before the dependency suffix in the
	.SUFFIXES list.

	* variable.c (define_automatic_variables): Made all automatic
	variables be defined with origin `o_automatic'.

	* variable.h: Added `o_automatic' to `enum variable_origin'

	* file.c (remove_intermediates): Made it not print an error message
	if the error was that the file does not exist.

	* rule.c: Removed `recursive' member from `struct rule'.

	* remake.c (library_file_mtime): Made it not use the directory hash
	functions, as reading in and hashing /usr/lib and /lib is slow and
	most likely unnecessary.

	* remake.c (remake_file): Changed message from ``No specification
	for making'' to ``No way to make'' so it will be short enough that
	most filenames will fit on a line.
	Made it look at the `recursive' member of the `struct commands',
	rather than of the `struct file' (which no longer has one).

	* commands.c (execute_file_commands): Made it look at the
	`recursive' member of the `struct commands', rather than of the
	`struct file' (which no longer has one).

	* file.h: Removed `recursive' member from `struct file'.

	* commands.h: Added `recursive' member to `struct commands'.

	* dep.h: Removed unused `quotedparen' member from `struct nameseq'
	and `struct dep'.

	* read.c (dequote): Removed this function.
	(multi_glob): Removed reference to `quotedparen' member of
	a `struct nameseq' and calls to dequote.

	* read.c (record_files): Made it set the stem for $* for all static
	pattern rules, not just those with commands given at that time.
	Removed check for recursive commands.
	Made it check for pairs of .SUFFIXES dependencies to reject as
	default goals as well as single ones (that don't start with dots).
	(read_makefile): Added checks for recursive commands to set
	the `recursive' flag in the `struct commands'.

Sat Jul 30 15:47:23 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (find_next_token): Made the LENGTHPTR arg optionally nil.

	* make.c: Removed `files_made' variable which is defined static in
	remake.c and used only there.
	(main): Cleaned up somewhat.
	(decode_switches): Cleaned up a bit.  Made an unknown option be a
	non-fatal error.
	(decode_env_switches): Made LEN arg unsigned.  Cleaned up.
	(print_version): Made it say ``see the source'' rather than ``see
	the source file'', since there is more than one.

	* file.h: Made `num_intermediates' declared unsigned.

	* file.c: Made `num_intermediates' variable unsigned.
	(remove_intermediates): Removed unused FORMAT arg.
	(enter_file): Made it handle double-colon files properly, adding the
	new entry as the old entry's prev pointer.

	* dir.c: Re-indented the `struct dir' definition to be right.
	(dir_load): Cleaned up slighty.
	(file_exists_p): Removed comment saying we could use `access', since
	that is a bad idea (except for setuid programs).  Cleaned up slightly.

	* commands.c: Changed some comments slightly.
	(execute_file_commands): Cleaned up a bit.  Changed some comments,
	added others.  Moved freeing of storage for $^ and $? to the same
	place as for the other automatic variables.
	(execute_command_line): Made `#' trigger a shell.
	Added some comments.  Cleaned up a bit.  Put all the special chars
	that trigger shells into an array easily changeable at the top.

	* ar.c: Added comments explaining each function.
	(ar_scan_1): Merged into ar_member_date.
	(ar_member_date): Changed call to ar_scan_1 to the body of that
	function.
	(ar_member_date_1): Simplified to a ?: expression rather than an
	if-else statement.
	(ar_member_touch): Changed error handling around a bit.
	None of these errors are fatal now.

	* variable.c (subst_expand): Added a new arg BY_WORD, to do substs
	only on full words.
	(patsubst_expand): Fixed bug which made calls whose patterns
	contained no `%' to not work correctly, by using above.
	(variable_expand): Pass extra arg to `subst_expand'.

	* variable.c (expand_function): Fixed bug which made `foreach' calls
	with one-word lists run off into never-never land.

Fri Jul 29 20:12:36 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* variable.c (expand_function): Made a very minor speed improvement
	by avoiding an unnecessary strlen call.

Wed Jul 27 16:01:47 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* rule.c (default_suffixes): Rearranged the list somewhat; added
	`.el' and `.elc' to speed things up (especially when building
	Emacs), for the same reason `.h' is there.

	* read.c (record_files): Changed `lineno' from `long' to
	`unsigned int'.

Sun Jul 24 02:15:30 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* variable.c (expand_function): Eliminated use of `wstok'
	because it is non-reentrant and unreliable.
	Fixed a minor bug which would cause something not to be freed.
	* make.c (wstok): Removed `wstok' because it is no longer used.

	* variable.c (expand_function): Made `foreach' function put
	spaces between output texts like it's supposed to.
	
Sat Jul 23 17:32:55 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* rule.c (default_suffixes, default_suffix_rules): Added rule
	to make %.dvi from %.texinfo.

	* dir.c (print_dir_data_base): Made it say a bit more.

Fri Jul 22 23:13:16 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* make.c (print_data_base): Split this function up into one
	for each thing.
	* variable.c (print_variable_data_base): One of the above.
	* rule.c (print_rule_data_base): Ditto.
	* file.c (print_file_data_base): Ditto.
	* dir.c (print_dir_data_base): Ditto.

	* rule.c (install_pattern_rule): Fixed a bug which caused the
	terminal and recursive flags to always be zero for rules
	entered by this function.

	* make.texinfo (Rules: Double-colon): Added a paragraph
	explaining the purpose of double-colon rules.

	* make.texinfo (Implicit: Catalogue of Rules): Updated to
	reflect new C++, TeX, Web, and Texinfo rules.  Other slight
	editorial changes.

	* commands.c (execute_file_commands): Fixed a bug wherein
	random memory could get written for files with no deps.
	
Wed Jul 20 19:30:31 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* read.c (readline): Fix bug wherein it would not recognize a
	backslash-newline if the buffer filled up and was enlarged
	right before reading the newline.
	
Tue Jul 19 19:55:02 1988  Roland McGrath  (mcgrath at chilli.Berkeley.EDU)

	* read.c: Added default suffix rules for .cc (using $(C++),
	which defaults to `g++', and $(C++FLAGS)), .tex, .dvi, .web
	and .cweb (using $(TEX), $(WEAVE), $(TANGLE), $(CWEAVE) and
	$(CTANGLE)).
	
Sat Jul 16 21:24:28 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Made error formats use %u rather than %ld for line numbers,
	which are now unsigned int's rather than long's.

	* read.c (conditional_line): Fixed some bugs caused by use of
	unsigned int rather than int in one place.

	* read.c (conditional_line): Put the info about active
	conditionals in a struct.
	(read_makefile): Make a new struct of info about conditionals
	for included makefiles and restore the old one after the
	included makefile has been read.

	* read.c (read_makefile): Don't try to read a makefile with
	name "" after giving an error message because an `include'
	directive gave no filename.

	* read.c (read_makefile): Give an error message for
	non-whitespace text after the filename in an `include' directive.

	* make.c (error): Take five args, like `fatal'.  It managed to
	lose with only two.  Is there a better way to do this without vfprintf?

	* read.c (read_makefile): Commands consisting of only
	whitespace are not the same as no commands.  I thought I'd
	fixed this bug months ago; it seems to have come back.

	* make.c (collapse_continuations): All whitespace around a
	backslash-newline combination is turned into a single space.

	* Added COPYING file and copyright notices to all files.

	* make.texinfo (Running: Goals): Fix a typo.

	* read.c (do_define): Take an arg for the origin of the
	variable being defined.
	(read_makefile): Grok `override define'.

	* make.texinfo (Variables: Override Directive, Defining):
	Document the `override define' combination directive.

	* ar.c (ar_member_date): Make a 0 return from `ar_scan' return
	(time_t) -1 (nonexistent file), rather than (time_t) 0, which,
	when put in the `struct file', makes `file_mtime' try to get
	the mtime over and over again.

	* variable.c (pattern_matches): Fix a bug that made patterns
	not beginning with `%' never match.
	
Fri Jul 15 21:01:44 1988  Roland McGrath  (mcgrath at tully.Berkeley.EDU)

	* Took Make out of RCS.

	* Split the monolithic `make.c' into several smaller files.
