mirror of
https://github.com/mirror/make.git
synced 2025-01-27 21:00:22 +08:00
* Fixed error rebuilding makefiles with -j>1
* Fixed problem with job pipe and -j>1 when waiting on -l loads.
This commit is contained in:
parent
9035aa27b7
commit
8df9d54020
22
ChangeLog
22
ChangeLog
@ -1,3 +1,25 @@
|
|||||||
|
1999-07-09 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* job.c (start_waiting_job): Don't get a second job token if we
|
||||||
|
already have one; if we're waiting on the load to go down
|
||||||
|
start_waiting_job() might get called twice on the same file.
|
||||||
|
|
||||||
|
* remake.c (update_goal_chain): If we try to update a goal and it
|
||||||
|
doesn't complete (e.g., parallel builds) remember that by setting
|
||||||
|
the `deferred' flag in the goal structure. Later when we're
|
||||||
|
determining the return value we consider a goal updated if either
|
||||||
|
the mtime has changed _or_ this flag was set. We need this
|
||||||
|
because the mtime doesn't change during the update_file() function
|
||||||
|
if we started a job running; instead it's set during the
|
||||||
|
reap_children() call. So, the code doesn't know it was updated
|
||||||
|
and returns a status of -1 (nothing done). This is OK during
|
||||||
|
"normal" builds since our caller (main) treats these cases
|
||||||
|
identically in that case, but if you're building makefiles the
|
||||||
|
difference is very important (whether we re-exec or not).
|
||||||
|
|
||||||
|
* dep.h: Add a `deferred' flag to track whether a goal was run but
|
||||||
|
not completed (parallel builds).
|
||||||
|
|
||||||
1999-07-08 Paul D. Smith <psmith@gnu.org>
|
1999-07-08 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
* main.c (switches): Define a new switch -R (or
|
* main.c (switches): Define a new switch -R (or
|
||||||
|
3
dep.h
3
dep.h
@ -38,7 +38,8 @@ struct dep
|
|||||||
struct dep *next;
|
struct dep *next;
|
||||||
char *name;
|
char *name;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
int changed;
|
unsigned short changed;
|
||||||
|
unsigned short deferred; /* Only used in update_goal_chain(). */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
5
job.c
5
job.c
@ -1133,8 +1133,9 @@ start_waiting_job (c)
|
|||||||
{
|
{
|
||||||
#ifdef MAKE_JOBSERVER
|
#ifdef MAKE_JOBSERVER
|
||||||
/* If this is not a recurse command and we are controlling
|
/* If this is not a recurse command and we are controlling
|
||||||
multiple jobs, obtain a token before starting child. */
|
multiple jobs, and we don't yet have one, obtain a token before
|
||||||
if (job_fds[0] >= 0 && !f->cmds->any_recurse)
|
starting child. */
|
||||||
|
if (job_fds[0] >= 0 && !f->cmds->any_recurse && !c->job_token)
|
||||||
{
|
{
|
||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
|
|
||||||
|
15
remake.c
15
remake.c
@ -94,7 +94,7 @@ update_goal_chain (goals, makefiles)
|
|||||||
|
|
||||||
struct dep *g;
|
struct dep *g;
|
||||||
for (g = goals; g != 0; g = g->next)
|
for (g = goals; g != 0; g = g->next)
|
||||||
g->changed = 0;
|
g->changed = g->deferred = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -161,6 +161,16 @@ update_goal_chain (goals, makefiles)
|
|||||||
decide when to give an "up to date" diagnostic. */
|
decide when to give an "up to date" diagnostic. */
|
||||||
g->changed += commands_started - ocommands_started;
|
g->changed += commands_started - ocommands_started;
|
||||||
|
|
||||||
|
/* Set the goal's `deferred' flag if we started a command but
|
||||||
|
it didn't finish (parallel builds). We need to remember
|
||||||
|
this, because the next time through the goal chain the call
|
||||||
|
to reap_children() will set the mtime, not the call to
|
||||||
|
update_file() above. So, the saved mtime from before
|
||||||
|
update_file() will be the same as the mtime after it, and
|
||||||
|
we'll think nothing changed when it did (see below). */
|
||||||
|
if (file->command_state == cs_running)
|
||||||
|
g->deferred = 1;
|
||||||
|
|
||||||
stop = 0;
|
stop = 0;
|
||||||
if (x != 0 || file->updated)
|
if (x != 0 || file->updated)
|
||||||
{
|
{
|
||||||
@ -181,7 +191,7 @@ update_goal_chain (goals, makefiles)
|
|||||||
stop = (!keep_going_flag && !question_flag
|
stop = (!keep_going_flag && !question_flag
|
||||||
&& !makefiles);
|
&& !makefiles);
|
||||||
}
|
}
|
||||||
else if (MTIME (file) != mtime)
|
else if (MTIME (file) != mtime || g->deferred)
|
||||||
{
|
{
|
||||||
/* Updating was done. If this is a makefile and
|
/* Updating was done. If this is a makefile and
|
||||||
just_print_flag or question_flag is set
|
just_print_flag or question_flag is set
|
||||||
@ -189,6 +199,7 @@ update_goal_chain (goals, makefiles)
|
|||||||
specified as a command-line target), don't
|
specified as a command-line target), don't
|
||||||
change STATUS. If STATUS is changed, we will
|
change STATUS. If STATUS is changed, we will
|
||||||
get re-exec'd, and fall into an infinite loop. */
|
get re-exec'd, and fall into an infinite loop. */
|
||||||
|
g->deferred = 0;
|
||||||
if (!makefiles
|
if (!makefiles
|
||||||
|| (!just_print_flag && !question_flag))
|
|| (!just_print_flag && !question_flag))
|
||||||
status = 0;
|
status = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user