Wed Apr 19 03:25:54 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.73.1.

Sat Apr  8 14:53:24 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* remake.c (notice_finished_file): Set FILE->update_status to zero
 	if it's -1.

Wed Apr  5 00:20:24 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.73 released.

Tue Mar 28 13:25:46 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Fixed braino in assert.

	* Version 3.72.13.

Mon Mar 27 05:29:12 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c: Avoid string in assert expression.  Some systems are broken.

Fri Mar 24 00:32:32 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Handle 1 and 2 returns from update_goal_chain
 	makefile run properly.

	* Version 3.72.12.

	* main.c (handle_non_switch_argument): New function, broken out of
 	decode_switches.
	(decode_switches): Set optind to 0 to reinitialize getopt, not to 1.
	When getopt_long returns EOF, break the loop and handle remaining args
 	with a simple second loop.

	* remake.c (remake_file): Set update_status to 2 instead of 1 for
 	no rule to make.  Mention parent (dependent) in error message.
	(update_file_1): Handle FILE->update_status == 2 in -d printout.
	* job.c (start_job_command, reap_children): Set update_status to 2
 	instead of 1 for failed commands.

Tue Mar 21 16:23:38 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* job.c (search_path): Function removed (was already #if 0'd out).
	* configure.in: Remove AC_TYPE_GETGROUPS; nothing needs it any more.

Fri Mar 17 15:57:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* configure.bat: Write @CPPFLAGS@ translation.

Mon Mar 13 00:45:59 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* read.c (parse_file_seq): Rearranged `l(a b)' -> `l(a) l(b)' loop
 	to not skip the elt immediately preceding `l(...'.

Fri Mar 10 13:56:49 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.11.

	* read.c (find_char_unquote): Make second arg a string of stop
 	chars instead of a single stop char.  Stop when any char in the
 	string is hit.  All callers changed.
	(find_semicolon): Pass stop chars "#;" to one find_char_unquote call,
	instead of using two calls.  If the match is not a ; but a #,
 	return zero.
	* misc.c: Changed find_char_unquote callers here too.

	* Version 3.72.10.

	* read.c (read_makefile, parse_file_seq): Fix typo __MS_DOS__ ->
 	__MSDOS__.

	* GNUmakefile (globfiles): Add glob/configure.bat.
	(distfiles): Add configh.dos, configure.bat.

Wed Mar  8 13:10:57 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	Fixes for MS-DOS from DJ Delorie.
	* read.c (read_makefile, parse_file_seq) [__MS_DOS__]: Don't see :
 	as separator in "C:\...".
	* configh.dos (STDC_HEADERS): Define only if undefined.
	(HAVE_SYS_PARAM_H): Don't define this.
	(HAVE_STRERROR): Define this.
	* job.c (construct_command_argv_internal) [__MSDOS__]: Fix typos.

	* Version 3.72.9.

	* main.c (decode_switches): Reset optind to 1 instead of 0.

Tue Mar  7 17:31:06 1995  Roland McGrath  <roland@geech.gnu.ai.mit.edu>

	* main.c (decode_switches): If non-option arg is "-", ignore it.

Mon Mar  6 23:57:38 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.8.

Wed Feb 22 21:26:36 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.7.

Tue Feb 21 22:10:43 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Pass missing arg to tmpnam.

	* configure.in: Check for strsignal.
	* job.c (child_error): Use strsignal.
	* main.c (main): Don't call signame_init #ifdef HAVE_STRSIGNAL.

	* misc.c (strerror): Fix swapped args in sprintf.

Mon Feb 13 11:50:08 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* configure.in (CFLAGS, LDFLAGS): Don't set these variables.

Fri Feb 10 18:44:12 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (print_version): Add 95 to copyright years.

	* Version 3.72.6.

	* job.c (start_job_command): Remember to call notice_finished_file
 	under -n when not recursing.  To do this, consolidate that code
 	under the empty command case and goto there for the -n case.

Tue Feb  7 13:36:03 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* make.h [! STDC_HEADERS]: Don't declare qsort.  Sun headers
 	declare it int.

Mon Feb  6 17:37:01 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* read.c (read_makefile): For bogus line starting with tab, ignore
 	it if blank after removing comments.

	* main.c: Cast results of `alloca' to `char *'.
	* expand.c: Likewise.

Sun Feb  5 18:35:46 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.5.

	* configure.in: Check for mktemp.
	* main.c (main) [! HAVE_MKTEMP]: Use tmpnam instead of mktemp.

	* configure.in (make_cv_sysconf_open_max): New check for `sysconf
 	(_SC_OPEN_MAX)'.
	* acconfig.h: Added #undef HAVE_SYSCONF_OPEN_MAX.
	* job.c [HAVE_SYSCONF_OPEN_MAX] (getdtablesize): Define as macro
 	using sysconf.

Fri Jan 27 04:42:09 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* remake.c (update_file_1): When !MUST_MAKE, don't set
 	FILE->update_status to zero before calling notice_finished_file.
	(notice_finished_file): Touch only when FILE->update_status is zero.
	(remake_file): Set FILE->update_status to zero after not calling
	execute_file_command and deciding to touch instead.

Thu Jan 26 01:29:32 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (debug_signal_handler): New function; toggles debug_flag.
	(main): Handle SIGUSR1 with that.

Mon Jan 16 15:46:56 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* compatMakefile (realclean): Remove Info files.

Sun Jan 15 08:23:09 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.4.

	* job.c (start_job_command): Save and restore environ around vfork
        call.
	(search_path): Function #if 0'd out.
	(exec_command): Use execvp instead of search_path.

	* expand.c (variable_expand): Rewrote computed variable name and
	substitution reference handling to be simpler.  First expand the
	entire text between the parens if it contains any $s, then examine
	the result of that for subtitution references and do no further
	expansion while parsing them.

	* job.c (construct_command_argv_internal): Handle " quoting too,
	when no backslash, $ or ` characters appear inside the quotes.

	* configure.in (union wait check): If WEXITSTATUS and WTERMSIG are
        defined, just use int.

Tue Jan 10 06:27:27 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* default.c (default_variables) [__hpux]: Remove special
	definition of ARFLAGS.  Existence of the `f' flag is not
	consistent across HPUX versions; and one might be using GNU ar
	anyway.

	* compatMakefile (clean): Don't remove Info files.

	* compatMakefile (check): Remove gratuitous target declaration.

Sat Jan  7 11:38:23 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* compatMakefile (ETAGS, CTAGS): Don't use -t.

	* arscan.c (ar_name_equal) [cray]: Subtract 1 like [__hpux].

	* main.c (decode_switches): For --help, print usage to stdout.

Mon Dec  5 12:42:18 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.3.

	* remake.c (update_file_1): Do set_command_state (FILE,
	cs_not_started) only if old state was deps_running.

Mon Nov 28 14:24:03 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* job.c (start_waiting_job): Use set_command_state.

	* build.template (CPPFLAGS): New variable.
	(prefix, exec_prefix): Set from @...@.
	(compilation loop): Pass $CPPFLAGS to compiler.

	* GNUmakefile (build.sh.in): Make it executable.

	* GNUmakefile (globfiles): Add configure.in, configure.

	* Version 3.72.2.

	* configure.in (AC_OUTPUT): Don't write glob/Makefile.

	* configure.in (AC_CHECK_SYMBOL): Use AC_DEFINE_UNQUOTED.

	* configure.in: Don't check for ranlib.

Tue Nov 22 22:42:40 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* remake.c (notice_finished_file): Only mark also_make's as
	updated if really ran cmds.

Tue Nov 15 06:32:46 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* configure.in: Put dnls before random whitespace.

Sun Nov 13 05:02:25 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* compatMakefile (CPPFLAGS): New variable, set from @CPPFLAGS@.
	(RANLIB): Variable removed.
	(prefix, exec_prefix): Set these from @...@.
	(.c.o): Use $(CPPFLAGS).
	(glob/libglob.a): Don't pass down variables to sub-make.
	glob/Makefile should be configured properly by configure.
	(distclean): Remove config.log and config.cache (autoconf stuff).

Mon Nov  7 13:58:06 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* acconfig.h: Add #undef HAVE_UNION_WAIT.
	* configure.in: Converted to Autoconf v2.
	* dir.c: Test HAVE_DIRENT_H, HAVE_SYS_DIR_H, HAVE_NDIR_H instead
	of DIRENT, SYSDIR, NDIR.
	* build.sh.in (prefix, exec_prefix): Set these from @...@.
	(CPPFLAGS): New variable, set from @CPPFLAGS@.
	(compiling loop): Pass $CPPFLAGS before $CFLAGS.
	* install.sh: File renamed to install-sh.

	* main.c (define_makeflags): When no flags, set WORDS to zero.

Sun Nov  6 18:34:01 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.1.

	* main.c (define_makeflags): Terminate properly when FLAGSTRING is
        empty.

Fri Nov  4 16:02:51 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.72.

Tue Nov  1 01:18:10 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.71.5.

	* job.c (start_job_command): When ARGV is nil, only set
	update_state and call notice_finished_file if job_next_command
	returns zero.

	* job.c (start_job_command): Call notice_finished_file for empty
        command line.

Thu Oct 27 02:02:45 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* file.c (snap_deps): Set COMMANDS_SILENT for .SILENT, not
        COMMANDS_NOERROR.

Wed Oct 26 02:14:10 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.71.4.

Tue Oct 25 22:49:24 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* file.c (snap_deps): Set command_flags bits in all :: entries.

Mon Oct 24 18:47:50 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* make.h (posix_pedantic): Declare it.
	* main.c (main): Move checks .IGNORE, .SILENT, .POSIX to
        snap_deps.
	* file.c (snap_deps): Check .IGNORE, .SILENT, .POSIX here instead
	of in main.  If .IGNORE has deps, OR COMMANDS_NOERROR into their
	command_flags and don't set -i.  Likewise .SILENT.
	* job.c (start_job_command): In FLAGS initialization, OR in
	CHILD->file->command_flags.
	* file.h (struct file): New member `command_flags'.

Sun Oct 16 01:01:51 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (switches): Bump flag values for --no-print-directory and
	--warn-undefined-variables, so neither is 1 (which indicates a
	nonoption argument).

Sat Oct 15 23:39:48 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Add missing code in .IGNORE test.

Mon Oct 10 04:09:03 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* variable.c (define_automatic_variables): Define +D and +F.

Sat Oct  1 04:07:48 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Define hidden automatic variable with command
	vars, and MAKEOVERRIDES to a reference to that.
	(define_makeflags): If posix_pedantic, write a reference to that
	instead.

Thu Sep 29 00:14:26 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (posix_pedantic): New variable.
	(main): Set posix_pedantic if .POSIX is a target.
	Fix .IGNORE and .SILENT checks to require is_target.

	* commands.c (set_file_variables): Define new automatic variable
	$+, like $^ but before calling uniquize_deps.

	* job.c (reap_children): Call delete_child_targets for non-signal
	error if .DELETE_ON_ERROR is a target.

Tue Sep 27 01:57:14 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.71.3.

Mon Sep 26 18:16:55 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* job.c (reap_children): Don't change C->file->command_state when
	dying.  Test it only after calling start_job_command for a new
	command line.  When no more cmds, just set C->file->update_status.
	(start_job_command): When the last line is empty or under -n, set
	C->file->update_status.
	(start_waiting_job): Grok cs_not_started after start_job_command
	as success.
	(new_job): Set C->file->update_status when there are no cmds.
	(job_next_command): When out of lines, don't set
	CHILD->file->update_status or CHILD->file->command_state.

	* main.c (quote_as_word): Renamed from shell_quote.  Take new arg;
	if nonzero, also double $s.
	(main): Define MAKEOVERRIDES from command_variables here.
	(define_makeflags): Don't use command_variables here; instead write a
	reference $(MAKEOVERRIDES) in MAKEFLAGS.  Make vars recursive.

	* dir.c [__MSDOS__]: Fixed typo.

	* vpath.c (selective_vpath_search): Reset EXISTS when stat fails.

Sat Sep 10 03:01:35 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* remake.c: Include <assert.h> and use assert instead of printfs
        and abort.

	* main.c (decode_switches): Loop until optind hits ARGC, not just
	until getopt_long returns EOF.  Initialize C to zero before loop;
	in loop if C is EOF, set optarg from ARGV[optind++], else call
	getopt_long.
	(decode_env_switches): Use variable_expand instead of
	allocated_variable_expand.  Allocate a fresh buffer to copy split
	words into; scan characters by hand to break words and
	debackslashify.
	(shell_quote): New function.
	(define_makeflags): Allocate doubled space for switch args, and command
	variable names and values; use shell_quote to quote those things.

Fri Sep  9 01:37:47 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.71.2.

	* acconfig.h: Add HAVE_SYS_SIGLIST and HAVE__SYS_SIGLIST.

	* main.c (decode_switches): The non-option return from getopt is
	1, not 0.
	(command_variables): New type and variable.
	(decode_switches, decode_env_switches): After making a variable
	definition, record the struct variable pointer in the
	command_variables chain.
	(define_makeflags): If ALL, write variable definitions for
	command_variables.

	* main.c (other_args): Variable removed.
	(goals, lastgoal): New static variables (moved from auto in main).
	(main): Don't process OTHER_ARGS at all.
	Don't set variable MAKEOVERRIDES at all; define MAKE to just
        $(MAKE_COMMAND).
	(init_switches): Prepend a - {return in order} instead of a +
	{require order}.
	(decode_switches): Don't set OTHER_ARGS at all.
	Grok '\0' return from getopt_long as non-option argument; try
	variable definition and (if !ENV) enter goal targets here.
	(decode_env_switches): Use allocated_variable_expand to store value.
	Use find_next_token to simplify word-splitting loop.  Don't
	prepend a dash to uninterpreted value.  Instead, if split into
	only one word, try variable definition and failing that prepend a
	dash to the word and pass it to decode_switches as a single arg.

Wed Sep  7 03:02:46 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* remake.c (notice_finished_file): Only recheck modtimes if
	FILE->command_state was cs_running on entry (meaning the commands
	actually just ran).
	(update_file_1): Whenever we set FILE->update_status, call
	notice_finished_file instead of just set_command_state.
	* job.c (start_job_command): Whenever we set
	CHILD->file->update_status, call notice_finished_file instead of
	just set_command_state.

Tue Sep  6 19:13:54 1994  Roland McGrath  <roland@geech.gnu.ai.mit.edu>

	* default.c: Add missing ".

	* job.c: Changed all assignments of command_state members to calls
	to set_command_state.
	* remake.c: Likewise.
	* file.c (set_command_state): New function.
	* file.h: Declare set_command_state.

	* main.c (init_switches): Put a + first in options.

Mon Jul 25 18:07:46 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	Merge MSDOS/GO32 port from DJ Delorie <dj@ctron.com>.
	* vpath.c: Changed all uses of ':' to PATH_SEPARATOR_CHAR.
	* main.c (directory_before_chdir): New variable, moved out of main
        (was local).
	(main) [__MSDOS__]: Look for \ or : to delimit last component of
	PROGRAM.  Don't frob ARGV[0] before setting MAKE_COMMAND variable.
	(die): Change back to `directory_before_chdir' before dying.
	* make.h (PATH_SEPARATOR_CHAR): New macro; differing defns for
        [__MSDOS__] and not.
	* job.c [__MSDOS__]: Include <process.h>.
	[__MSDOS__] (dos_pid, dos_status, dos_bname, dos_bename,
	dos_batch_file): New variables.
	(reap_children) [__MSDOS__]: Don't call wait; just examine those vars.
	(unblock_sigs) [__MSDOS__]: Do nothing.
	(start_job_command) [__MSDOS__]: Use spawnvpe instead of vfork & exec.
	(load_too_high) [__MSDOS__]: Always return true.
	(search_path) [__MSDOS__]: Check for : or / in FILE to punt.
	Use PATH_SEPARATOR_CHAR instead of ':'.
	(construct_command_argv_internal) [__MSDOS__]: Wholly different
	values for sh_chars and sh_cmds.  Wholly new code to handle shell
	scripts.
	* function.c (expand_function: `shell') [__MSDOS__]: Wholly new
        implementation.
	* dir.c [__MSDOS__] (dosify): New function.
	(dir_contents_file_exists_p) [__MSDOS__]: Call it on FILENAME and
	process the result instead of FILENAME itself.
	(file_impossible_p) [__MSDOS__]: Likewise.
	* default.c [__MSDOS__]: Define GCC_IS_NATIVE.
	(default_suffix_rules) [__MSDOS__]: Use `y_tab.c' instead of `y.tab.c'.
	(default_variables) [GCC_IS_NATIVE]: Set CC and CXX to `gcc', YACC to
	`bison -y', and LEX to `flex'.
	* configure.bat, configh.dos: New files.
	* commands.c (fatal_error_signal) [__MSDOS__]: Just remove
	intermediates and exit.

	* commands.c (set_file_variables): Add parens in length
	computation in .SUFFIXES dep loop to quiet compiler warning.  From
	Jim Meyering.

	* read.c (read_makefile): Free FILENAME if we allocated it.  From
        Jim Meyering.

Mon Jul  4 17:47:08 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* misc.c (safe_stat): New function, EINTR-safe wrapper around stat.
	* vpath.c (selective_vpath_search): Use safe_stat in place of stat.
	* read.c (construct_include_path): Use safe_stat in place of stat.
	* job.c (search_path): Use safe_stat in place of stat.
	* dir.c (find_directory): Use safe_stat in place of stat.
	* commands.c (delete_target): Use safe_stat in place of stat.
	* arscan.c (ar_member_touch) [EINTR]: Do EINTR looping around fstat.
	* remake.c (name_mtime): Use safe_stat in place of stat.
	(touch_file) [EINTR]: Do EINTR looping around fstat.

Fri Jun 24 05:40:24 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Check for a shell command first, and
	then strip leading tabs before further checking if it's not a
	shell command line.

	* make.h [__arm]: Undefine POSIX.
	[!__GNU_LIBRARY__ && !POSIX && !_POSIX_VERSION]: Don't declare system
	functions that return int.

	* job.c (construct_command_argv_internal): After swallowing a
	backslash-newline combination, if INSTRING is set goto string_char
	(new label) for normal INSTRING handling code.

Sat Jun  4 01:11:20 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* configure.in: Don't check for sys_siglist and _sys_siglist with
	AC_HAVE_FUNCS.  Instead use two AC_COMPILE_CHECKs.

Mon May 23 18:20:38 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.71.1 released.

	* make.h [!__GNU_LIBRARY__ && !POSIX]: Also test #ifndef
	_POSIX_VERSION for these declarations.

	* misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Remove bogus #ifndefs
	around #undefs of HAVE_SETREUID and HAVE_SETREGID.

Sat May 21 16:26:38 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.71 released.

	* misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Don't test [HAVE_SETUID]
	and [HAVE_SETGID].  Every system has those, and configure doesn't
	check for them.

	* make.h [_POSIX_VERSION]: Don't #define POSIX #ifdef ultrix.

	* compatMakefile (loadavg): Depend on and use loadavg.c instead of
	getloadavg.c.
	(loadavg.c): Link or copy it from getloadavg.c.
	(distclean): Remove loadavg.c.

Mon May 16 22:59:04 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.70.4.

	* misc.c [GETLOADAVG_PRIVILEGED] [! POSIX]: Undefine HAVE_SETEUID
	and HAVE_SETEGID.

	* default.c (default_terminal_rules): In SCCS rules, put
	$(SCCS_OUTPUT_OPTION) before $<.  On some systems -G is grokked
	only before the file name.
	* configure.in (SCCS_GET_MINUS_G check): Put -G flag before file name.

Tue May 10 16:27:38 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Swallow
	backslash-newline combinations inside '' strings too.

Thu May  5 04:15:10 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (do_define): Call collapse_continuations on each line
	before all else.

Mon Apr 25 19:32:02 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Notice newline inside
	'' string when RESTP is non-null.

Fri Apr 22 17:33:30 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.70.3.

	* remake.c (update_goal_chain): Reset FILE to G->file after the
	double-colon loop so it is never null for following code.

	* read.c (read_makefile): Fix `override define' parsing to skip
	whitespace after `define' properly.

	* compatMakefile (srcdir): Define as @srcdir@; don't reference
	$(VPATH).
	(glob/Makefile): New target.

Thu Apr 21 16:16:55 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.70.2.

	* misc.c (remove_comments): Use find_char_unquote.
	* make.h (find_char_unquote): Declare it.
	* read.c (find_char_unquote): New function, generalized from
	find_percent.
	(find_percent, find_semicolon, parse_file_seq): Use that.

Wed Apr 20 18:42:39 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* implicit.c (pattern_search): Always allocate new storage for
	FILE->stem.  It is not safe to store STEM's address because it
	might be auto storage.

	* configure.in: Check for seteuid and setegid.
	* misc.c [HAVE_SETEUID]: Declare seteuid.
	[HAVE_SETEGID]: Declare setegid.
	(make_access, user_access) [HAVE_SETEUID]: Use seteuid.
	[HAVE_SETEGID]: Use setegid.

	* remake.c (update_goal_chain): Set STATUS to FILE->update_status,
	to preserve whether it's 2 for error or 1 for -q trigger.  When
	STATUS gets nonzero and -q is set, always stop immediately.
	* main.c (main, decode_switches): Die with 2 for errors.
	(main): Accept 2 return from update_goal_chain and die with that.
	* misc.c (fatal, makefile_fatal): Die with 2; 1 is reserved for -q
	answer.
	* job.c (reap_children): Die with 2 for error.
	(start_job_command): Set update_status to 2 for error.  Set it to
	1 when we would run a command and question_flag is set.

	* read.c (read_makefile): Don't mark makefiles as precious.  Just
	like other targets, they can be left inconsistent and in need of
	remaking by aborted commands.

	* read.c (read_makefile): Write no error msg for -include file.

Tue Apr  5 05:22:19 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* commands.c (fatal_error_signal): Don't unblock signals.

	* file.h (struct file): Change member `double_colon' from flag to
	`struct file *'.
	* read.c (record_files): Set double_colon pointer instead of flag.
	* main.c (main): When disqualifying makefiles for updating, use
	double_colon pointer to find all entries for a file.
	* file.c (enter_file): If there is already a double-colon entry
	for the file, set NEW->double_colon to that pointer.
	(file_hash_enter): Use FILE->double_colon to find all entries to
	set name.
	* remake.c (update_goal_chain): Do inner loop on double-colon entries.
	(update_file): Use FILE->double_colon pointer to find all entries.
	(f_mtime): Likewise.
	(notice_finished_file): Propagate mtime change to all entries.

	* variable.c (try_variable_definition): Return after abort.

Fri Apr  1 18:44:15 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Remove unused variable.
	(parse_file_seq): When removing an elt that is just `)', properly
	fix up the previous elt's next pointer.

Mon Mar 28 18:31:49 1994  Roland McGrath  (roland@mole.gnu.ai.mit.edu)

	* configure.in: Do AC_SET_MAKE.
	* GNUmakefile (Makefile.in): Edit MAKE assignment into @SET_MAKE@.

Fri Mar  4 00:02:32 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* function.c (subst_expand): If BY_WORD or SUFFIX_ONLY is set and
	the search string is the empty string, find a match at the end of
	each word (using end_of_token in place of sindex).

	* misc.c (end_of_token): Don't treat backslashes specially; you
	can no longer escape blanks with backslashes in export, unexport,
	and vpath.  This was never documented anyway.

Thu Mar  3 23:53:46 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Variable name for `define' is not just
	first token; use whole rest of line and strip trailing blanks.

Wed Feb 16 16:03:45 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.70.1.

	* read.c (read_makefile): Add -d msg stating args.

	* read.c (read_makefile): Use isspace to skip over leading
	whitespace, and explicitly avoid skipping over tabs.  Don't want
	to skip just spaces though; formfeeds et al should be skipped.

	* default.c (default_variables) [__hpux]: Add f in ARFLAGS.

	* arscan.c (ar_name_equal) [__hpux]: Subtract 2 instead of 1 from
	sizeof ar_name for max length to compare.

	* misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Undefine HAVE_SETREUID
	#ifdef HAVE_SETUID; likewise HAVE_SETREGID and HAVE_SETGID.

	* main.c (main): Call user_access after setting `program', in case
	it needs to use it in an error message.

	* read.c (read_makefile): Ignore an empty line starting with a tab.

Thu Feb 10 21:45:31 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in (AC_SYS_SIGLIST_DECLARED): Use this instead of
	AC_COMPILE_CHECK that is now its contents.

Fri Feb  4 16:28:54 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h: #undef strerror after #include <string.h>.
	[! ANSI_STRING]: Declare strerror.

Thu Feb  3 02:21:22 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* misc.c (strerror): #undef any macro before function definition.

Mon Jan 31 19:07:23 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.c (try_variable_definition): Calculate BEG before loop
	to strip blanks by decrementing END.  Don't decr END to before BEG.

	* read.c (read_makefile): Skip over leading space characters, but
	not tabs, after removing continuations and comments (it used to
	use isspace).

Tue Jan 25 16:45:05 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.c (define_automatic_variables): In $(@D) et al, use
	patsubst to remove trailing slash.

	* commands.c (delete_target): New function, broken out of
	delete_child_targets.  Check for archive members and give special msg.
	(delete_child_targets): Use delete_target.

Mon Jan 17 17:03:22 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* default.c (default_suffix_rules): Use $(TEXI2DVI_FLAGS) in
	texi2dvi rules.	Use $(MAKEINFO_FLAGS) in makeinfo rules.

Tue Jan 11 19:29:55 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* GNUmakefile (tarfiles): Omit make-doc.
	(make-$(version).tar): Include make.info*.

Fri Jan  7 16:27:00 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (configure, config.h.in): Comment out rules.

Thu Jan  6 18:08:08 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (binprefix, manprefix): New variables.
	(instname): Variable removed.
	(install): Use $({bin,man}prefix)make in place of $(instname).
	File targets likewised renamed.

Mon Jan  3 17:50:25 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.70 released.

Thu Dec 23 14:46:54 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.69.3.

	* read.c (parse_file_seq): Inside multi-word archive ref
	translation loop, check NEW1==0 at end and break out of the loop.

	* GNUmakefile (make-$(version).tar): Distribute install.sh.
	* install.sh: New file.

	* configure.in (SCCS_GET_MINUS_G check): Put redirection for admin
	cmds outside subshell parens, to avoid "command not found" msgs
	from the shell.

Wed Dec 22 17:00:43 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in (SCCS_GET_MINUS_G check): Put -G flag last in get cmd.
	Redirect output & error from get to /dev/null.
	Fix reversed sense of test.

Fri Dec 17 15:31:36 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in (SCCS_GET_MINUS_G check): Use parens instead of
	braces inside if condition command; some shells lose.

Thu Dec 16 15:10:23 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.69.2.

	* arscan.c [M_UNIX]: Move #undef M_XENIX for PORTAR stuff.
	(PORTAR) [M_XENIX]: Define to 0 instead of 1.

	* main.c (define_makeflags): Only export MAKEFLAGS if !ALL.

Wed Dec 15 17:47:48 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (main): Cast result of pointer arith to unsigned int
	before passing to define_variable for envars.  Matters when
	sizeof(unsigned)!=sizeof(ptrdiff_t).

Tue Dec 14 14:21:16 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in: Add new check for SCCS_GET_MINUS_G.
	* config.h.in: Add #undef SCCS_GET_MINUS_G.
	* default.c (default_terminal_rules): Use `$(SCCS_OUTPUT_OPTION)' in
	place of `-G $@' in SCCS commands.
	(default_variables) [SCCS_GET_MINUS_G]: Define SCCS_OUTPUT_OPTION
	to "-G$@".

	* configure.in (AC_OUTPUT): Put touch stamp-config in second arg
	(so it goes in config.status), rather than afterward.

	* ar.c (ar_member_date): Don't call enter_file on the archive file
	if it doesn't exist (by file_exists_p).

	* compatMakefile ($(infodir)/make.info): Replace `$$d/foo.info'
	with `$$dir/make.info' in install-info invocation (oops).

	* vpath.c (construct_vpath_list): Only set LASTPATH set PATH when
	we do not unlink and free PATH.

	* file.c (print_file_data_base): Fix inverted calculation for
	average files per hash bucket.

	* read.c (readline): When we see a NUL, give only a warning and
	synthesize a newline to terminate the building line (used to
	fatal).  Move fgets call into the loop condition, and after the
	loop test ferror (used to test !feof in the loop).

Fri Dec  3 16:40:31 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in: Check for strerror in AC_HAVE_FUNCS.

Thu Dec  2 15:37:50 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	Differentiate different flavors of missing makefile error msgs,
	removing gratuitous `fopen: ' and giving caller for included makefiles.
	* misc.c [! HAVE_STRERROR]: Define our own strerror here.
	(perror_with_name, pfatal_with_name): Use strerror instead of
	replicating its functionality.
	* read.c (read_makefile): Return int instead of void.
	(read_all_makefiles, read_makefile): Change callers to notice zero
	return and give error msg.

Thu Nov 11 11:47:36 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.69.1.

	* default.c: Put `-G $@' before $< in SCCS cmds.

Wed Nov 10 06:06:14 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): After trying a variable defn, notice if
	the line begins with a tab, and diagnose an error.

Sun Nov  7 08:07:37 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.69.

Wed Nov  3 06:54:33 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.10.

	* implicit.c (try_implicit_rule): Look for a normal rule before an
	archive rule.

Fri Oct 29 16:45:28 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* function.c (expand_function: `sort'): Double NWORDS when it
	overflows, instead of adding five.

	* compatMakefile (clean): Remove loadavg.

Wed Oct 27 17:58:33 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.9.

	* file.h (NEW_MTIME): Define new macro.
	* main.c (main): Set time of NEW_FILES to NEW_MTIME, not to
	current time returned from system.  Removed variable NOW.
	* remake.c (notice_finished_file): Use NEW_MTIME in place of
	current time here too.

Tue Oct 26 19:45:35 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.8.

	* remake.c (update_file_1): Don't clear MUST_MAKE when FILE has no
	cmds and !DEPS_CHANGED unless also !NOEXIST.

Mon Oct 25 15:25:21 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (parse_file_seq): When converting multi-word archive
	refs, ignore a word beginning with a '('.

Fri Oct 22 02:53:38 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in: Check for sys/timeb.h.
	* make.h [HAVE_SYS_TIMEB_H]: Test this before including it.

Thu Oct 21 16:48:17 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.7.

	* rule.c (convert_suffix_rule): New local TARGPERCENT.  Set it to
	TARGNAME+1 for "(%.o)", to TARGNAME for "%.?".  Use it in place of
	TARGNAME to initialize PERCENTS[0].

Mon Oct 18 06:49:35 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in: Use AC_HAVE_HEADERS(unistd.h) instead of AC_UNISTD_H.
	Remove AC_USG; it is no longer used.

	* file.c (print_file): New function, broken out of
	print_file_data_base.
	(print_file_data_base): Call it.
	* rule.c (print_rule): New function, broken out of
	print_rule_data_base.
	(print_rule_data_base): Call it.

Thu Oct 14 14:54:03 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* default.c (install_default_suffix_rules): New function, broken
	out of install_default_implicit_rules.
	(install_default_implicit_rules): Move suffix rule code there.
	* make.h: Declare install_default_suffix_rules.
	* main.c (main): Call install_default_suffix_rules before reading
	makefiles.  Move convert_to_pattern call before
	install_default_implicit_rules.

	* job.h (struct child): Make `pid' member type `pid_t' instead of
	`int'.

	* compatMakefile (RANLIB): New variable, set by configure.
	(glob/libglob.a): Pass RANLIB value down to submake.

	Fixes for SCO 3.2 "devsys 4.2" from pss@tfn.com (Peter Salvitti).
	* make.h: Include <sys/timeb.h> before <time.h> for SCO lossage.
	* job.c [! getdtablesize] [! HAVE_GETDTABLESIZE]: If NOFILE is not
	defined but NOFILES_MAX is, define it to be that.

Mon Oct 11 19:47:33 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* GNUmakefile (make-$(version).tar): Depend on acconfig.h, so it
	is distributed.

Sun Oct  3 15:15:33 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* default.c (default_terminal_rules): Add `-G $@' to SCCS get cmds.

Tue Sep 28 14:18:20 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Add ^ to SH_CHARS; it
	is another symbol for | in some shells.
	* main.c (main): Add it to CMD_DEFS quoting list as well.

Mon Sep 20 18:05:24 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Remove '=' from
	SH_CHARS.  Only punt on '=' if it is unquoted in a word before the
	first word without an unquoted '='.

	* main.c (define_makeflags): Set v_export for MAKEFLAGS.

Fri Sep 17 00:37:18 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* remake.c (update_file_1): Use .DEFAULT cmds for phony targets.

	* make.h [_AIX && _POSIX_SOURCE]: Define POSIX.

	* commands.c (delete_child_targets): Don't delete phony files.

	* job.c (start_job_command): Set COMMANDS_RECURSE in FLAGS if we
	see a `+' at the beginning of the command line.

Thu Sep  9 17:57:14 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.6.

Wed Sep  8 20:14:21 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (define_makeflags): Define MAKEFLAGS with o_file, not o_env.

Mon Aug 30 12:31:58 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* expand.c (variable_expand): Fatal on an unterminated reference.

Thu Aug 19 16:27:53 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.5.

	* variable.c (define_automatic_variables): Define new o_default
	variable `MAKE_VERSION' from version_string and remote_description.

	* make.h (version_string, remote_description): Declare these here.
	* main.c: Don't declare version_string.
	(print_version): Don't declare remote_description.

Wed Aug 18 15:01:24 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Free space pointed to by CONDITIONALS
	before restoring the old pointer.

Mon Aug 16 17:33:36 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile ($(objs)): Depend on config.h.

	* GNUmakefile (build.sh.in): Depend on compatMakefile.

	* configure.in: Touch stamp-config after AC_OUTPUT.

Fri Aug 13 16:04:22 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.4.

Thu Aug 12 17:18:57 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h: Include <config.h> instead of "config.h".

Wed Aug 11 02:35:25 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (main): Make all variables interned from ENVP be v_export.
	* variable.c (try_variable_definition): In v_default case, don't
	check for an o_file variable that `getenv' finds.

	* job.c (reap_children): New local variable ANY_LOCAL; set it
	while setting ANY_REMOTE.  If !ANY_LOCAL, don't wait for local kids.

	* main.c (main): Don't call decode_env_switches on MFLAGS.  DOC THIS.

	* function.c (expand_function): #if 0 out freeing of ENVP since it
	is environ.

Mon Aug  9 17:37:20 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.3.

	* remote-stub.c (remote_status): Set errno to ECHILD before return.
	* job.c (reap_children): Scan the chain for remote children and
	never call remote_status if there are none.

	* function.c (expand_function: `shell'): #if 0 out calling
	target_environment; just set ENVP to environ instead.

	* job.c (reap_children): Check for negative return from
	remote_status and fatal for it.
	When blocking local child wait returns 0, then try a blocking call
	to remote_status.

Tue Aug  3 00:19:00 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (clean): Delete make.info* and make.dvi here.
	(distclean): Not here.

	* dep.h (RM_*): Use #defines instead of enum to avoid lossage from
	compilers that don't like enum values used as ints.

Mon Aug  2 16:46:34 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (loadavg): Add $(LOADLIBES).

Sun Aug  1 16:01:15 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.2.

	* compatMakefile (loadavg, check-loadavg): New targets.
	(check): Depend on check-loadavg.

	* compatMakefile (glob/libglob.a): Depend on config.h.

	* misc.c (log_access): Write to stderr instead of stdout.

Fri Jul 30 00:07:02 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.1.

Thu Jul 29 23:26:40 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in (SYS_SIGLIST_DECLARED): In test program include
	<unistd.h> #ifdef HAVE_UNISTD_H.

	* compatMakefile (.PHONY): Put after `all' et al.

	* configure.in: Add AC_IRIX_SUN.

Wed Jul 28 17:41:12 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.68.

Mon Jul 26 14:36:49 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.8.

Sun Jul 25 22:09:08 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.7.

	* compatMakefile ($(infodir)/make.info): Don't use $(instname).
	Run install-info script if present.

Fri Jul 23 16:03:50 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h [STAT_MACROS_BROKEN]: Test this instead of [uts].

	* configure.in: Add AC_STAT_MACROS_BROKEN.

Wed Jul 14 18:48:11 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.6.

	* read.c (read_makefile): Recognize directive `-include', like
	`include' but sets RM_DONTCARE flag.

	* variable.c (target_environment): If FILE is nil, use
	current_variable_set_list in place of FILE->variables.
	* function.c (expand_function: `shell'): Get an environment for
	the child from target_environment instead of using environ.

	* dep.h: Declare read_all_makefiles here.
	(RM_*): Define new enum constants.
	* read.c (read_makefile): Second arg is FLAGS instead of TYPE.
	Treat it as a bit mask containing RM_*.
	(read_all_makefiles): For default makefiles, set D->changed to
	RM_DONTCARE instead of 1.
	* main.c: Don't declare read_all_makefiles here.
	(main): Check `changed' member of read_makefiles elts for RM_*
	flags instead of specific integer values.

Mon Jul 12 22:42:17 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h [sequent && i386]: #undef POSIX.  From trost@cse.ogi.edu.

Thu Jul  8 19:51:23 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* vpath.c (construct_vpath_list): If ELEM is zero 0, free PATTERN
	as well as VPATH.
	(build_vpath_lists): Empty `vpaths' around construct_vpath_list
	call for $(VPATH).  Expand $(strip $(VPATH)), not just $(VPATH).

	* rule.c (convert_suffix_rule): Use alloca instead of xmalloc for
	PERCENTS, whose storage is not consumed by create_pattern_rule.

	* make.h [__mips && _SYSTYPE_SVR3]: #undef POSIX.

Wed Jun 30 18:11:40 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.5.

	* rule.c (max_pattern_targets): New variable.
	(count_implicit_rule_limits): Compute its value.
	* rule.h: Declare it.
	* implicit.c (pattern_search): Make TRYRULES max_target_patterns
	times bigger.  Move adding new TRYRULES elt inside the inner
	targets loop, so each matching target gets its own elt in MATCHES
	and CHECKED_LASTSLASH.

	* file.c (remove_intermediates): If SIG!=0 say `intermediate file'
	instead of just `file' in error msg.

Fri Jun 25 14:55:15 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv): Turn off
	--warn-undefined-variables around expansion of SHELL and IFS.
	* read.c (tilde_expand): Likewise for HOME.
	(read_all_makefiles): Likewise for MAKEFILES.
	* vpath.c (build_vpath_lists): Likewise for VPATH.

	* main.c (warn_undefined_variables_flag): New flag variable.
	(switches): Add --warn-undefined-variables.
	* make.h (warn_undefined_variables_flag): Declare it.
	* expand.c (warn_undefined): New function.
	(reference_variable): Call it if the variable is undefined.
	(variable_expand): In substitution ref, call warn_undefined if the
	variable is undefined.

	* default.c (default_pattern_rules): Add `%.c: %.w %.ch' and
	`%.tex: %.w %.ch' rules.
	(default_suffix_rules: .w.c, .w.tex): Pass three args: $< - $@.
	(default_suffixes): Add `.ch'.

Mon Jun 21 17:55:39 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* default.c (default_suffixes): Replace `.cweb' with `.w'.
	(default_suffix_rules): Rename `.cweb.c' and `.cweb.tex' to `.w.c'
	and `.w.tex'.

Fri Jun 11 14:42:09 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile ($(bindir)/$(instname)): Add missing backslash.

Thu Jun 10 18:14:08 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.4.

	* read.c (multi_glob): Don't free OLD and OLD->name in the
	FOUND!=0 fork.  Use new block-local variable F instead of
	clobbering OLD.

	* ar.c (glob_pattern_p): New function, snarfed from glob/glob.c.
	(ar_glob): Call it; return nil immediately if MEMBER_PATTERN
	contains no metacharacters.

Wed Jun  9 16:25:35 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* ar.c (ar_glob{_match,_alphacompare}): New function.

	* dep.h [! NO_ARCHIVES]: Declare it.
	* read.c (multi_glob) [! NO_ARCHIVES]: Use it on archive member elts.

	* read.c (read_makefile): Pass flag (1) to parse_file_seq, not to
	multi_glob (which doesn't take a 3rd arg).
	* rule.c (install_pattern_rule): Likewise.
	* default.c (set_default_suffixes): Here too.
	* function.c (string_glob): Don't pass gratuitous arg to multi_glob.

	* read.c (parse_file_seq) [! NO_ARCHIVES]: Add post-processing
	loop to translate archive refs "lib(a b)" into "lib(a) lib(b)".

Mon Jun  7 19:26:51 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (installdirs): Actually pass directory names.
	($(bindir)/$(instname)): Test chgrp&&chmod exit status with `if';
	if it fails, echo a warning msg, but don't make the rule fail.

	* read.c (tilde_expand): New function, broken out of tilde_expand.
	(multi_glob): Call it.
	(construct_include_path): Expand ~ in directory names.
	* dep.h: Declare tilde_expand.
	* main.c (enter_command_line_file): Expand ~ at the start of NAME.
	(main): Expand ~ in -C args.
	* read.c (read_makefile): Expand ~ in FILENAME unless TYPE==2.

