Age | Commit message (Collapse) | Author |
|
|
|
stopped/continued, as we won't try to start new jobs when other stuff
is stopped.
Redo signal handling so that most stuff can be done directly in the handler.
This requires blocking/unblocking signals while creating new jobs, and creating
a small list that only contains job's pids.
Switch to pgrps for jobs, since that works.
Add a clamping heuristic that avoids starting new jobs while an expensive job
is running (expensive meaning "very likely to be a recursive make run"). This
idea is mostly from Theo, through the implementation is mine.
|
|
into a run_gnode_parallel. That simplifies the control flow of that routine
a bit, to allow for more tweaks in the parallel case.
okay kettenis@, otto@
|
|
okay otto@
|
|
- add new file to create lists of equivalent targets (siblings)
- use that for sequential mode to have much better VPATH support
- separate checking commands from reporting error, for later.
- zap DieHorribly accordingly
- renumber existing flags
- signal_running_jobs() is simpler than pass_signal_to_jobs()
- new debug option -dn for name matching.
Similar code to handle parallel make is still missing.
thanks to Mark, Miod, Theo, Otto, Todd for tests and/or comments.
|
|
discussed with deraadt@ and otto@ and millert@
|
|
- expand commands earlier, so that we can eventually scan them to take
smarter decisions.
- clean up the select() mask code and rename variables to sensible things.
- quite a few minor renames for readability
- erecalloc
- clean up wait status handling, do not try to rebuild wait status, but
instead parse it early and deal with the parsed code.
tested by lots of people, thanks guys!
|
|
- systematically reorder jobs based on who did output last, so that the
last job to output is *first* to output again.
- better reaction to errors: any job that outputs is checked for termination
directly, and the Error message is printed right afterwards.
- better error messages, giving more useful information in -j mode.
|
|
Anyways, switch to a growable array for job to do.
Allows us to randomize it.
fix manpage.
do not add delay if just one job to run.
|
|
jobs in parallel mode.
|
|
to make them easier to find in source files.
|
|
functions.
Restore a big more debug: if DEBUG(JOB), print commands (unexpanded).
|
|
no need to duplicate that info at the job level since we can just use
the gn->type.
|
|
|
|
the same as dieing in a sub job, since waiting on sub-jobs won't work.
So keep track of who we are via a state variable.
|
|
|
|
real files get updated anyways, but phony nodes stay around as unmade,
which breaks things in subtle ways, since parallel mode just assumes things
get built.
|
|
This is a really big step towards getting parallel make to work.
Note that this is not yet complete. There are still a few `details' to
fix before this works 100%. Specifically: sequential make (compat) and
parallel make don't use the same engine, and the parallel engine still
has a few limitations. For instance, some known issues:
- parallel make does not deal with .phony targets correctly all the time.
- some errors are deadly in parallel make mode.
- parallel make NEEDS way more sturdy correspondance of file system paths
and target names, since it often needs to match dependencies to targets
before the corresponding files exist.
- some local variables like $* get set in a bogus way in some cases.
- suffix handling has issues, especially related to the NULL suffix.
So, if you find stuff that does NOT yet work with parallel make, don't go
blindly try to fix the Makefile. It's very likely you might have stumbled
into a make bug. (unless you really, really, understand Makefiles, DON'T
GO CHANGING THEM YET).
Tested by lots of people, thanks go to miod@, and robert@ among other people.
Quick summary of what this does:
- remove `saving commands' extension (it's not really usable, nor used)
- move compat job runner and parallel interrupt handling into engine.c
- tweak the code so that both compat and parallel mode use the same job runner
and the same interrupt handling. Remove the other one.
- optimize job runner so that, in parallel mode, the last command does not
fork if we can avoid it (as it's already running in a sub shell).
- scrape all the code that dealt with creating shell scripts from commands.
- scrape all the code that dealt with recognizing special sequences in
command output to print/not print output.
- fix the parallel job pipe to not keep around file descriptors that are not
needed.
- replace the parallel job buffering with a nicer one, that deals with
non-blocking descriptors to try to agregate as much output from one job in
one go (greed) to unconfuse the users.
- create two pipes per job, so that stdout and stderr stay separate.
- make job token printing a debug option.
- always use the parallel job-runner to `execute' commands, even if we just
print them out.
- store list of errors encountered during parallel make running, and print them
on exit, so that we know what went wrong.
- add a dirty hack to targ.c to deal with paths produced by gccmakedep.
|
|
This way, you can run `make .BEGIN'. Okay, this will run .BEGIN twice.
|
|
|
|
|
|
|
|
JobStart and JobRestart often do the same thing.
Move JobMakeArgv call around for similar reasons.
Introduce new list (queuedJobs) we don't use yet.
|
|
|
|
|
|
Add a global `got_signals' to quick-path thru handle_all_signals.
remove most of the #ifdef USE_PGRP cruft: always be ready to handle those
signals, just do not define a handler for them yet.
|
|
|
|
structure.
|
|
zap comment that should have gone with setting use_pipes.
|
|
Replace a stupid comment with something that makes sense.
(this function needs a rewrite, it's incredibly stupid anyways)
|
|
Just create a new one each time we need it, and kill the file right away.
|
|
(taken from NetBSD)
|
|
|
|
|
|
with a debug_printf() function.
Maybe slightly slower, but it's ways easier to read.
|
|
|
|
|
|
|
|
|
|
|
|
Store special targets in target hash, and use them for the parsing.
Use OP_DUMMY flag to mark targets that don't really exist yet, such
as interrupt and default nodes.
Also, .PATHxxx is special in suffixes.
Small tweaks to compat.c, so that run_commands does more stuff after
the fork() (and thus no need to free things).
Remove distinction between local and global jobs.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|