Thu Apr 27 12:39:35 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Version 3.73.2.

Wed Apr 26 17:15:57 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* file.c (remove_intermediates): Fix inverted test to bail under
 	-n for signal case.  Bail under -q or -t.  
	Skip files with update_status==-1.

	* job.c (job_next_command): Skip empty lines.
	(new_job): Don't test the return of job_next_command.
	Just let start_waiting_job handle the case of empty commands.

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

	* function.c [__MSDOS__]: Include <fcntl.h>.  From DJ Delorie.

	* 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.