Fri Jun  4 13:34:47 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (decode_env_switches): Use xmalloc instead of alloca for ARGS.

	* main.c (main): Put result of alloca in temporary variable with
	simple assignment, to make SGI compiler happy.

Thu Jun  3 20:15:46 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.3.

	* main.c (main): Before re-execing, remove intermediate files, and
	print the data base under -p.  Sexier debugging message.

	* implicit.c (pattern_search): Allocate an extra copy of the name
	of a winning intermediate file when putting it in FOUND_FILES.

Wed Jun  2 16:38:08 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Pass flag (1) to parse_file_seq, not to
	multi_glob (which doesn't take a 3rd arg).

	* dir.c (dir_contents_file_exists_p): When reading dirents, ignore
	chars within D_NAMLEN that are NULs.

	* main.c (decode_switches): Don't savestring ARGV[0] to put it
	into `other_args'.
	For string switch, don't savestring `optarg'.
	(main): Don't free elts of makefiles->list that are "-".
	Use alloca'd rather than savestring'd storage for elts of
	makefiles->list that are temporary file names.
	* read.c (read_all_makefiles): Don't free *MAKEFILES.
	* file.c (enter_file): Don't strip `./'s.
	* main.c (enter_command_line_file): New function.
	(main): Use it in place of enter_file for command-line goals from
	other_files, and for old_files and new_files.

Mon May 31 18:41:40 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.2.

	* compatMakefile (.SUFFIXES): Add .info.
	($(infodir)/$(instname).info): Find make.info* in cwd if there,
	else in $srcdir.  Use basename to remove dir name from installed name.

Thu May 27 17:35:02 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* implicit.c (pattern_search): When interning FOUND_FILES, try
	lookup_file first; if found, free the storage for our copy of the name.

Wed May 26 14:31:20 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.1.

	* main.c (decode_switches): In usage msg, write `--switch=ARG' or
	`--switch[=OPTARG]' rather than `--switch ARG' or `--switch [ARG]'.

Mon May 24 16:17:31 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* rule.c (convert_suffix_rule): New function.
	(convert_to_pattern): Use it instead of doing all the work here
	several times.
	For target suffix `.a', generate both the archive magic rule and
	the normal rule.

	* compatMakefile (distclean): Remove stamp-config.

Sat May 22 16:15:18 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.67.

	* file.c (remove_intermediates): Don't write extra space after `rm'.

	* main.c (struct command_switch.type): Remove `usage_and_exit'.
	(print_usage_flag): New variable.
	(switches: --help): Make type `flag', to set print_usage_flag.
	(init_switches): Remove `usage_and_exit' case.
	(decode_switches): Likewise.
	(decode_switches): Print usage if print_usage_flag is set.
	When printing usage, die with status of BAD.
	(main): Die with 0 if print_version_flag.

Fri May 21 16:09:28 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.66.

Wed May 19 21:30:44 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (installdirs): New target.
	(install): Depend on it.

Sun May 16 20:15:07 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.65.2.

Fri May 14 16:40:09 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* vpath.c (construct_vpath_list): In removal loop for DIRPATH==0,
	set LASTPATH to PATH, not NEXT.

	* dir.c (read_dirstream): Break out of loop after incrementing
	DS->buckets such that it reaches DIRFILE_BUCKETS; avoid trying to
	dereference DS->contents->files[DIRFILE_BUCKETS].

	* read.c (read_makefile): Clear no_targets after reading a
	targetful rule line.

	* main.c (main): If print_version_flag is set, exit after printing
	the version.
	(switches): Change --version docstring to say it exits.

	* make.h [butterfly]: #undef POSIX.

Wed May 12 15:20:21 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.65.1.

	* arscan.c (ar_scan) [! AIAMAG]: Don't declare LONG_NAME.
	[AIAMAG]: Pass TRUNCATE flag arg to (*FUNCTION), always zero.

	* function.c (handle_function): Use fatal instead of
	makefile_fatal when reading_filename is nil.

	* configure.in: Add AC_GETGROUPS_T.
	* job.c (search_path): Use GETGROUPS_T in place of gid_t.

Sun May  9 15:41:25 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.65.

Fri May  7 18:34:56 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* function.c (handle_function): Fatal for unmatched paren.

Thu May  6 16:13:41 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.64.3.

	* commands.c (handling_fatal_signal): New variable.
	(fatal_error_signal): Set it.
	* job.c (reap_children): Avoid nonreentrant operations if that is set.
	* make.h: Declare handling_fatal_signal.

	* expand.c (reference_variable): New function, snippet of code
	broken out of simple-reference case of variable_expand.
	(variable_expand): Use it for simple refs.
	(variable_expand): When checking for a computed variable name,
	notice a colon that comes before the final CLOSEPAREN.  Expand
	only up to the colon, and then replace the pending text with a
	copy containing the expanded name and fall through to subst ref
	handling.
	(variable_expand): Don't bother expanding the name if a colon
	appears before the first $.
	(expand_argument): Use alloca instead of savestring.
	(variable_expand): For subst ref, expand both sides of = before
	passing to [pat]subst_expand.  Use find_percent instead of lindex
	to check the lhs for a %.

Wed May  5 14:45:52 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.64.2.

Mon May  3 17:00:32 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* arscan.c (ar_name_equal) [AIAMAG]: Abort if TRUNCATED is nonzero.

	* read.c (read_makefile): Pass extra arg of 1 to parse_file_seq,
	not to multi_glob.

Thu Apr 29 19:47:33 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.64.1.

	* arscan.c (ar_scan): New local flag var LONG_NAME.  Set it when
	we read the member name in any of the fashions that allow it to be
	arbitrarily long.  Pass its negation to FUNCTION.
	(describe_member): Take TRUNCATED from ar_scan and print it.
	(ar_name_equal): Take new arg TRUNCATED; if nonzero, compare only
	the first sizeof (struct ar_hdr.ar_name) chars.
	(ar_member_pos): Take TRUNCATED from ar_scan, pass to ar_name_equal.
	* ar.c (ar_member_date_1): Likewise.

Wed Apr 28 21:18:22 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (reap_children): Before calling start_job_command to start
	the next command line, reset C->remote by calling start_remote_job_p.

Mon Apr 26 15:56:15 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* arscan.c (ar_scan): New local var NAMEMAP.
	In loop, rename NAME to NAMEBUF; new var NAME is a pointer; new
	flag IS_NAMEMAP.  When extracting the member name, always put a
	null at its end first.  If the name is "//" or "/ARFILENAMES", set
	IS_NAMEMAP.  If we have already read in NAMEMAP, and NAME looks
	like " /N", get full name from NAMEMAP+N.
	Else if NAME looks like "#1/N", read N chars from the
	elt data to be the full name.  At end of loop, if IS_NAMEMAP, read
	the elt's data into alloca'd NAMEMAP.
	(ar_name_equal): #if 0 truncating code.

	* make.h: Don't declare vfork at all.  It returns int anyway,
	unless <unistd.h> declared it; and we conflicted with some systems.

	* main.c (define_makeflags): If FLAGSTRING[1] is '-', define
	MAKEFLAGS to all of FLAGSTRING, not &FLAGSTRING[1].  Don't want to
	define it to something like "-no-print-directory".
	Use %g format instead of %f for floating-valued things.

Thu Apr 22 18:40:58 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* GNUmakefile (Makefile.in): Use a substitution ref on nolib-deps
	to change remote-%.dep to remote-stub.dep.

Wed Apr 21 15:17:54 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.64.

Fri Apr 16 14:22:22 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (install): Remove - prefix from chgrp+chmod.

	* Version 3.63.8.

Thu Apr 15 18:24:07 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* acconfig.h: New file; contains "#undef SCCS_GET" for autoheader.
	* configure.in: If /usr/sccs/get exists, define SCCS_GET to that,
	else to "get".
	* default.c (default_variables): Set GET to macro SCCS_GET.

	* read.c (parse_file_seq): Take extra arg STRIP; strip `./' only
	if nonzero.  I hope this is the last time this argument is added
	or removed.
	(read_makefile): Pass it 1 when parsing include file names.
	Pass it 1 when parsing target file names.
	Pass it 1 when parsing static pattern target pattern names.
	* rule.c (install_pattern_rule): Pass it 1 when parsing rule deps.
	* default.c (set_default_suffixes): Pass it 1 when parsing
	default_suffixes.
	* function.c (string_glob): Pass it 0 here.

Wed Apr 14 11:32:05 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* misc.c (log_access): New function.
	({init,user,make,child}_access): Call it.
	(child_access): Abort if !access_inited.

	* main.c (switches: --no-print-directory): Use 1 instead of -1 for
	single-letter option.
	(init_switches, decode_switches, define_makeflags): An option with
	no single-letter version is no longer indicated by a value of -1;
	instead a value that is !isalnum.
	(init_switches): Don't put such switches into the string, only
	into the long_option table.

	* make.h [!NSIG] [!_NSIG]: #define NSIG 32.

	* job.c [HAVE_WAITPID]: Remove #undef HAVE_UNION_WAIT.  AIX's
	bsdcc defined WIF* to use union wait.

	* main.c (struct command_switch): Change member `c' to type int.
	(switches): Make const.
	(decode_switches): Use `const struct command_switch *'.
	(define_makeflags): Likewise.

	* default.c (default_suffix_rules): Add `-o $@' to makeinfo rules.

Mon Apr 12 12:30:04 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.63.7.

	* configure.in (AC_HAVE_HEADERS): Check for string.h and memory.h.
	Removed AC_MEMORY_H.
	* make.h [USG, NeXT]: Don't test these.
	[HAVE_STRING_H]: Test this to include string.h and define ANSI_STRING.
	[HAVE_MEMORY_H]: Test this instead of NEED_MEMORY_H.
	[! ANSI_STRING]: Put decls of bcopy et al here.
	[sparc]: Don't test this for alloca.h; HAVE_ALLOCA_H is sufficient.
	[HAVE_SIGSETMASK]: Test this rather than USG.
	[__GNU_LIBRARY__ || POSIX]: Don't #include <unistd.h> again.
	* main.c (main): Handle SIGCHLD if defined, and SIGCLD if defined.
	It doesn't hurt to do both if they are both defined, and testing
	USG is useless.
	* dir.c: Rationalize directory header conditionals.
	* arscan.c [HAVE_FCNTL_H]: Test this rather than USG || POSIX.

	* default.c (default_suffixes): Add `.txinfo'.
	(default_suffix_rules): Add `.txinfo.info' and `.txinfo.dvi' rules.

	* variable.c (try_variable_definition): Replace RECURSIVE flag
	with enum FLAVOR, which can be simple, recursive, or append.
	Recognize += as append flavor.  Set new variable VALUE in a switch
	on FLAVOR.  For append flavor, prepend the variable's old value.
	If the variable was previously defined recursive, set FLAVOR to
	recursive; if it was defined simple, expand the new value before
	appending it to the old value.  Pass RECURSIVE flag to
	define_variable iff FLAVOR == recursive.

	* variable.c (try_variable_definition): Use alloca and bcopy for
	NAME, instead of savestring.  Might as well use stack storage
	since we free it immediately anyway.

Thu Apr  8 18:04:43 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (start_waiting_jobs): Move decl of JOB outside of loop.

	* main.c (define_makeflags): Rename `struct flag' member `switch'
	to `cs', which is not a reserved word.

Wed Apr  7 15:30:51 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (new_job): Call start_waiting_jobs first thing.
	(start_waiting_job): Changed return type from void to int.
	Return 0 when putting the child on the waiting_jobs chain.
	(start_waiting_jobs): Don't check load and job_slots here.
	Always take a job off the chain and call start_waiting_job on it;
	give up and return when start_waiting_job returns zero.

	* main.c (define_makeflags: struct flag): Change member `char c' to
	`struct command_switch *switch'.
	(ADD_FLAG): Set that to CS instead of CS->c.
	If CS->c is -1, increment FLAGSLEN for the long name.
	When writing out FLAGS, handle FLAGS->switch->c == -1 and write
	the long name instead.

	* compatMakefile (stamp-config): New target of old config.h rule.
	Touch stamp-config after running config.status.
	(config.h): Just depend on stamp-config, and have empty commands.

Mon Apr  5 20:14:02 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c [HAVE_WAITPID]: #undef HAVE_UNION_WAIT.

	* configure.in (AC_HAVE_FUNCS): Check for psignal.

Fri Apr  2 17:15:46 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (long_option_aliases): Remove "new"; it is already an
	unambiguous prefix of "new-file".

Sun Mar 28 16:57:17 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.63.6.

Wed Mar 24 14:26:19 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* vpath.c (selective_vpath_search): When adding the
	name-within-directory at the end of NAME, and we don't add a
	slash, don't copy FILENAME in one char too far into NAME.

	* variable.c (define_automatic_variables): Find default_shell's
	length with strlen, not numerology.

Wed Mar 17 20:02:27 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (define_makeflags): Add the elts of a string option in
	reverse order, so they come out right when reversed again.

Fri Mar 12 15:38:45 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (make.info): Use `-o make.info'.

Thu Mar 11 14:13:00 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (REMOTE): Set to @REMOTE@; change comments to
	reflect new use.
	(objs): Replace remote.o with remote-$(REMOTE).o.
	(srcs): Replace remote.c with remote-$(REMOTE).c.
	(remote.o): Rule removed.

	* configure.in (REMOTE): Subst this in Makefile et al; default "stub".
	Use AC_WITH to grok --with-customs arg to set REMOTE=cstms.
	* GNUmakefile (build.sh.in): Filter out remote-% from objs list.
	* build.template (REMOTE): New var; set to @REMOTE@.
	(objs): Add remote-${REMOTE}.o.

Wed Mar 10 15:12:24 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.63.5.

	* implicit.c (pattern_search): Fix "dependent"->"dependency" in
	"Rejecting impossible" -d msg.

	* file.c (file_hash_enter): New local vars {OLD,NEW}BUCKET.  Store
	mod'd values there; never mod {OLD,NEW}HASH.

Mon Mar  8 13:32:48 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* remake.c [eta10]: Include <fcntl.h> instead of <sys/file.h>.

	* compatMakefile (VPATH): Set this to @srcdir@.
	(srcdir): Set this to $(VPATH).

	* main.c (main): New local var DIRECTORY_BEFORE_CHDIR.  Save in it
	a copy of CURRENT_DIRECTORY after the first getcwd.  Use it
	instead of CURRENT_DIRECTORY when chdir'ing back before re-execing.

	* remake.c (notice_finished_file): Pass missing SEARCH arg to f_mtime.

	* read.c (read_makefile): Remove extraneous arg to parse_file_seq.

Mon Feb 22 14:19:38 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile ($(infodir)/$(instname).info): Use , instead of /
	as the sed delimiter char.

Sun Feb 21 14:11:04 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.63.4.

	* rule.h (struct rule): Removed `subdir' member.
	* rule.c (new_pattern_rule): No need to clear it.
	(count_implicit_rule_limits): Set the `changed' flag in each dep
	that refers to a nonexistent directory.  No longer set rule-global
	`subdir' flag with that information.
	(print_rule_data_base): Don't record info on `subdir' flags.

	* implicit.c (pattern_search): Check the DEP->changed flag rather
	than the (now gone) RULE->subdir flag.  Also test CHECK_LASTSLASH;
	if it is set, the file might exist even though the DEP->changed
	flag is set.

	* rule.c (count_implicit_rule_limits): Pass "", not ".", as file
	name arg to dir_file_exists_p to check for existence of directory.

	* implicit.c (pattern_search): Inside dep-finding loop, set
	CHECK_LASTSLASH from the value recorded in CHECKED_LASTSLASH[I],
	rather than computing it anew.

	* commands.c (set_file_variables): Must alloca space for PERCENT
	and copy it, to avoid leaving the trailing `)' in the value.

	* misc.c (remove_comments): Fixed backslash-checking loop
	condition to allow it to look at the first char on the line.
	P2 >= LINE, not P2 > LINE.

	* compatMakefile ($(bindir)/$(instname)): Before moving $@.new to
	$@, rm $@.old and mv $@ to $@.old.

	* variable.c (try_variable_definition): Take new args FILENAME and
	LINENO.  Fatal if the variable name is empty.
	* read.c (read_makefile): Change callers.
	* main.c (main): Likewise.

	* compatMakefile (group): Define to @KMEM_GROUP@, autoconf magic
	that configure will replace with the group owning /dev/kmem.

Mon Feb  8 14:26:43 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* vpath.c (vpath_search): Take second arg MTIME_PTR, pass thru to
	selective_vpath_search.
	(selective_vpath_search): Take second arg MTIME_PTR.
	If the dir cache thinks a file exists, stat it to make sure, and
	put the modtime in *MTIME_PTR.
	* remake.c (library_search): Take second arg MTIME_PTR.
	When we find a match, record its mtime there.
	Pass MTIME_PTR through to vpath_search to do same.
	(f_mtime): Pass &MTIME as new 2nd arg to {vpath,library}_search;
	store it in FILE->last_mtime if set nonzero.
	* implicit.c (pattern_search): Pass nil 2nd arg to vpath_search.

	* compatMakefile (remote.o): Prepend `$(srcdir)/' to `remote-*.c',
	so globbing looks somewhere it will find things.

	* compatMakefile ($(infodir)/$(instname).info): Install `make.info*'
	not `$(srcdir)/make.info*'; no need to use basename.

Fri Feb  5 12:52:43 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.63.3.

	* compatMakefile (install): Add missing ;\s.

	Make -, @, and + prefixes on a pre-expanded command line affect
	all lines in the expansion, not just the first.
	* commands.h (struct commands): Replace `lines_recurse' member
	with `lines_flags'.
	(COMMANDS_{RECURSE,SILENT,NOERROR}): New macros, bits to set in
	that flag byte.
	* commands.c (chop_commands): Set `lines_flags' instead of
	`lines_recurse'.  Record not only + but also @ and - prefixes.
	* remake.c (notice_finished_file): Check the COMMANDS_RECURSE bit
	in FILE->cmds->lines_flags, rather than FILE->cmds->lines_recurse.
	* job.c (start_job_command): Replaced RECURSIVE and NOPRINT local
	var with FLAGS; initialize it to the appropriate `lines_flags' byte.
	Set CHILD->noerror if the COMMANDS_NOERROR bit is set in FLAGS.
	Set the COMMANDS_SILENT bit in FLAGS for a @ prefix.

	* remake.c (update_goal_chain): Set G->file to its prev after
	checking for G being finished, since that check needs to examine
	G->file.

	* configure.in (union wait check) [HAVE_WAITPID]: Try using
	waitpid with a `union wait' STATUS arg.  If waitpid and union wait
	don't work together, we should not use union wait.

	* Version 3.63.2.

	* remake.c (update_goal_chain): When G->file->updated, move
	G->file to its prev.  We aren't finished until G->file is nil.

Thu Feb  4 12:53:04 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (starting_directory): New global variable.
	(main): Set it to cwd after doing -Cs.
	(log_working_directory): Use it, rather than computing each time.
	* make.h: Declare it.

	* compatMakefile (SHELL): Define to /bin/sh for losing Unix makes.

	* main.c (decode_env_switches): Allocate (1 + LEN + 1) words for
	ARGV, rather than LEN words plus one byte.

Wed Feb  3 18:13:52 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile ($(bindir)/$(instname)): Put - before
	install_setgid command line, so its failure won't be an error.
	(infodir): New variable.
	(install): Depend on $(infodir)/$(instname).info.
	($(infodir)/$(instname).info): New target.

	* read.c (read_makefile): If FILENAMES is nil when we see a line
	starting with a tab, don't treat it as a command.  Just fall
	through, rather than giving an error.

	* read.c (read_makefile): If the NO_TARGETS flag is set when we see a
	command line, don't clear it before continuing.  We want
	subsequent command lines to be ignored as well.

	* job.c (new_job): Before expanding each command line, collapse
	backslash-newline combinations that are inside var or fn references.

Mon Feb  1 16:00:13 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (exec_prefix): Default to $(prefix), not /usr/local.

	* compatMakefile (make.info): Pass -I$(srcdir) to makeinfo.

	* job.c [POSIX] (unblock_sigs): Made global.
	[!POSIX] (unblock_sigs): Move defns to job.h.
	* job.h [POSIX] (unblock_sigs): Declare.

Sun Jan 31 19:11:05 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* read.c (read_makefile): In vpath parsing, after finding the
	pattern token, take entire rest of line as the search path, not
	just the next token.

	* compatMakefile (remote.o): Depend on remote-*.c.

Thu Jan 28 16:40:29 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* commands.c (set_file_variables): Don't define any F or D versions.
	* variable.c (define_automatic_variables): Define them here as
	recursively-expanded variables that use the dir and notdir funcs.

	* variable.c (target_environment): In v_default case, don't export
	o_default or o_automatic variables.

	* configure.in (union wait check): Remove ` and ' inside C code;
	they confuse the shell script.

Mon Jan 25 13:10:42 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.63.1.

	* vpath.c (construct_vpath_list): When skipping further processing
	of an elt that is ".", don't also skip the code that pushes P past
	the next separator.

	* compatMakefile (distclean): Don't remove make-*.

	* configure.in (HAVE_UNION_WAIT): Try to use WEXITSTATUS if it's
	defined.  If one cannot use WEXITSTATUS with a `union wait'
	argument, we don't want to believe the system has `union wait' at all.

	* remake.c (update_file): Do nothing to print "up to date" msgs.
	(update_goal_chain): Do it here instead.
	Use the `changed' flag of each goal's `struct dep' to keep track
	of whether files_remade (now commands_started) changed around a
	call to update_file for that goal.
	When a goal is finished, and its file's update_status is zero (i.e.,
	success or nothing done), test the `changed' flag and give an "up
	to date" msg iff it is clear.
	* make.h (files_remade): Renamed to commands_started.
	* remake.c: Changed defn.
	(update_goal_chain): Changed uses.
	* job.c (start_job_command): Increment commands_started here.
	(reap_children): Not here.

	* remake.c (update_goal_chain): Don't do anything with files'
	`prev' members.  update_file now completely handles this.

	* variable.c (target_environment): Don't expand recursive
	variables if they came from the environment.

	* main.c (define_makeflags): For flags with omitted optional args,
	store {"", 0} with ADD_FLAG.  When constructing FLAGSTRING, a flag
	so stored cannot have more flags appended to the same word.

