c++ - GNU make sometime doesn't search in folders declared in VPATH -


i'm trying build small c++ project gnu make (version 3.81) must call make 2 times because first run fails. project directory:

project     makefile     include         lexer.hpp        src         main.cpp         lexer.l 

following makefile:

cc = g++ cppflags = -i include vpath = include src  objects = main.o lexer.o  test: $(objects) $(cc) $(cppflags) -lfl -o $@ $^  main.o: lexer.hpp main.cpp     $(cc) -c $(cppflags) $^  lexer.o: lexer.cpp     $(cc) -c $(cppflags) $^  lexer.cpp: lexer.l     flex -t $^ > src/lexer.cpp  .phony: clean  clean:     rm -fr $(objects) src/lexer.cpp test 

the first time run make following output make complains not finding lexer.cpp file. don't understand why make don't seek in folders declared in vpath.

g++ -c -i include include/lexer.hpp src/main.cpp flex -t src/lexer.l > src/lexer.cpp g++ -c -i include lexer.cpp g++: error: lexer.cpp: no such file or directory g++: fatal error: no input files compilation terminated. make: *** [lexer.o] error 1 

however if call make again lexer.cpp found , compilation works.

g++ -c -i include src/lexer.cpp g++ -i include -lfl -o test main.o lexer.o 

why?

p.s. apologize poor english.

this rule wrong:

lexer.cpp: lexer.l         flex -t $^ > src/lexer.cpp 

this rule tells make build file lexer.cpp, , that's make expecting do, , after rule finishes make thinks file ready go, , use filename when other targets depend on it. rule does, build src/lexer.cpp.

to write rule correctly you'll need write as:

src/lexer.cpp: lexer.l         flex -t $^ > $@ 

(every make rule write should update file $@, exactly).

however, in general vpath not finding generated files (object files, etc.: file generated make). it's useful finding source files (files make doesn't build itself).


Comments