diff --git a/ChangeLog b/ChangeLog index e5edfca9..c6e22bbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,21 @@ -1999-08-13 Paul D. Smith +1999-08-20 Paul D. Smith + + * variable.c (try_variable_definition): Allocate for variable + expansion in f_append with a simple variable: if we're looking at + target-specific variables we don't want to trash the buffer. + Noticed by Reiner Beninga . + +1999-08-16 Eli Zaretskii + + * main.c (main) [__MSDOS__]: Mirror any backslashes in argv[0], to + avoid problems in shell commands that use backslashes as escape + characters. + +1999-08-16 Paul D. Smith + + * Version 3.77.93 released. + +1999-08-13 Paul D. Smith - Argh. Another jobserver algorithm change. We conveniently forgot - that the blocking bit is shared by all users of the pipe, it's not - a per-process setting. Since we have many make processes all + Another jobserver algorithm change. We conveniently forgot that + the blocking bit is shared by all users of the pipe, it's not a + per-process setting. Since we have many make processes all sharing the pipe we can't use the blocking bit as a signal handler flag. Instead, we'll dup the pipe's read FD and have the SIGCHLD handler close the dup'd FD. This will cause the read() to fail diff --git a/job.c b/job.c index 36a9443f..2b1159f7 100644 --- a/job.c +++ b/job.c @@ -90,7 +90,7 @@ static int amiga_batch_file; #endif #ifdef HAVE_WAITPID -# define WAIT_NOHANG (status) waitpid (-1, (status), WNOHANG) +# define WAIT_NOHANG(status) waitpid (-1, (status), WNOHANG) #else /* Don't have waitpid. */ # ifdef HAVE_WAIT3 # ifndef wait3 @@ -326,13 +326,11 @@ child_handler (sig) { ++dead_children; -#ifdef HAVE_JOBSERVER if (job_rfd >= 0) { close (job_rfd); job_rfd = -1; } -#endif if (debug_flag) printf (_("Got a SIGCHLD; %u unreaped children.\n"), dead_children); @@ -348,19 +346,35 @@ extern int shell_function_pid, shell_function_completed; complete child, waiting for it to die if necessary. If ERR is nonzero, print an error message first. */ +static int rc_block, rc_reap_all, rc_got_block, rc_start_rfd, rc_end_rfd; + void reap_children (block, err) int block, err; { WAIT_T status; -#ifdef WAIT_NOHANG /* Initially, assume we have some. */ int reap_more = 1; + +#ifdef WAIT_NOHANG # define REAP_MORE reap_more #else # define REAP_MORE dead_children #endif + rc_block = block; + rc_reap_all = 0; + rc_got_block = 0; + rc_start_rfd = job_rfd; + + /* As long as: + + We have at least one child outstanding OR a shell function in progress, + AND + We're blocking for a complete child OR there are more children to reap + + we'll keep reaping children. */ + while ((children != 0 || shell_function_pid != 0) && (block || REAP_MORE)) { @@ -456,10 +470,11 @@ reap_children (block, err) if (pid < 0) { - /* The wait*() failed miserably. Punt. */ + /* EINTR? Try again. */ if (EINTR_SET) goto local_wait; + /* The wait*() failed miserably. Punt. */ pfatal_with_name ("wait"); } else if (pid > 0) @@ -472,26 +487,25 @@ reap_children (block, err) else { /* No local children are dead. */ -#ifdef WAIT_NOHANG reap_more = 0; -#endif - if (block && any_remote) - { - /* Now try a blocking wait for a remote child. */ - pid = remote_status (&exit_code, &exit_sig, &coredump, 1); - if (pid < 0) - goto remote_status_lose; - else if (pid == 0) - /* No remote children either. Finally give up. */ - break; - else - /* We got a remote child. */ - remote = 1; - } - else - break; + rc_reap_all = 1; + + if (!block || !any_remote) + break; + + /* Now try a blocking wait for a remote child. */ + pid = remote_status (&exit_code, &exit_sig, &coredump, 1); + if (pid < 0) + goto remote_status_lose; + else if (pid == 0) + /* No remote children either. Finally give up. */ + break; + + /* We got a remote child. */ + remote = 1; } #endif /* !__MSDOS__, !Amiga, !WINDOWS32. */ + #ifdef __MSDOS__ /* Life is very different on MSDOS. */ pid = dos_pid - 1; @@ -703,8 +717,10 @@ reap_children (block, err) /* Only block for one child. */ block = 0; + rc_block = block; } + rc_end_rfd = job_rfd; return; } diff --git a/main.c b/main.c index af77d5f4..7dde4f64 100644 --- a/main.c +++ b/main.c @@ -945,7 +945,7 @@ int main (int argc, char ** argv) if (print_version_flag) die (0); -#if !defined(__MSDOS__) && !defined(VMS) +#ifndef VMS /* Set the "MAKE_COMMAND" variable to the name we were invoked with. (If it is a relative pathname with a slash, prepend our directory name so the result will run the same program regardless of the current dir. @@ -963,9 +963,21 @@ int main (int argc, char ** argv) strneq(argv[0], "//", 2)) argv[0] = xstrdup(w32ify(argv[0],1)); #else /* WINDOWS32 */ +#ifdef __MSDOS__ + if (strchr (argv[0], '\\')) + { + char *p; + + argv[0] = xstrdup (argv[0]); + for (p = argv[0]; *p; p++) + if (*p == '\\') + *p = '/'; + } +#else /* !__MSDOS__ */ if (current_directory[0] != '\0' && argv[0] != 0 && argv[0][0] != '/' && index (argv[0], '/') != 0) argv[0] = concat (current_directory, "/", argv[0]); +#endif /* !__MSDOS__ */ #endif /* WINDOWS32 */ #endif @@ -1339,6 +1351,8 @@ int main (int argc, char ** argv) submakes it's the token they were given by their parent. For the top make, we just subtract one from the number the user wants. */ + job_slots = 1; /* !!!!!DEBUG!!!!! */ + while (--job_slots) { write (job_fds[1], &c, 1); diff --git a/maintMakefile b/maintMakefile index c9537178..108381bc 100644 --- a/maintMakefile +++ b/maintMakefile @@ -18,7 +18,7 @@ MTEMPLATES = Makefile.DOS SMakefile # General rule for turning a .template into a regular file. # -$(TEMPLATES) : % : %.template configure.in +$(TEMPLATES) : % : %.template Makefile rm -f $@ sed -e 's@%VERSION%@$(VERSION)@g' \ -e 's@%PACKAGE%@$(PACKAGE)@g' \ @@ -27,7 +27,7 @@ $(TEMPLATES) : % : %.template configure.in # Construct Makefiles by adding on dependencies, etc. # -$(MTEMPLATES) : % : %.template .dep_segment Makefile.am maintMakefile +$(MTEMPLATES) : % : %.template .dep_segment Makefile rm -f $@ sed -e 's@%VERSION%@$(VERSION)@g' \ -e 's@%PROGRAMS%@$(bin_PROGRAMS)@g' \ @@ -40,7 +40,7 @@ $(MTEMPLATES) : % : %.template .dep_segment Makefile.am maintMakefile cat $(word 2,$^) >>$@ chmod a-w $@ -NMakefile: NMakefile.template .dep_segment Makefile.am maintMakefile +NMakefile: NMakefile.template .dep_segment Makefile rm -f $@ cp $< $@ echo >>$@; echo '# --------------- DEPENDENCIES' >>$@; echo '#' >>$@; \ @@ -49,7 +49,7 @@ NMakefile: NMakefile.template .dep_segment Makefile.am maintMakefile # Construct build.sh.in # -build.sh.in: build.template Makefile.am maintMakefile +build.sh.in: build.template Makefile rm -f $@ sed -e 's@%objs%@$(filter-out remote-%, $(make_OBJECTS)@g' \ -e 's@%globobjs%@$(patsubst %.c,%.o,$(globsrc)))@g' \ diff --git a/make.texinfo b/make.texinfo index 8706c4a8..3e5fa6ea 100644 --- a/make.texinfo +++ b/make.texinfo @@ -2750,9 +2750,9 @@ called @file{@var{name}.d} from a C source file called @file{@var{name}.c}: @smallexample @group %.d: %.c - $(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \ - | sed '\''s/\($*\)\.o[ :]*/\1.o $@@ : /g'\'' > $@@; \ - [ -s $@@ ] || rm -f $@@' + set -e; $(CC) -M $(CPPFLAGS) $< \ + | sed 's/\($*\)\.o[ :]*/\1.o $@@ : /g' > $@@; \ + [ -s $@@ ] || rm -f $@@ @end group @end smallexample diff --git a/variable.c b/variable.c index d07b5e1f..97207f15 100644 --- a/variable.c +++ b/variable.c @@ -780,9 +780,9 @@ try_variable_definition (flocp, line, origin) case f_simple: /* A simple variable definition "var := value". Expand the value. We have to allocate memory since otherwise it'll clobber the - variable buffer, and we still need that. */ - alloc_value = allocated_variable_expand (p); - value = alloc_value; + variable buffer, and we may still need that if we're looking at a + target-specific variable. */ + value = alloc_value = allocated_variable_expand (p); break; case f_conditional: /* A conditional variable definition "var ?= value". @@ -824,8 +824,10 @@ try_variable_definition (flocp, line, origin) else /* The previous definition of the variable was simple. The new value comes from the old value, which was expanded - when it was set; and from the expanded new value. */ - p = variable_expand (p); + when it was set; and from the expanded new value. Allocate + memory for the expansion as we may still need the rest of the + buffer if we're looking at a target-specific variable. */ + p = alloc_value = allocated_variable_expand (p); oldlen = strlen (v->value); newlen = strlen (p);