Fri Jan 22 14:46:16 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.c (print_variable_set): In vars/bucket calculation,
	don't spuriously multiply by 100.

	* Version 3.63.

	* job.c [!HAVE_UNION_WAIT] (WTERMSIG, WCOREDUMP, WEXITSTATUS):
	Don't define if already defined.

	* remake.c (update_file): Don't keep track of the command_state before
	calling update_file_1.  Remove local variable COMMANDS_FINISHED,
	and don't test it to decide to print the "is up to date" msg.
	Testing for files_remade having changed should always be sufficient.
	The old method lost when we are called in the goal chain run on a
	makefile, because the makefile's command_state is already
	`cs_finished' from the makefile chain run.

	* misc.c [HAVE_SETRE[GU]ID]: Test these to decl setre[gu]id.

	* configure.in: Rewrote wait checking.
	Use AC_HAVE_HEADERS to check for <sys/wait.h>.
	Use AC_HAVE_FUNCS to check for waitpid and wait3.
	Use a compile check to test just for `union wait'.
	* job.c: Rewrote conditionals accordingly.
	[HAVE_WAITPID]: Test this only to define WAIT_NOHANG.
	[HAVE_WAIT3]: Likewise.
	[HAVE_UNION_WAIT]: Test this to define WAIT_T and W*.

	* configure.in: Set CFLAGS and LDFLAGS before all checks.

	* dir.c: Add static forward decls of {open,read}_dirstream.

