与生成的文件生成依赖关系

时间:2012-06-22 18:55:29

标签: c makefile code-generation gnu-make

我希望使用从flexbison生成的文件生成自动依赖关系。

现在,我正在这样做:

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.dgrammar.tab.d永远不会有机会被生成。

解决这个问题的最佳方法是什么?


  

请注意,这个问题实际上并不相同   GNU make: Generating automatic dependencies with generated header files,   因为我使用"效率较低" -include方法而非   sef,除了很多其他事情。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你可以只grammar.tab.oscanner.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)

(我们可以稍微加强这些规则,但让我们先让它们工作。)