Hi Tim, * Tim Van Holder wrote on Fri, Nov 04, 2005 at 04:33:49PM CET: > Ralf Wildenhues wrote: > > > > Can't you just make it depend on the other source files? > > > > builddate.c: $(geoidx_SOURCES) > > echo ... > > Well, it all depends on what "the build timestamp" is supposed to mean.
Yes, of course. > If builds are only made from fresh source trees, depending on the > sources is fine. > However, if it is supposed to be the date of the last build (i.e. "make" > invocation) that produced a new executable, then depending on the > sources is not correct (example: initial make, then "rm *.o; make" two > days later). Even depending on the objects is not enough, as one of > the libraries (or any other LDADD stuff) may have changed. Well, create a stamp that is updated by config.status so after a reconfigure you'll update. For any in-project libraries, just add them to the list of dependencies. I'd also recommend putting things like some config.h #define's and maybe flags like CFLAGS etc in the data. For example, mutt does this very nicely. > So the only "correct" way to have this work correctly is something like: > > builddate.c: <whatever the target depends on except builddate.$(OBJEXT)> > > which probably comes down to > > builddate.c: $(filter-out builddate.$(OBJEXT),$(foo_OBJECTS)) \ > $(foo_LDADD) foo_OBJECTS is not published interface of Automake, so it may change. You could use sth like $(patsubst %.c,%.$(OBJEXT), $(filter-out builddate.c, $(foo_SOURCES))) with GNU make, though. > (not sure how to do it outside of GNU make). List files manually, I guess. Portable make is quite limited there. > I do something similar in my (non-automake) makefiles; except that I > use __DATE__ and __TIME__ in the source, and it's the object that > depends on all other objects and libraries to trigger a recompile. Why do you care about the actual build time? When I read a bug report, I want to know the time the sources were last updated, i.e., which version the user has, not when he built whatever old source. Adding something like a svn version helps even more. > Perhaps you can get away with: > > foo_SOURCES: foo.c bar.c > foo_LDADD: xyzzy.a (you mean `=' instead of `+', I guess; `:=' is not portable, by the way). > foo$(EXEEXT): build.$(OBJEXT) > > build.$(OBJEXT): build.c $(foo_OBJECTS) $(foo_LDADD) > > (but I'm not sure how kosher it is to have sources/objects that you > don't tell automake about). That is no problem per se. But if you use make dependencies instead of the *_DEPENDENCIES variables, you have to write the updating rules yourself, and update CLEANFILES, I believe. And the same issue about unpublished *_OBJECTS. Maybe Automake should publish *_OBJECTS? I do not know what issues might be hidden here, to be honest. Cheers, Ralf
