This sounds like an awesome idea!

The article being 9 years old makes me wonder though... is it something
that'll be done in the foreseeable future?

thx,
e.

On Tue, Oct 20, 2015 at 9:57 PM, David Boyce <david.s.bo...@gmail.com>
wrote:

> My view is that this is really a variant of the longstanding
> discussion about getting make to not rely on timestamps at all and use
> MD5 or similar digital signatures instead. There are a number of
> reasons why timestamps can be insufficient beside this race condition,
> so I think it might be better to put effort into getting that working
> than doing more work on the timestamp implementation.
>
> Note that there are published mechanisms for using checksums with
> existing make. For instance
> http://www.cmcrossroads.com/article/rebuilding-when-files-checksum-changes
> .
>
> David Boyce
>
> On Tue, Oct 20, 2015 at 11:36 AM, Egmont Koblinger <egm...@gmail.com>
> wrote:
> > Hi,
> >
> > Let me tell 2 real-life examples:
> >
> > 1. The one that made me find this issue:
> >
> > My hobby project takes 45 seconds to compile, out of which the biggest
> .cc
> > file that I modify most of the time is 15 seconds.  In order to
> understand
> > what's going on (it was not written by me, I'm just fixing bugs and
> adding
> > new features) I often insert statements like printf("A\n"); so that I'll
> see
> > the code is there.  I copy-paste it to multiple places, replacing the
> letter
> > with B, C etc.
> >
> > Once I forgot to replace the letter. Saved, launched make, and
> immediately
> > realized this mistake.  So went back, fixed the file, saved, and
> re-launched
> > make (probably just pressed the Up arrow and Enter, not even caring
> whether
> > the previous make had already finished or not).  I got hit by this race,
> and
> > seeing only A's in the program's output mislead me into incorrectly
> thinking
> > that B is not reached in the code, wasting a lot of time.
> >
> > I prefer uninterrupted runs of development with full focus for maybe an
> hour
> > or two at a time, re-compiling the app every minute or two in certain
> phases
> > of development.  Standing up and grabbing a coffee is not a viable
> option.
> > (And yes, I do know about gdb, I just prefer printf-debugging whenever I
> > can.)
> >
> > 2. Another example that also happens to me relatively frequently:
> >
> > I download a mid-size piece of free software (let's say it compiles in 10
> > minutes) and apply a couple of patches to it.  Let's assume applying the
> > patches takes 5 minutes (I have to figure out the order, whether they're
> -p0
> > or -p1, some of them slightly conflict and I have to manually merge).
> If I
> > perform these two steps sequentially, it's a total of 15 minutes.  So,
> > instead, what I do is:  Start a make (or "make -k" preferably), and
> > immediately afterwards start applying the patches.  This way we use the
> CPU
> > time and my time in parallel.  Finally run "make" once again to catch up.
> > This can reduce the total time in this example from 15 minutes to hardly
> > more than 10 minutes.  Alas, chances that I'll be bitten by this race
> > condition is not negligible.
> >
> > ---
> >
> >> I don't think make should be worried about this potential race; it's an
> >> obvious case of user error with an easy discipline for the user to apply
> >> to avoid any problems.
> >
> > Is it really obvious?  Is it documented somewhere?  Do you really think
> > pretty much all users of make think about it?  I, for one, first used
> make
> > (not just typed the command, but understood its basics, wrote a tiny
> > Makefile for a tiny project) about 18-20 years ago, yet this race
> condition
> > never occurred to me until recently.
> >
> > Many years ago I was wondering what "make" would do if the source and
> > destination files had the exact timestamp.  I had better things to do
> than
> > actually try it out or look it up, I just assumed that developers had put
> > proper thought to it and found the solution that Just Works™.  Nowadays
> with
> > nanosecond timestamps I just don't care anymore.
> >
> > Had I thought about it, I probably would have just guessed that I'm not
> the
> > first one with this race condition problem, would have assumed that
> there's
> > already a clever solution for this in place which, again, Just Works™.
> > Seeing that there isn't any, I'm kindly asking you to think about it and
> > come up with one.
> >
> >> It's a rough-and-ready tool for developers, with
> >> no pretenses of being intended for use by those who don't think about
> >> how their tools work.
> >
> > Do you really claim I should deeply think about all corner cases of the
> > tools before using them?  Given that "make" is just a tiny little
> fraction
> > of all the tools I'm using, it's practically impossible.  In fact, I
> think
> > it's quite the opposite!  The creators of such tools should do their
> best to
> > make sure that the tools work reliably as expected.
> >
> > I didn't think about the internals of make -- why should have I?  I knew
> the
> > goal it was serving: to create an up-to-date build in as little overall
> time
> > as possible.  With my particular development pattern it fails to achieve
> > this goal.  I don't think it's me who should've thought of this, nor that
> > it's me who should change my workflow (touch the file after make
> completes,
> > or not save while make is running, or start drinking coffee, or accept
> that
> > I can not parallelize my time with the CPU's time, effectively taking
> away
> > long minutes of my life many times for no good reason).
> >
> > In my firm opinion, it should be make's job to do whatever it can to
> produce
> > an up-to-date build under any circumstance.  Hey, that's what make is all
> > about!
> >
> >> Of course, if a file-system had a separate "up to date at" file-stamp,
> >> that make can set (to the newest dependency's time-stamp) and later
> >> read, or if make were to store this same datum in a separate database,
> >> it would solve your problem.  It would also make it possible to have
> >> make rules that tentatively build the new file, compare to existing,
> >> replace if (meaningfully) different but only revise "up to date at"
> >> otherwise.
> >
> > Such a tiny "database" could indeed solve this problem without race
> > condition.  I would be more than happy to see this implemented!  It
> wouldn't
> > have to be a "database", just a simple ephemeral text file that's
> removed on
> > clean exit of make, listing all the currently running rules that'd have
> to
> > be rerun if this file exists on startup (meaning that the previous run
> was
> > interrupted or crashed).
> >
> >> As you note, every command that might be used in a make rule would need
> >> to do this "right", which is a prohibitive requirement.
> >>
> >> Requiring every command that could be used as a make rule to abide by
> >> this is, again, prohibitive.  [...]
> >
> > Some of these ideas I've thrown in might not work in practice, I agree.
> >
> > Please note that I had a simple propsal: re-check the timestamps of input
> > files when a rule completes and re-run (moving away or dating back the
> > previous output file first) if any of them changed.  This would not
> elimite
> > the race condition completely, but would make the window magnitudes
> smaller
> > (e.g. fraction of a millisecond instead of 15 seconds), and as such,
> would
> > already be a great improvement!
> >
> >
> > cheers,
> > egmont
> >
> >
> > _______________________________________________
> > Bug-make mailing list
> > Bug-make@gnu.org
> > https://lists.gnu.org/mailman/listinfo/bug-make
> >
>
_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to