Previous: , Up: Some example packages   [Contents][Index]


3.3 Building etags and ctags

Here is another, trickier example. It shows how to generate two programs (ctags and etags) from the same source file (etags.c). The difficult part is that each compilation of etags.c requires different cpp flags.

bin_PROGRAMS = etags ctags
ctags_SOURCES =
ctags_LDADD = ctags.o

etags.o: etags.c
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags.o: etags.c
        $(COMPILE) -DCTAGS -o ctags.o -c etags.c

Note that ctags_SOURCES is defined to be empty—that way no implicit value is substituted. The implicit value, however, is used to generate etags from etags.o.

ctags_LDADD is used to get ctags.o into the link line. ctags_DEPENDENCIES is generated by Automake.

The above rules won’t work if your compiler doesn’t accept both ‘-c’ and ‘-o’. The simplest fix for this is to introduce a bogus dependency (to avoid problems with a parallel make):

etags.o: etags.c ctags.o
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags.o: etags.c
        $(COMPILE) -DCTAGS -c etags.c && mv etags.o ctags.o

Also, these explicit rules do not work if the de-ANSI-fication feature is used; supporting that requires a little more work:

etags._o: etags._c ctags.o
        $(COMPILE) -DETAGS_REGEXPS -c etags.c

ctags._o: etags._c
        $(COMPILE) -DCTAGS -c etags.c && mv etags._o ctags.o