1

我想对从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永远没有机会生成。

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


请注意,这个问题实际上与 GNU make: Generate automatic dependencies with generated header files不同,因为除了许多其他事情之外,我使用的是“效率较低”的-include方法而不是 。sef

4

1 回答 1

0

如果我理解正确,您可以只 makegrammar.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)

(我们可以稍微收紧这些规则,但让我们先让它们发挥作用。)

于 2012-06-22T23:00:23.700 回答