I figured out another solution: If make cannot distinguish the two generated files ../parse.c and parse.c from each other, then the makefile could do that by labelling parse.c, i.e. using a prefix (here: 'g-' for generated); use g-parse.c instead of parse.c. This definitely routes the building path of parse.y through the corresponding .c file built *in* the folder 'build'.
This is at the expense to have an explicit rule for .y files which is - AFAICS - currently needed anyways, since the built-in YACC rule breaks with bison >= 3.0 (at least); more as to why please see below. src_dir = ../src prog: prog.o g-parse.o g-%.c: %.y bison -o $@ $< # solution 1 VPATH = $(src_dir) # solution 2 #vpath %.y $(src_dir) #vpath %.c $(src_dir) Nonetheless, I would be still interested in other sweet and short solutions. Thanks, J. On Wed, 9 May 2018 14:30:15 +0200, Jannick wrote: > Hey, > > I am having an issue with the make vpath/VPATH configuration where make > should ignore a specific existing file in vpath/VPATH. Here my case for which > any input from you is highly appreciated: > > Cd'ed to the folder 'build', the objective is to build prog with the source files > prog.c and parse.y, both sitting in 'src': > > +---build > | makefile > | > \---src > parse.c <<< disregard for a build in folder 'build' > parse.y > prog.c > > The nasty thing is src/parse.c which unfortunately does exist, but should be > ignored for our project, since build/parse.c should be separately build (from > parse.y) and used instead. > > Currently, I am not able - in an elegant way - to avoid that make uses > src/parse.c, unless make -B. The following makefile does the job, but it is not > very elegant to set up a vpath statement for each .c source file (this is just a > tiny example, in real life there might be many of those required). > > $ cat makefile > > src_dir = ../src > prog: prog.o parse.o > %.c: %.y > bison -o $@ $< > > # vpath statement for each .c source file, not very elegant > vpath %.y $(src_dir) > vpath prog.c $(src_dir) > > Alternatives: > 1 - Using VPATH = $(src_dir) instead of the vpath block does not work, since > then make uses src/parse.c unless make -B. > 2 - Another solution could be to copy the source files to build and take it > from there. > 3 - My question: Is there any (easy) tweak to the makefile above (without the > given vpath block) to make that happen - or should be a copy to build folder > & compile method applied or something else I was not thinking of? > > > Separately, an additional note: make's YACC built-in recipe > > %.c: %.y > # recipe to execute (built-in): > $(YACC.y) $< > mv -f y.tab.c $@ > > appears to assume that YACC/bison's output file name defaults to y.tab.c. > However, it is $*.tab.c for bison >= 3.0 (at least). Would that be worth an > enhancement to make to update to the new built-in recipe? Here I am not > sure which versions of yacc are out there and what their output files are > named. > > Many thanks for any input! > > Regards, > J. > > Signatures: > - GNU Make 4.2.1; Built for i686-pc-cygwin > - bison (GNU Bison) 3.0.4 _______________________________________________ Help-make mailing list Help-make@gnu.org https://lists.gnu.org/mailman/listinfo/help-make