我想对从 flex
和 bison
生成的文件使用自动依赖项生成。
现在,我正在这样做:
CSRC=$(wildcard *.c)
OSRC=grammar.y scanner.l
OUTPUT_DIR="../bin"
SOLIDC_OBJS=solid_ast.o solid_strbuf.o solid_strlit.o solidc.o
SOLIDL_OBJS=solidl.o solid_ast.o solid_strbuf.o
CFLAGS += -MD -MP
CC=clang
BISON=bison
FLEX=flex
MKDIR=mkdir -p
all: solidc
solidc: setup $(SOLIDC_OBJS)
$(BISON) -vd grammar.y
$(FLEX) --header-file=scanner.yy.h -o scanner.yy.c scanner.l
$(CC) -o $(OUTPUT_DIR)/$@ $(SOLIDC_OBJS) scanner.yy.o grammar.tab.o
setup:
@$(MKDIR) $(OUTPUT_DIR)
run:
$(OUTPUT_DIR)/$(OUTPUT_NAME)
clean:
$(RM) $(wildcard $(OUTPUT_DIR)/*) $(wildcard *.o) $(wildcard *.d) \
$(wildcard scanner.yy.*) $(wildcard grammar.tab.*) \
$(wildcard grammar.output)
-include $(SRC:%.c=%.d) scanner.yy.d grammar.tab.d
但这不起作用,因为 scanner.yy.d
和 grammar.tab.d
永远没有机会生成。
解决此问题的最佳方法是什么?
Please note that this question is actually not the same as GNU make: Generating automatic dependencies with generated header files, because I'm using the "less efficient"
-include
method rather thansef
, in addition to lots of other things.
最佳答案
如果我没理解错的话,你可以将 grammar.tab.o
和 scanner.yy.o
作为 solidc
的先决条件,然后然后对象规则将为它们生成依赖文件,与任何对象相同。
SOLIDC_OBJS=solid_ast.o solid_strbuf.o solid_strlit.o solidc.o grammar.tab.o scanner.yy.o
all: solidc
grammar.tab.c: grammar.y
$(BISON) -vd grammar.y
scanner.yy.c: scanner.l
$(FLEX) --header-file=scanner.yy.h -o scanner.yy.c scanner.l
solidc: setup $(SOLIDC_OBJS)
$(CC) -o $(OUTPUT_DIR)/$@ $(SOLIDC_OBJS)
(我们可以稍微收紧这些规则,但让我们先让它们发挥作用。)
关于c - 生成的依赖项与生成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11162456/