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
Post a Comment