Thu Jan 21 17:18:00 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.31.

	* job.c [NGROUPS_MAX && NGROUPS_MAX==0]: #undef NGROUPS_MAX.

	* compatMakefile (CFLAGS, LDFLAGS): Set to @CFLAGS@/@LDFLAGS@.
	* build.template (CFLAGS, LDFLAGS): Same here.
	* configure.in: AC_SUBST(CFLAGS) and LDFLAGS.
	Set them to -g if not defined in the environment.

	* remake.c (library_search): Use LIBNAME consistently, setting it
	only once, to be the passed name sans `-l'.
	Pass new var FILE to be modified by vpath_search.

Mon Jan 18 14:53:54 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.30.

	* job.c (start_waiting_jobs): Return when job_slots_used is equal to
	job_slots. 

	* configure.in: Add AC_CONST for the sake of getopt.

	* read.c (read_makefile): Continue after parsing `override'
	directive, rather than falling through to lossage.
	Check for EOL or blank after "override define".

	* compatMakefile (.c.o, remote.o): Put $(CFLAGS) after other switches.

Fri Jan 15 12:52:52 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.29.

	* main.c (define_makeflags): After writing everything into
	FLAGSTRING, only back up two chars if [-1] is a dash, meaning we
	just wrote " -".  Always terminate the string at *P.

	* remake.c (library_search): When constructing names in std dirs,
	use &(*LIB)[2] for the stem, not LIBNAME (which points at the
	buffer we are writing into!).

