I have restored the original 'multitask' for single-threaded mode
only. Now Drake and Rake should have functionally identical codepaths
for single-threaded mode (default behavior); my previous assertion of
such which wasn't quite true.
I have also taken Thomas Sawyer's suggestion for a randomizing option
(credited in the ChangeLog).
New sections of the README:
=== Migrating to -j
First of all, do you want to bother with -j? If you are satisfied
with your build time, then there is really no reason to use it.
If on the other hand your build takes twenty minutes to complete, you
may be interested in investing some time getting the full dependency
tree correct in order to take advantage of multiple CPUs or cores.
Though there is no way for Drake to fathom what *you* mean by a
correct dependency, there is a tool available which helps you get
closer to saying what you mean.
% drake --rand[=SEED]
This will randomize the order of sibling prerequisites for each task.
When given the optional SEED integer, it will call srand(SEED) to
produce the same permutation each time. The randomize option also
disables +multitask+.
Though this option may produce an error due to an unspecified
dependency, at least it will be an error which is exactly the same on
each run (with SEED). In addition, you'll have the major debugging
advantage of using a single thread.
This option will also work in multi-threaded mode. After all, once
-jN is running smoothly there is *still* no guarantee that you have it
right. However with each successful execution of drake -jN --rand,
the probability of correctness approaches 1 (though asymptotically
so).
(The only way to prove correctness is to test all such permutations,
which for any non-trivial project would be prohibitively large,
especially those which meaningfully benefit from -j.)
=== MultiTask
When more than one thread is given, +multitask+ behaves just like
+task+. Those tasks which may properly be run in parallel will be run
in parallel; those which cannot, will not. It is not the user's job
to decide. In other words, for -jN (N > 1), +multitask+ is an alias
of +task+.
For -j1 (default), +multitask+ behaves as the original.