The % should have been present in the rule. I added it in and reran things and yes, the rules are copied in. I note that explicit rules for the individual programs are also copied in, so I assume that's what is overriding the pattern rules.
I can't do this with suffix rules since $(EXE) when it's nonempty has a . in it, so... .opt$(EXE).$(OBJEXT): $(LINK) -o $@ $< would be invalid as asuffix rule specifier, for example. So, I'm stuck with pattern rules -- or enumerating out a long list of individual rules. On Friday, 18 July 2014, 9:03 pm +0100, Gavin Smith <gavinsmith0...@gmail.com> wrote: > On Mon, Jul 14, 2014 at 6:49 PM, Will Estes <westes...@gmail.com> wrote: > > I have the following in my Makefile.am, and automake is not using the rule > > to build the executable. > > > > tableopts_nr%.c: tableopts.l4 > > $(FLEX) -P $(subst -,_,$(*F)) $* -o $@ $< > > > > tableopts_nr%.$(OBJEXT): tableopts_nr%.c > > $(COMPILE) -c -o $@ $< > > > > tableopts_nr%.tableopts$(EXEEXT): tableopts_nr.$(OBJEXT) > > $(LINK) $^ > > > > The % is matching various things like -Ca and so on that are options to > > flex for different kinds of tables that flex can produce. This is in the > > test suite and I've generated the long list of _SOURCES variables and the > > programs are listed in CHECK_PROGRAMS and TESTS. > > > > The .tableopts suffix is present because I'm using the parallel test > > harness to distinguish between various kinds of tests in the flex test > > suite that need different kinds of arguments when they're run. > > > > THe output from trying to build the program with the Makefile.am as above > > looks like this: > > > > /bin/bash ../libtool --tag=CC --mode=link gcc -g -O2 -o > > tableopts_nr-Ca.tableopts -lm > > libtool: link: gcc -g -O2 -o tableopts_nr-Ca.tableopts -lm > > /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In > > function `_start': > > (.text+0x20): undefined reference to `main' > > collect2: error: ld returned 1 exit status > > > > As a test, I did try explicitly listing tableopts_nr-Ca.tableopts$(EXEEXT) > > as a target and make did build the program correctly. > > > > How do I get automake to recognize my pattern rule? Or, if there's another > > way to do this that's easier / better, what is that? > > Try checking your generated "Makefile.in" and "Makefile" files to see > if automake has copied these rules through. If not, it could be > because automake doesn't recognize GNU make extensions (pattern rules > with % don't exist in some other make programs). However, if it did > succeed in passing them through, it could be a problem with your > rules. I thought it was strange that in the rule > > > tableopts_nr%.tableopts$(EXEEXT): tableopts_nr.$(OBJEXT) > > $(LINK) $^ > > the object file doesn't have a % in it (so the same file will be used > for all matches of this pattern), but in > > > > tableopts_nr%.$(OBJEXT): tableopts_nr%.c > > $(COMPILE) -c -o $@ $< > > there is a % there. Try making a simple Makefile to check the logic of > your rules first and then try to incorporate it in your Makefile.am.