Thu Jan 14 13:50:06 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Set IN_IGNORED_DEFINE for "override
	define" when IGNORING is true.

	* compatMakefile (distclean): Remove config.status and build.sh.

Wed Jan 13 16:01:12 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.28.

	* misc.c (xmalloc, xrealloc): Cast result of malloc/realloc to
	(char *).

	* arscan.c (ar_scan) [AIAMAG]: Cast read arg to (char *).

	* variable.c (define_automatic_variables): Override SHELL value for
	origin o_env_override as well as o_env.

	* GNUmakefile (build.sh.in): Don't replace %globobjs%.  Instead,
	add the names of the glob objects (w/subdir) to %objs%.
	* build.template (globobjs): Removed.
	Take basename of $objs before linking.

Tue Jan 12 12:31:06 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.27.

	* configure.in (AC_OUTPUT): Also edit build.sh.
	* build.template: New file.
	* GNUmakefile (build.sh.in): New rule to create it from build.template.
	(make-$(version).tar.Z): Depend on build.sh.in.

	* main.c (die): Call print_data_base if -p.
	(main): Don't call it here.

	* compatMakefile (defines): Add @DEFS@.  configure should turn this
	into -DHAVE_CONFIG_H.

Mon Jan 11 14:39:23 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.26.

	* misc.c (init_access): Surround with #ifdef GETLOADAVG_PRIVILEGED.
	({make,user,child}_access) [! GETLOADAVG_PRIVILEGED]: Make no-op.
	* compatMakefile (install_setgid): New var, set by configure.
	(install): Install setgid $(group) only if $(install_setgid) is true.

Fri Jan  8 15:31:55 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (load_too_high): If getloadavg fails with errno==0, give a
	message saying that load limits are not supported.

	* vpath.c (construct_vpath_list): Rewrote path deletion code to
	not try to use PATH's next link after freeing PATH.

	* main.c (define_makeflags): Rewritten; now handles string-valued
	option, and has no arbitrary limits.
	(switches): Set `toenv' flag for -I and -v.

	* main.c (decode_env_switches): Cast return value of alloca to char *.

	* misc.c (child_access) [HAVE_SETREUID, HAVE_SETREGID]: Use
	setre[gu]id in place of set[gu]id.

Wed Jan  6 15:06:12 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (main): Define MAKEOVERRIDES, MAKE, and MAKE_COMMAND with
	origin o_default.

	* make.h [POSIX]: Don't test this to use ANSI_STRING.
	Testing STDC_HEADERS should be sufficient.

	* job.h: Declare start_waiting_jobs.

	* read.c (read_makefile): Add missing parens in if stmt that find
	conditional directives.

	* main.c (main): Declare init_dir.
	* implicit.c (pattern_search): Always use two % specs in a
	DEBUGP2, and always pass two non-nil args.
	Cast field width args to int.
	Add missing parens in !RULE->subdir if stmt.
	* function.c (expand_function, patsubst_expand): Add parens around
	assignments inside `while' stmts.
	* commands.c (print_commands): Cast field width args to int.

	* read.c (do_define): Cast return value of alloca to (char *).

	* main.c (init_switches): New function, broken out of decode_switches.
	(decode_switches): Take new arg ENV.  If set, ignore non-option
	args; print no error msgs; ignore options with clear `env' flags.
	(decode_env_switches): Rewritten to chop envar value into words
	and pass them to decode_switches.
	(switches): Set `env' flag for -I and -v.

	* dir.c (init_dir): Cast free to __glob_closedir_hook's type.

