【问题标题】:generated dependencies with generated files使用生成的文件生成依赖项
【发布时间】:2012-06-25 02:55:33
【问题描述】:

我想对从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: Generating automatic dependencies with generated header files, 因为我使用的是“效率较低”-include 方法而不是 sef,还有很多其他的东西。

【问题讨论】:

  • 我对 flex 和 bison 不是很熟悉。显示的$(FLEX) 和$(BISON) 命令是否生成scanner.yy.d 和grammar.tab.d?或者如果他们不知道,你知道其他命令吗?
  • 没有。它们生成scanner.yy.c 和grammar.tab.c。我猜你可以手动 $(CC) 那些?

标签: c makefile code-generation gnu-make


【解决方案1】:

如果我没听错的话,你可以把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)

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

【讨论】:

  • 你添加的两个动作好像没有运行?不过,谢谢。
  • 这可能需要几次迭代。试试rm -f grammar.tab.c ; make grammar.tab.c,如果可行,rm -f grammar.tab.o ; make grammar.tab.o。
  • rm -f grammar.tab.c ; make solidc 怎么样?
  • “不起作用”是什么意思?发生什么了?当你make grammar.tab.o 时,它会构建grammar.tab.d 吗?当你 make solidc.o 时,它会构建 solidc.d 吗?请编辑您的问题以添加这些实验的结果。
猜你喜欢
  • 2011-07-10
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2014-02-21
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多