On Ne, 2013-02-03 at 00:45 +0100, Sebastian Pipping wrote: > On 02.02.2013 18:38, Matěj Týč wrote: > >> How about something like this? > >> > >> bar_deps = foo1 foo2 > >> > >> bar: $(bar_deps) > >> > >> $(bar_deps): > >> $(MAKE) cache-foo > >> touch $@ > >> > >> %: > >> touch $@ > > > > I have also thought of that, but this can work well reliably only in the > > case if there is only one make job. If I specify -j4, it may happen that > > all jobs will attempt to load the same cache simultaneously, which I > > have to avoid :-( > > If that happens how about replacing > > $(MAKE) cache-foo > > by something like > > mkdir .lock 2>/dev/null || exit 0 ; \ > $(MAKE) cache-foo ; \ > ret=$$?; \ > rmdir .lock && exit $${ret} > > The idea is: > > - mkdir can only succeed once > > - if "$(MAKE) cache-foo" fails > > 1. the whole should return non-zero > > 2. .lock is not left laying around
Thank you, but just by looking at it, I think that if .lock exists, 0 is returned and while one make job is busy loading the cache, the others act like the cache was loaded. Writing the makefile and trying it confirms this assumption, so I guess that it has to behave like that. I am beginning to think that the most elegant (from the user's point of view) would be (probably optional) ignore of order-only dependencies if the target exists and is more up-to-date than its ordinary dependencies. How difficult could be writing a patch that would enable this? Matej _______________________________________________ Bug-make mailing list Bug-make@gnu.org https://lists.gnu.org/mailman/listinfo/bug-make