Я строю парсер, используя Bison и Flex. Чтобы скомпилировать все, я использую простой make-файл. Однако я не специалист по созданию make-файла. Файл makefile работает, за исключением нескольких вещей:Makefile: ничего не нужно
Изменение исходного кода в файле file.cpp не обнаружено в make-файле. Нечего делать. A make clean
устраняет проблему, но это, конечно, не обязательно. Я нашел много учебников по make-файлу, но не обсуждает такие проблемы.
CC=g++
CFLAGS=-Wall -std=c++11 -ll
EXECUTABLE=parser
OBJS=parser.tab.cpp lex.yy.c
FILES= file.cpp
all: parser
parser.tab.cpp parser.tab.hpp: parser.ypp
bison -d parser.ypp
lex.yy.c: parser.l parser.tab.hpp
flex parser.l
parser: $(OBJS) $(FILES)
$(CC) $(CFLAGS) $(OBJS) $(FILES) -o $(EXECUTABLE)
clean:
rm -rf *o $(EXECUTABLE) $(OBJS)
Конечно, я мог бы использовать make -B all
, а потом я обнаружил что-то странное:
bison -d parser.ypp
bison -d parser.ypp
flex parser.l
g++ -Wall -std=c++11 -ll parser.tab.cpp lex.yy.c file.cpp -o parser
Почему bison -d parser.ypp
делается в два раза?
[РЕШИТЬ]
настоящее время мы используем следующие Makefile:
CC = g++
CFLAGS = --std=c++0x -O2
SOURCES = $(wildcard */*.cpp *.cpp) parser/parser.cpp
OBJECTS = $(SOURCES:.cpp=.o) scanner/scanner.o parser/parser.o
EXECUTABLE = calculator
all: parser/parser.cpp scanner/scanner.cpp $(EXECUTABLE)
parser/parser.cpp:
cd parser && bison -d -o parser.cpp grammar.ypp && cd ..
scanner/scanner.cpp: parser/parser.hpp
cd scanner && flex -o scanner.cpp lexer.l && cd ..
$(EXECUTABLE): $(OBJECTS)
$(CC) $^ -o "[email protected]"
%.o: %.cpp
$(CC) $(CFLAGS) -c "$<" -o "[email protected]"
clean:
rm -rf $(OBJECTS) $(EXECUTABLE) parser/parser.cpp parser/parser.hpp scanner/scanner.cpp
Почему именно вы хотите, чтобы lex.yy.c был перестроен в результате изменения файла file.cpp? –