On Tue, 2009-09-22 at 13:19 -0400, Sam Steingold wrote: > Thanks for the informative reply! > > Paul Smith wrote: > > On Tue, 2009-09-22 at 11:44 -0400, Sam Steingold wrote: > >> I, too, am struggling with rebuilding a directory. > >> it appears that the rule: > >> > >> gllib: config.status > >> mkdir -p gllib; cd gllib; make > >> > >> is wrong because the script "mkdir ..." is always executed, regardless of > >> whether config.status has changed or not. > >> So, what is the right way to handle this? > > > > The short answer is that using a directory as a target in make is almost > > never correct, unless it's a .PHONY target or the equivalent. > > so what is this SUBDIRS automake thingie? > how does it work?
Well, automake generates standard makefiles so you can go check it out, but as far as I'm aware it does just what I mentioned (when generating recursive makefiles): it ALWAYS goes into EVERY directory and runs make there. It's up to that sub-make to determine if the directory is really up to date or not; there's no way that can be known by the upper-level makefile, unless that makefile had knowledge of all the dependency relationships... and if it already has that then why bother to invoke the sub-make in the first place? The upper-level make could just do it instead. > > The problem is that the modification time on a directory means something > > that is not really appropriate for make: the modification time on a > > directory changes whenever the DIRECTORY ITSELF changes. When does a > > directory change? It changes whenever any element in the directory is > > renamed or deleted, or a new element is created in the directory. In > > short, if you run "ls -a" before and after some command and the output > > is identical, then the directory was not modified. > > this makes perfect sense. > thanks. > how about this addition then: > > gllib: config.status > mkdir -p gllib; cd gllib; make > touch gllib/.stamp; rm -f gllib/.stamp > > adding and removing the .stamp file will modify the directory, right? Well, you can just "touch gllib" directly, rather than making/removing files, but this still has lots of issues as Philip describes. > > Your problem here is more conceptual than anything. What, in words, are > > you really trying to get make to do? How does the upper level makefile > > know, really, that it does or doesn't need to invoke the sub-make? It > > can't know that... unless it invokes the submake to see whether anything > > needs to be done. > > I need a few files which are created in gllib by make. > > Do I need to explicitly type > > gllib/foo gllib/bar : config.status > mkdir -p gllib; cd gllib; make You still have to consider prerequisites. Is it true that the one and only reason gllib/foo or gllib/bar might need to be rebuilt is because of a change to config.status? If so, then that will work. But if they could change because of a change to some other file (source in the gllib directory for example) then this isn't sufficient. > > In a standard recursive make environment, sub-makes are almost always > > set up as .PHONY, so they're always invoked, to be sure that their > > content is up to date. That's why recursive makes are slower, > > typically, than non-recursive makes. > > so, if I add gllib to .PHONY, the commands will be always executed, even with > the .stamp trick? Yes; if you do this you should just not bother with the ".stamp trick" (which, again, isn't a good trick anyway :-)). _______________________________________________ Help-make mailing list [email protected] http://lists.gnu.org/mailman/listinfo/help-make