Tue Jan  5 14:52:15 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.25.

	* job.c [HAVE_SYS_WAIT || !USG]: Don't #include <sys/time.h> and
	<sys/resource.h>.  <sys/time.h> interacts badly with <time.h>, and
	we don't need these anyway.

	* configure.in (AC_HAVE_FUNCS): Check for setre[gu]id.
	* misc.c ({user,make}_access): Test #ifndef HAVE_SETRE[GU]ID, not
	#ifdef POSIX || USG.  SunOS 4.1 is supposedly POSIX.1 compliant,
	but its set[gu]id functions aren't; its setre[gu]id functions work.

	* misc.c ({user,make,child}_access): Give name of caller in error msgs.

	* job.c (load_too_high): Say "cannot enforce load limit" in error msg.

	* configure.in: Call AC_PROG_CC.
	* compatMakefile (CC): Define to @CC@ (autoconf magic).

	* compatMakefile: Add .NOEXPORT magic target.

Mon Jan  4 17:00:03 1993  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (print_version): Updated copyright to include 93.

Thu Dec 31 12:26:15 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* make.h [_AIX]: Don't declare alloca.

Tue Dec 29 13:45:13 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.24.

	* compatMakefile (objs): Add signame.o.
	(srcs): Add signame.[ch].

	* compatMakefile (srcs): Add config.h.in.
	(remote.o): Add -I. before -I$(srcdir).

Mon Dec 28 15:51:26 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.23.

	* read.c (readline): Fatal when LEN==0, indicating a line starting
	with a NUL.
	(readline): Take new arg LINENO, for use in error msg.
	(read_makefile, do_define): Pass it.

	* compatMakefile (glob/libglob.a): Pass -DHAVE_CONFIG_H in CPPFLAGS.
	(.c.o): Add -I. before -I$(srcdir).

Wed Dec 23 12:12:04 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Accept and ignore a rule with no targets.

	* compatMakefile (ALLOCA_SRC): New variable.
	(srcs): Include its value.

	* read.c (struct conditional): Renamed member `max_ignoring' to
	`allocated'; added new member `seen_else'.
	(conditional_line): Initialize seen_else flag when starting an `if...';
	set it when we see an `else'; fatal if set when we see `else'.
	(read_makefile): Fatal "missing `endif'" if there are any pending
	conditionals, not just if we are still ignoring.

Tue Dec 22 15:36:28 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (manext): Set to 1, not l.
	($(mandir)/$(instname).$(manext)): Use $(srcdir) for make.man in cmds.

	* file.c (file_hash_enter): Don't call uniquize_deps here.
	* read.c (record_files): Likewise.
	* implicit.c (pattern_search): Likewise.
	* commands.c (set_file_variables): Call it only here.

	* default.c (default_variables) [__convex__]: FC=fc.

	* variable.c (target_environment): Expand the values of recursively
	expanded variables when putting them into the environment.
	* expand.c (recursively_expand): Made global.
	* make.h (recursively_expand): Declare it.

	* remake.c (check_dep): Set FILE->command_state to cs_deps_running
	when a dep's command_state is cs_running or cs_deps_running.

	* read.c (read_makefile): Changed error msg for spurious cmds to
	not say "first target".

Sun Dec 20 17:56:09 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* configure.in: Do AC_CONFIG_HEADER right after AC_INIT.
	* make.h (HAVE_CONFIG_H): #include "config.h", then #define this.
	* compatMakefile (config.h, configure, config.h.in): New rules.
	(defines): Removed @DEFS@.

Thu Dec 17 16:11:40 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (realclean): Just depend on distclean; no cmds.
	(distclean): Do what realclean did before; also remove Makefile and
	config.h; don't remove configure.
	(info, dvi): New targets; depend on make.{info,dvi}.
	(doc): Removed target.
	(MAKEINFO, TEXI2DVI): New vars.
	(make.info, make.dvi): Use them instead of explicit cmds.

Wed Dec 16 16:25:24 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* configure.in: Added fcntl.h to AC_HAVE_HEADERS.  getloadavg cares.

Wed Dec  9 15:21:01 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (long_option_aliases): Add --new-file alias for -W.

	* default.c (default_variables): Change all C++ to CXX and C++FLAGS
	to CXXFLAGS.

	* read.c (do_define): Expand the variable name before using it.

	* main.c (main): Define variable "MAKE_COMMAND" to argv[0];
	define "MAKE=$(MAKE_COMMAND) $(MAKEOVERRIDES)" always.

	* remake.c (library_search): Search for libNAME.a in cwd; look in
	vpath before looking in standard dirs, not after.
	Changed order of std dirs to: /lib, /usr/lib, ${prefix}/lib.

Mon Nov 23 14:57:34 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* default.c (default_pattern_rules, default_terminal_rules): Added
	brackets around initializers.

	* variable.c (try_variable_definition): Don't check for LINE[0]=='\t'.
	(try_variable_definition): Expand the name before defining the var.

	* job.c (init_siglist): Removed function.
	Removed decl of `sys_siglist'.
	* make.h [! HAVE_SYS_SIGLIST]: #include "signame.h".
	[HAVE_SYS_SIGLIST && !SYS_SIGLIST_DECLARED]: Declare sys_siglist
	only under these conditions.
	* main.c (main): Don't declare init_siglist.
	(main) [! HAVE_SYS_SIGLIST]: Call signame_init instead of init_siglist.

Wed Nov 18 14:52:51 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (record_files): Don't try to append to FIRSTDEPS if it's
	nil; instead just set it to MOREDEPS.

Mon Nov 16 17:49:17 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* vpath.c (construct_vpath_list): Initialize P to DIRPATH before
	loop that sets MAXELEM.

Fri Nov 13 18:23:18 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.22.

Thu Nov 12 15:45:31 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (start_job_command): Under -n, increment files_remade after
	processing (i.e., printing) all command lines.

Tue Nov 10 15:33:53 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* read.c (record_files): Append new deps if this rule has no
	commands; prepend them to existing deps if this rule has no commands.

	* dir.c (open_dirstream): Return nil if DIR->contents->files is nil.

	* read.c (parse_file_seq): Removed last arg STRIP.  Always strip `./'s.
	(read_makefile): Changed callers.
	* function.c (string_glob): Likewise.
	* rule.c (install_pattern_rule): Likewise.

Mon Nov  9 17:50:16 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* remake.c (files_remade): Made global.
	(notice_finished_file): Don't increment files_remade here; this
	function gets called in many situations where no remaking was in
	fact done.
	* job.c (reap_children): Do it here instead, when we know that 
	actual commands have been run for the file.
	* make.h (files_remade): Declare it.

Thu Nov  5 18:26:10 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* vpath.c (construct_vpath_list): Allow blanks as well as colons to
	separate elts in the search path.

	* read.c (read_makefile): Don't fatal on extra tokens in `vpath'.
	The search path can contain spaces now.

Tue Nov  3 20:44:32 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (check): New target; no-op.

	* file.c (file_hash_enter): Mod OLDHASH by FILE_BUCKETS after
	testing for OLDHASH==0 but before using the value.
	(rename_file): Don't mod OLDHASH by FILE_BUCKETS before passing it
	to file_hash_enter.

	* file.c (rename_file): Notice when OLDFILE->cmds came from
	default.c, and don't try to print ->filename in that case.

Sun Oct 25 01:48:23 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* remake.c (update_file): Don't process F->also_make here.
	(notice_finished_file): Don't process FILE->also_make if no attempt
	to update FILE was actually made.
	Fixed to call f_mtime directly to refresh their modtimes.

Sat Oct 24 22:08:59 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (find_percent): Don't increment P again after skipping
	an escaped %.

	* expand.c (variable_expand): In call to patsubst_expand, don't
	find `%'s ourselves; let that function do it.

	* read.c (read_makefile: record_waiting_files): Don't call
	record_files if FILENAMES is nil.
	(read_makefile): All alternatives in the parsing, except for rule
	lines, fall through to the end of the loop.  At the end of the
	loop, do record_waiting_files so we notice later spurious cmds.

Fri Oct 23 15:57:37 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.c (define_automatic_variables): Free old value of SHELL
	before replacing it.

Thu Oct 15 18:57:56 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (.c.o): Add -I$(srcdir)/glob to flags.

	* dir.c (open_dirstream): Cast return value to __ptr_t.

	* default.c (default_variables: "GET") [_IBMR2]: Use USG defn.

	* make.h (MAXPATHLEN): Moved out of #ifndef POSIX.
	(GET_PATH_MAX): Moved from #ifdef POSIX to #ifdef PATH_MAX #else.
	Define as (get_path_max ()).
	[! PATH_MAX] (NEED_GET_PATH_MAX): Define.
	[! PATH_MAX] (get_path_max): Declare fn.
	* misc.c [NEED_GET_PATH_MAX] (get_path_max): New function.

Mon Oct 12 13:34:45 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.21.

	* job.c (sys_siglist): Only declare #ifndef SYS_SIGLIST_DECLARED.
	* make.h [! HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define
	SYS_SIGLIST_DECLARED.

	* dir.c (file_impossible): When initializing DIR->contents, set
	DIR->contents->dirstream to nil.

	* compatMakefile (GLOB): Define new variable.
	(objs): Use it, rather than glob/libglob.a explicitly.

	* read.c (parse_file_seq): When stripping "./", handle cases like
	".///foo" and "./////".
	* file.c (lookup_file, enter_file): Likewise.

Sun Oct 11 17:00:35 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* dir.c (struct dirstream, {open,read}_dirstream): New
	data type and functions to read a directory sequentially.
	(init_dir): New function to hook it into glob.
	* main.c (main): Call init_dir.

	* compatMakefile (objs): Added glob/libglob.a.
	* configure.in: Remove code to test for glob.

Fri Oct  9 12:08:30 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (record_files): Generalized test for NAME pointing
	somewhere into F->name.

	* variable.c (define_variable_in_set): Free old value when replacing.

	* read.c (do_define): Free the linebuffer before returning.
	(record_files): When clearing .SUFFIXES deps, free their data.
	(multi_glob): Free OLD and its data when replacing it with results
	of glob run.

	* commands.c (set_file_variables): Use alloca in place of xmalloc
	for temp space for $^, $?, et al.

	* dir.c (struct directory): New member `contents' replaces `files'
	and `dirstream'.
	(struct directory_contents): New type.
	(directories_contents): New hash table.
	(dir_struct_file_exists_p): Take a struct directory_contents.
	(dir_file_exists_p): Pass it the `contents' member of the dir found.
	(dir_struct_file_exists_p): Renamed to dir_contents_file_exists_p;
	made static.  Return 0 if DIR is nil (meaning it couldn't be stat'd).
	(dir_file_exists_p, find_directory): Change all callers.
	(file_impossible): Use DIR->contents, initializing it if nil.
	(print_dir_data_base): Use DIR->contents, and print out device and
	inode numbers with each directory.

	* Changes for performance win from John Gilmore <gnu@cygnus.com>:
	* dir.c (DIRECTORY_BUCKETS): Increase to 199.
	(DIRFILE_BUCKETS): Decrease to 107.
	(find_directory): Allocate and zero a multiple of
	sizeof (struct dirfile *), not of sizeof (struct dirfile).
	(dir_struct_file_exists_p): New function, nearly all code from
	dir_file_exists_p.
	(dir_file_exists_p): Just call find_directory+dir_struct_file_exists_p.
	* vpath.c (selective_vpath_search): Remove redundant
	dir_file_exists_p call.

	* configure.in: Comment out glob check; always use our code.

Fri Oct  2 19:41:20 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* make.h [! HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define
	HAVE_SYS_SIGLIST; after doing #define sys_siglist _sys_siglist, we
	do have it.

Wed Sep 30 19:21:01 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (main): Don't do -w automatically if -s.

Tue Sep 29 21:07:55 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (printed_version): Move variable inside print_version.
	(print_version): Return immediately if printed_version is set.
	(die): Don't test printed_version here.
	(decode_switches): Under -v, do print_version before giving usage.
	(DESCRIPTION_COLUMN): New macro.
	(decode_switches): Use it when printing the usage message.
	Leave at least two spaces between options and their descriptions.

Fri Sep 25 13:12:42 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.20.

Wed Sep 16 16:15:22 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* read.c (read_makefile): Save errno value from trying to open
	FILENAME, and restore it before erring; otherwise we get the errno
	value from the last elt of the search path.

Tue Sep 15 15:12:47 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (long_option_aliases): Add --stop for -S.

	* read.c (word1eq): Do strncmp before dereferencing someplace that
	may be out in space.

Wed Sep  9 15:50:41 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* remake.c (notice_finished_file): If all the command lines were
	recursive, don't do the touching.

	* job.c (start_job_command): Don't check for + here.
	* commands.c (chop_commands): Do it here instead.

	* default.c (default_terminal_rules): Prepend + to cmds for RCS.

Wed Sep  2 17:53:08 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (objs): Include $(ALLOCA).

	* make.h [CRAY]: Move #define signal bsdsignal to before #includes.

Thu Aug 27 17:45:43 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* read.c (default_include_directories): Add INCLUDEDIR first.
	* compatMakefile (includedir): Define.
	(defines): Add -D for INCLUDEDIR="$(includedir)".

	* read.c (read_makefile): Grok multiple files in `include';
	globbing too.

	* remake.c (library_search): New function.
	(library_file_mtime): Remove function.
	(f_mtime): Use library_search instead of library_file_mtime.
	* compatMakefile (libdir): Define.
	(defines): Add -D for LIBDIR="$(libdir)".
	* make.texinfo (Libraries/Search): Document change.

	* file.c (rename_file): Fix file_hash_enter call with missing arg.

Wed Aug 26 17:10:46 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.19.

	* main.c (main): Set command_state to cs_finished for temp files
	made for stdin makefiles.

	* main.c (decode_switches): Don't tell getopt to return non-option
	args in order.
	Ignore an argument of `-'.

Thu Aug 20 13:36:04 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* job.c (start_job_command): If (touch_flag && !RECURSIVE), ignore
	the command line and go to the next.
	(notice_finished_file): Under -t, touch FILE.
	* remake.c (remake_file): Don't touch it here.

Wed Aug 19 16:06:09 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* function.c (pattern_matches): Use temporary for strlen (WORD)
	instead of two function calls.

	* compatMakefile (LOAD_AVG): Remove variable and comments.

Tue Aug 18 14:58:58 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* make.texinfo (Running): Node renamed to `make Invocation'.

Fri Aug 14 12:27:10 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* arscan.c (ar_name_equal): Don't compare [MAX-3..MAX] if
	NAMELEN != MEMLEN.

Thu Aug 13 17:50:09 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.18.

	* main.c: Don't #include <time.h>; make.h already does.

Mon Aug 10 17:03:01 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* implicit.c (pattern_search): Fixed copying of suffix when building
	also_make elts.

	* function.c (expand_function: `shell'): Make sure BUFFER is
	null-terminated before replacing newlines.

	* compatMakefile (mandir): Use man$(manext), not always manl.

Sun Aug  2 01:42:50 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* rule.c (new_pattern_rule): Not static.
	* rule.h: Declare it.

	* file.c (file_hash_enter): New function, most code from rename_file.
	(rename_file): Call it.
	* file.h (file_hash_enter): Declare it.

	* dep.h: Doc fix.

Thu Jul 30 15:40:48 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (decode_switches): Handle usage_and_exit when building
	long options vector.

	* default.c (default_terminal_rules): Make RCS rules use $(CHECKOUT,v).
	(default_variables): Define CHECKOUT,v (hairy).

	* make.h [!HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define
	sys_siglist to _sys_siglist.

Sun Jul 26 16:56:32 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* NEWS: Add header and tail copyright info like Emacs NEWS.

	* make.h [ANSI_STRING]: Don't #define index, rindex, bcmp, bzero,
	bcopy if already #define'd.
	[STDC_HEADERS] (qsort, abort, exit): Declare here.
	[! __GNU_LIBRARY__ && !POSIX]: Not here.

	* make.h [_AIX]: #pragma alloca first thing.

	* job.c (start_waiting_job): Set the command_state to cs_running
	when we queue a job on waiting_jobs.

Fri Jul 24 02:16:28 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.c (define_automatic_variables): Use "" instead of nil
	for empty value.

Thu Jul 23 22:31:18 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.17.

	* main.c (struct command_switch.type): Add alternative usage_and_exit.
	(command_switches): Add -h/--help.

Thu Jul 16 14:27:50 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* GNUmakefile (make-$(version).tar.Z): Include NEWS, not CHANGES.
	* README.template: Mention NEWS.
	* CHANGES: Renamed to NEWS.

	* main.c [! STDC_HEADERS] [sun]: Don't declare exit.

Tue Jul 14 18:48:41 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (main): Set -o files' command_states to cs_finished.

	* rule.c (count_implicit_rule_limits): Decrement num_pattern_rules
	when tossing a rule.

	* main.c (main): Use alloca only in simple local var assignment,
	for braindead SGI compiler.

	* rule.c (print_rule_data_base): Barf if num_pattern_rules is
	inconsistent with the number computed when listing them.

Mon Jul 13 17:51:53 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* commands.c (set_file_variables): For $? and $^ elts that are archive
	member refs, use member name only.

Fri Jul 10 00:05:04 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* variable.h (struct variable.export): Add new alternative v_ifset.
	* variable.c (target_environment): Check for it.
	(define_automatic_variables): Set it for MAKEFILES.

Thu Jul  9 21:24:28 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (objs): Remove getloadavg.o; $(extras) gets it.
	(remote.o): Use $(srcdir)/remote.c, not $remote.c<.
	(distclean, mostlyclean): New targets.

Tue Jul  7 19:12:49 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.16.

	* compatMakefile (config.status): Remove rule.

	* job.c (start_waiting_job): Free C after using C->file, not before.

Sat Jul  4 20:51:49 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* commands.c, job.c, main.c, make.h, remote-cstms.c: Use #ifdef
	HAVE_* instead of #ifndef *_MISSING.
	* configure.in: Use AC_HAVE_FUNCS instead of AC_MISSING_FUNCS (gone).

Thu Jul  2 18:47:52 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* main.c (main): makelevel>0 or -C implies -w.

Tue Jun 30 20:50:17 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* file.c, job.c, function.c: Don't #include <errno.h>.
	make.h: Do it here instead.
	* arscan.c (ar_member_touch): Don't declare errno.

Thu Jun 25 17:06:55 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* GNUmakefile (make-$(version).tar.Z): Depend on INSTALL, configure.in.

	* remake.c (update_file): If commands or deps are running after
	update_file_1 returns, break out of the :: rule (->prev) loop and
	just return.

	* job.c	(job_next_command): New function; code from start_job.
	(start_job_command): Renamed from start_job.  Call job_next_command
	and recurse for empty command lines and -n.
	(start_waiting_job): Call start_job_command, not start_job.
	(new_job): Call job_next_command to prime the child structure, and
	then call start_waiting_job.
	(reap_children): Use job_next_command and start_job_command.
	(start_waiting_job): Call start_remote_job_p here, and store its
	result in C->remote.  If zero, check the load average and
	maybe put C on waiting_jobs.
	(start_job_command): Test CHILD->remote rather than calling
	start_remote_job_p.  Don't do load avg checking at all here.

	* main.c (main): Don't handle SIGILL, SIGIOT, SIGEMT, SIGBUS,
	SIGSEGV, SIGFPE or SIGTRAP.

	* compatMakefile (glob/libglob.a): Don't pass srcdir to sub-make.
	configure will set it in glob/Makefile.

Wed Jun 24 19:40:34 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* dir.c [DIRENT] (direct): Don't define to dirent.
	[! DIRENT] (direct): Define to dirent.
	(dir_file_exists_p): Use struct dirent instead of struct direct.

	* make.h (getcwd): No space between macro and ( for args!

	* job.c (start_job): Don't put the job on waiting_jobs if
	job_slots_used==0.

	* make.texinfo (Missing): Shortened title.

Tue Jun 23 18:42:21 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* file.c (remove_intermediates): Print "rm" commands under -n.

Mon Jun 22 16:20:02 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.15.

Fri Jun 19 16:20:26 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* arscan.c [M_UNIX]: #undef M_XENIX.

Wed Jun 17 17:59:28 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* default.c (default_terminal_rules): Put @ prefix on RCS cmds.

Tue Jun 16 19:24:17 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile (getloadavg.o): Removed special rule.
	(CFLAGS): Don't include $(defines).
	(.c.o): Define suffix rule.
	(glob/libglob.a): Pass CPPFLAGS=$(defines) to submake.
	(GETOPT_SRC, srcs, tagsrcs): Prefix files with $(srcdir)/.

	* arscan.c (ar_name_equal): Moved local vars inside #if'd block.

	* make.h (max): Removed.
	* expand.c (variable_buffer_output): Don't use it.

	* compatMakefile (INSTALL): Define.
	(Makefile): New rule to make from Makefile.in.
	(srcdir): Define.
	(VPATH): Define.
	(getloadavg.o, remote.o): Use autoconf $foo< hack.

	* commands.c (fatal_error_signal): Removed return.

Mon Jun 15 17:42:51 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.14.

	* make.texinfo (Summary): New node.
	(Special Targets): Mention .EXPORT_ALL_VARIABLES here.

	* variable.c (max): Moved to make.h.

	* compatMakefile (objs, srcs): Added ar & arscan.

	* job.c (start_waiting_job): New function, 2nd half of new_job.
	(new_job): Call it.
	(start_waiting_jobs): New function.
	* remake.c (update_goal_chain): Call start_waiting_jobs at the top
	of the main loop.
	* compatMakefile (objs, srcs): Removed load, added getloadavg.

Fri Jun 12 19:33:16 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* job.c (load_too_high): New function.  Uses getloadavg.
	(waiting_jobs): New variable.
	(start_job): Don't call wait_to_start_job.  Instead, if
	load_too_high returns nonzero, add the child to the
	`waiting_jobs' chain and return without starting the job.

Thu Jun 11 00:05:28 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* expand.c (variable_buffer_output): Made global again.
	* variable.h: And declare it.

	* arscan.c (PORTAR): Define for all systems if PORT5AR is not defined.
	(AR_NAMELEN, AR_TRAILING_SLASH): Removed.
	(ar_scan): Don't use it.  Don't #ifdef AR_TRAILING_SLASH; just look
	for a slash in the archive at run time.
	(ar_name_equal): Rewrote .o hacking to not use AR_NAMELEN, and to
	cope with trailing-slash and non-trailing-slash archives.

	* main.c (main) [! SETVBUF_REVERSED]: Test this instead of USGr3 et al.
	[SETVBUF_REVERSED]: Always allocate a buffer ourselves.

	* load.c (load_average) [sgi]: Use sysmp call.

	* compatMakefile (INSTALL_DATA, INSTALL_PROGRAM): Define.
	($(bindir)/$(instname), $(mandir)/make.$(manext)): Use them.

	* make.h [HAVE_VFORK_H]: #include <vfork.h>.
	(vfork, VFORK_NAME): Don't define.
	* job.c (start_job): Use "vfork" in place of VFORK_NAME.

	* make.h [HAVE_LIMITS_H, HAVE_SYS_PARAM_H]: If #define'd, #include
	the each file.  Rearranged PATH_MAX hacking.
	* job.c: Rearranged NGROUPS_MAX hacking.

	* remake.c (fstat, time): Don't declare.

	* compatMakefile (defines): Value is @DEFS@.
	(LOADLIBES): Value is @LIBS@.
	(extras): Value is @LIBOBJS@.
	(ARCHIVES, ARCHIVES_SRC, ALLOCASRC): Removed.
	* arscan.c, ar.c: Surround body with #ifndef NO_ARCHIVES.

	* misc.c [! HAVE_UNISTD_H]: Test instead of !POSIX to decl get*id.

	* make.h [GETCWD_MISSING]: Test instead of !USG && !POSIX et al.
	(getcwd): Just declare if present.  If not, declare as a macro
	using getwd, and declare getwd.
	[PATH_MAX] (GET_PATH_MAX): #define to PATH_MAX.
	* main.c (main,	log_working_directory): Use getcwd instead of getwd.

	* main.c (main) [SETLINEBUF_MISSING]: Test this instead of USG.

	* make.h (SIGHANDLER, SIGNAL): Removed.
	(RETSIGTYPE): Define if not #define'd.
	* main.c (main): Use signal in place of SIGNAL.

	* main.c [SYS_SIGLIST_MISSING]: Test instead of USG.

	* job.c (search_path) [GETGROUPS_MISSING]: Test instead of USG.
	[HAVE_UNISTD_H]: Test instead of POSIX to not decl getgroups.

	* main.c [! HAVE_UNISTD_H]: Test instead of !POSIX to decl chdir.
	[! STDC_HEADERS]: Test instead of !POSIX to decl exit & atof.

	* job.c (child_handler), commands.c (fatal_error_signal): Return
	RETSIGTYPE instead of int.
	* main.c (main): Declare fatal_error_signal and child_handler here
	to return RETSIGTYPE; removed top-level decl of former.

	* commands.c (fatal_error_signal), job.c (unblock_sigs, start_job),
	main.c [SIGSETMASK_MISSING]: Test this instead of USG.

Wed Jun 10 22:06:13 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* job.c [HAVE_WAITPID]: Test this instead of USG.
	[! HAVE_UNISTD_H]: Test this instead of !POSIX to declare misc fns.
	(GID_T): Don't #define.
	(search_path): Use gid_t instead of GID_T.
	[GETDTABLESIZE_MISSING, SYS_SIGLIST_MISSING, DUP2_MISSING]: Test
	these individually instead of USG for all.
	* make.h (ctime): Don't declare.  #include time.h instead.
	[HAVE_UNISTD_H]: #include <unistd.h> and #define POSIX #ifdef
	_POSIX_VERSION.
	* dir.c [__GNU_LIBRARY__] (D_NAMLEN): Define to use d_namlen member.
	* make.h [NEED_MEMORY_H]: Only include memory.h #ifdef this.

	* arscan.c: Removed #ifdef mess about string.h et al.
	Just #include make.h instead.
	* make.h (fstat, atol): Declare.

	* commands.c (fatal_error_signal): Don't use sigmask to check for
	propagated signals; use ||s instead.
	(PROPAGATED_SIGNAL_MASK): Removed.
	(fatal_error_signal) [POSIX]: Use sigprocmask in place of sigsetmask.

	* variable.c (variable_buffer, variable_buffer_length,
	initialize_variable_output, variable_output): Moved to expand.c;
	made all static.
	(struct output_state, save_variable_output,
	restore_variable_output): Removed.
	* expand.c (initialize_variable_output): Put a NUL at the beginning
	of the new buffer after allocating it.
	(allocated_variable_expand_for_file): Don't use
	{save,restore}_variable_output.  Do it by hand instead, keeping
	state on the stack instead of malloc'ing it.
	(allocated_variable_expand): Removed.
	* variable.h (allocated_variable_expand): Define here as macro.
	(variable_buffer_output, initialize_variable_output,
	save_variable_output, restore_variable_output): Removed decls.

	* read.c (conditional_line): For an if cmd, if any elt of the
	conditionals stack is ignoring, just push a new level that ignores
	and return 1; don't evaluate the condition.

Thu Jun  4 21:01:20 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (main): Put #ifdef's around frobbing SIGSYS and SIGBUS.

	* job.c (getdtablesize): Don't declare or #define if already #define'd.

Wed Jun  3 23:42:36 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* file.c (snap_deps): If `.EXPORT_ALL_VARIABLES' is a target, set
	export_all_variables.
	* make.texinfo (Variables/Recursion): Document .EXPORT_ALL_VARIABLES.

Tue Jun  2 21:08:35 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.13.

	* commands.c (set_file_variables): Calculate length for ^D and ?D
	individually, making sure to give them at least enough space for "./".

	* make.h [CRAY]: #define signal to bsdsignal.

	* default.c (default_variables) [CRAY]: Define PC, SEGLDR,
	CF77PPFLAGS, CF77PP, CFT, CF, and FC.

	* arscan.c (AR_HDR_SIZE): Define to sizeof (struct ar_hdr), if it
	wasn't defined by <ar.h>.

Thu May 28 00:56:53 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.12.

Tue May 26 01:26:30 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* rule.c (new_pattern_rule): Initialize LASTRULE to nil, not
	pattern_rules.

Mon May 25 19:02:15 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (decode_switches): Initialize all the long_option elt members.

Thu May 21 16:34:24 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* make.texinfo (Text Functions): Correct filter-out description.

Tue May 19 20:50:01 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* compatMakefile (realclean): Don't remove backup files.

	* main.c (decode_switches): Allocate ARGC+1 elts in `other_args'.

Sun May 17 16:38:48 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.62.11.

Thu May 14 16:42:33 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* job.c (reap_children): Don't die if wait returns EINTR.

Wed May 13 18:28:25 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* job.c (reap_children): Always run the next command for a
	successful target.  If we are going to die, we don't want to leave
	the target partially made.

Tue May 12 00:39:19 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): After loop, if we only
	have one word, check it for being a shell command.

	* main.c (decode_switches): Allocate ARGC slots in other_args to
	begin with, so we never need to worry about growing it.
	If we get a non-option arg and POSIXLY_CORRECT is in the
	environment, break out of the loop.  After the loop, add all remaining
	args to other_args list.

	* main.c (decode_switches): For positive_int and floating switches
	when optarg is nil, use next arg if it looks right (start with a
	digit, or maybe decimal point for floating).

	* variable.c (define_automatic_variables): Always set SHELL to
	default if it comes from the environment.  Set its export bit.
	* make.texinfo (Environment): Document change.

Mon May 11 00:32:46 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.62.10.

	* compatMakefile (tags, TAGS): Use vars for cmds.
	(ETAGS, CTAGS): Define.

	* main.c (decode_switches): If a switches elt has a nil long_name,
	make the long option name elt be "".
	Fixed loop to not ignore all the options.

	* make.texinfo (Option Summary): Added long options.

	* main.c (switches): Changed -m's description to "-b".
	(decode_switches): When printing the usage message, don't print
	switches whose descriptions start with -.
	When constructing the list of names for switch -C, search the
	switches vector for switches whose descriptions are "-C".

	* main.c (switches): Call -S --no-keep-going, not --dont-keep-going.
	Call -I --include-dir, not --include-path.
	(long_option_aliases): Added --new == -W, --assume-new == -W,
	--assume-old == -o, --max-load == -l, --dry-run == -n, --recon == -n,
	--makefile == -f.

	* main.c (switches): Removed bogus "silent" elt.
	(long_option_aliases): Define new var.
	(decode_switches): Add long_option_aliases onto the end of the long
	options vector created for getopt_long.
	Look through long_option_aliases for extra names to list
	in usage message.

Sat May  9 00:21:05 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (log_working_directory): Fixed to properly not print the
	leaving message when we haven't printed the entering message.

Fri May  8 21:55:35 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* main.c (struct command_switch): Added elts `long_name', 
	`description', and `argdesc'.
	(switches): Added initializers for new members.
	(decode_switches): Rewritten to use getopt_long.
	* compatMakefile (GETOPT, GETOPT_SRC): Define.
	(objs, srcs): Include them.

	* job.c (child_died): Renamed to dead_children; made static.
	(child_handler): Increment dead_children instead of setting child_died.
	(reap_children): Decrement dead_children instead of clearing
	child_died.  The point of all this is to avoid printing "waiting
	for unfinished jobs" when we don't actually need to block.
	This happened when multiple SIGCHLDs before reap_children was called.

	* job.c (reap_children): If ERR is set, so we don't call start_job
	on the child being reaped, instead set its command_state to
	cs_finished.
	(reap_children, child_handler, new_job): I added several
	debugging printf's while fixing this.  I left them in if (debug_flag) 
	because they may be useful for debugging this stuff again.

Wed May  6 22:02:37 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* read.c (read_makefile): v_export is not 1.

Mon May  4 17:27:37 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.9.

	* variable.c (export_all_variables): New variable.
	(target_environment): Export variables whose `export' member is
	v_default if export_all_variables is set and their names are benign.
	* variable.h: Declare export_all_variables.
	* read.c (read_makefile): If export or unexport is given with no
	args, set or clear export_all_variables, respectively.

	* variable.c (target_environment): Exclude MAKELEVEL in the loop,
	so it isn't duplicated when we add it at the end.

Sun May  3 17:44:48 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.8.

	* variable.h (struct variable): Added new member `export'.
	* variable.c (define_variable_in_set): Initialize it to v_default.
	(target_environment): Don't check for .NOEXPORT.
	Export variables whose `export' member is v_default and that would
	have been exported under .NOEXPORT, and variables whose `export'
	member is v_export.
	(try_variable_definition): Return the variable defined.
	* variable.h (try_variable_definition): Changed decl.
	* read.c (read_makefile): Recognize `export' and `unexport' directives.

Fri May  1 11:39:38 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* main.c (main) [POSIX]: Reversed args to sigaddset.

Thu Apr 30 17:33:32 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* job.c [POSIX || !USG] (unblock_sigs): New fn.
	(start_job): Block signals before forking.
	(new_job): Unblock signals after putting the new child on the chain.
	* main.c (main) [POSIX]: Use sigset_t fatal_signal_set instead of
	int fatal_signal_mask.

	* load.c [sgi] (LDAV_CVT): Define.

Wed Apr 29 17:15:59 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.62.7.

	* load.c (load_average) [sgi]: Clear the high bit of the address
	from the symbol table before looking it up in kmem.

	* misc.c (fatal, makefile_fatal): Put *** in fatal error messages.
	(remake_file): No longer needed in message here.

	* main.c (die): Call reap_children with BLOCK==1.

Tue Apr 28 20:44:35 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* rule.c (freerule): Don't set LASTRULE->next if LASTRULE is nil.

Sun Apr 26 15:09:51 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* rule.c (count_implicit_rule_limits): Initialize LASTRULE to nil,
	not to head of chain.  Extract next ptr before we might do
	freerule, and use that for next iteration.
	(freerule): Still do next ptr frobbing if LASTRULE is nil.

Tue Apr 21 03:16:29 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* job.c (child_error): Removed extra %s from error msg format.

	* Version 3.62.6.

	* job.c (reap_children): Don't start later commands in a sequence
	if ERR is nonzero.

	* job.c (new_job): Always call reap_children with BLOCK==0 first thing.

	* job.c (reap_children): New function; work that used to be done in
	child_handler.
	(child_died): New global var.
	(child_handler): Now just sets child_died.
	(wait_for_children): Removed.
	(unknown_children_possible, block_signals, unblock_signals,
	push_signals_blocked_p, pop_signals_blocked_p): Removed.
	(child_execute_job): Removed call to unblock_signals.
	(new_job): Removed calls to push_signals_blocked_p and
	pop_signals_blocked_p.
	* job.h: Declare reap_children, not wait_for_children.
	* commands.c (fatal_error_signal), job.c (new_job),
	load.c [LDAV_BASED] (wait_to_start_job), main.c (die),
	remake.c (update_goal_chain), function.c (expand_function: `shell'):
	Changed wait_for_children calls to reap_children.
	Some needed to be loops to wait for all children to die.
	* commands.c (fatal_error_signal), main.c (main,
	log_working_directory), function.c (expand_function): Removed calls
	to push_signals_blocked_p and pop_signals_blocked_p.
	* job.h: Removed decls.

	* job.h: Added copyright notice.

Wed Apr 15 02:02:40 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (child_error): No *** for ignored error.

Tue Apr 14 18:31:21 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* implicit.c (DEBUGP2): Use do ... while (0) instead of if ... else to
	avoid compiler warnings.

	* read.c (parse_file_seq): Don't remove ./ when it is followed by a
	blank.

Mon Apr 13 21:56:15 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h (DEBUGPR): Use do ... while (0) instead of if ... else to
	avoid compiler warnings.

	* remake.c (notice_finished_file): Run file_mtime on the also_make
	files, so vpath_search can happen.

	* GNUmakefile (tests): Use perl test suite from csa@sw.stratus.com.
	(alpha-files): Include test suite tar file.

Fri Apr  3 00:50:13 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* Version 3.62.5.

Wed Apr  1 05:31:18 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* remake.c (update_file, update_file_1): Do check_renamed on elts
	of dep chains when traversing them.  Something unrelated might have
	renamed one of the files the dep chain points to.

	* file.c (rename_file): If FILE has been renamed, follow its
	`renamed' ptr, so we get to the final real FILE.  Using the renamed
	ones loses because they are not in the hash table, so the removal
	code loops infinitely.

	* read.c (read_all_makefiles): Clobber null terminator into
	MAKEFILES expansion, so string passed to read_makefile is properly
	terminated.

Mon Mar 30 20:18:02 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* commands.c (set_file_variables): $* for archive member with
	explicit cmds is stem of member, not of whole `lib(member)'.

Thu Mar 26 15:24:38 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.62.4.

Tue Mar 24 05:20:51 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* rule.c (new_pattern_rule): Rules are identical only if all their
	targets match (regardless of order).

Wed Mar 11 13:49:54 1992  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* remake.c (remake_file): Changed error "no way to make" to "no
	rule to make".  Fiat Hugh.

	* make.texinfo (Last Resort): Describe %:: rules and new .DEFAULT
	behavior.

	* remake.c (update_file_1): Only use .DEFAULT cmds if FILE is not a
	target.

Tue Mar 10 18:13:13 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* remote-stub.c, remote-cstms.c (start_remote_job): Take new arg,
	environment to pass to child.
	* job.c (start_job): Pass it.

Mon Mar  9 19:00:11 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* file.c (enter_file): Also strip ./s here, to get command-line
	target names.

	* remote-cstms.c: Add comment telling people to leave me alone.

	* compatMakefile (manpage install): Remove target before copying.

Tue Mar  3 18:43:21 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.texinfo (Missing): Renamed to "Incompatibilities and ...".
	Added paragraph describing $? incompatibility with Unix and POSIX.2.

Sun Mar  1 15:50:54 1992  Roland McGrath  (roland@nutrimat.gnu.ai.mit.edu)

	* function.c (expand_function: `shell'): Don't declare fork or pipe.
	Use vfork instead of fork.

Tue Feb 25 22:05:32 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* make.texinfo (Chained Rules): Clarify .PRECIOUS to save
	intermediate files.

	* load.c [sun] (LDAV_CVT): Define to divide by FSCALE.

Sun Feb 16 02:05:16 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* Version 3.62.3.

Sat Feb 15 17:12:20 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* compatMakefile (makeinfo): Use emacs batch-texinfo-format fn.

Fri Feb 14 00:11:55 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* read.c (read_makefile): Correctly handle define & endef in ifdefs.

	* read.c (record_files): Pass arg for %s in error msg.

	* main.c (main) [__IBMR2, POSIX]: Use correct (a la USGr3) setvbuf
	call.

Wed Feb 12 12:07:39 1992  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* make.texinfo (Libraries/Search): Say it does /usr/local/lib too.

Sun Feb  9 23:06:24 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* read.c (read_makefile): Check for extraneous `endef' when ignoring.

Thu Feb  6 16:15:48 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Version 3.62.2.

Tue Feb  4 20:04:46 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Correctly ignore
	whitespace after backslash-NL.

Fri Jan 31 18:30:05 1992  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* compatMakefile: Ignore errors from chgrp and chmod when installing.

Wed Jan 29 18:13:30 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* main.c (main): When setting MAKELEVEL in the env to re-exec,
	allocate space so as not to clobber past the end of the old string.

	* make.h [HAVE_ALLOCA_H]: Include <alloca.h>
	* compatMakefile (defines): Document HAVE_ALLOCA_H.

Mon Jan 20 13:40:05 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* make.h [VFORK_MISSING]: Use fork instead.
	* compatMakefile (defines): Document same.

	* job.c (construct_command_argv_internal): Don't create an empty
	arg if backslash-NL is at beginning of word.

Sun Jan 19 16:26:53 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* main.c [DGUX]: Call setvbuf as for USGr3.

	* job.c (construct_command_argv_internal): Notice correctly that
	backslash-NL is the end of the arg (because it is replaced with a
	space).

Thu Jan 16 18:42:38 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): If SHELL is nil, set it
	to default_shell before proceeding.

	* make.h [sgi]: No alloca.h, after all.

Wed Jan 15 12:30:04 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* read.c (multi_glob): Cons up the chain of the results of glob
	from back to front, so it comes out in forward order.

	* job.c (construct_command_argv_internal): Don't eat char following
	backslash-NL.

Mon Jan 13 19:16:56 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* Version 3.62.1.

	* default.c (default_variables) [ultrix]: GET=get, like USG.

	* job.c (construct_command_argv_internal): Remove tabs following
	backslash-NL combos in the input line, so they don't show up when
	that line is printed.

	* read.c (read_makefile): Don't collapse_continuations the line on
	input; do it on the copy we do remove_comments on.
	For rule lines, collapse_continuations the line after chopping
	";cmds" off the end, so we don't eat conts in the cmds.
	Give error for ";cmds" with no rule.
	* job.c (construct_command_argv_internal): Eat backslash-NL combos
	when constructing the line to recurse on for slow, too.

Sat Jan 11 02:20:27 1992  Roland McGrath  (roland@albert.gnu.ai.mit.edu)

	* file.c (enter_file): Don't strip leading `./'s.
	* read.c (parse_file_seq): Take new arg STRIP; if nonzero, do it here.
	* default.c (set_default_suffixes), function.c (string_glob),
	read.c (read_makefile), rule.c (install_pattern_rule): Change callers.

	* default.c (default_variables) [_IBMR2]: FC=xlf

	* job.c (construct_command_argv_internal): Turn backslash-NL and
	following whitespace into a single space, rather than just eating
	the backslash.

	* make.texinfo (Copying): @include gpl.texinfo, rather than
	duplicating its contents.

Fri Nov  8 20:06:03 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Make sure not to bother
	processing an empty line.

	* Version 3.62.0.

	* job.c (construct_command_argv_internal): Always recurse for slow;
	simple case didn't handle finding newlines.

Tue Nov  5 18:51:10 1991  Roland McGrath  (roland@wookumz.gnu.ai.mit.edu)

	* job.c (construct_command_argv_internal): Set RESTP properly when
	slow; don't \ify past a newline.

Fri Nov  1 19:34:28 1991  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* make.h [sgi]: #include <alloca.h>.

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.
