帖子需要一个可以处理丢失文件的makefile依赖规则听起来对我的问题很有希望。不幸的是,单后缀规则并不像预期的那样对我起作用......
.SUFFIXES:
.SUFFIXES: .gen
# .gen: --> "building lib using lib.c lib.gen" when file present
# %.gen: --> "code generation from lib.gen started" when file **NOT** present
# "building lib using lib.c lib.gen" when file present
.gen:
@echo code generation from $@ started...
# library is built with source files generated
# from lib.gen
lib: lib.c lib.gen
@echo building $@ using $^
bin: lib
@echo building $@
我想构建一个具有“动态部分”的库。根据 lib.gen 的内容,可能会添加其他源文件(这是另一个故事)。因此,当遇到 .gen 文件时,应使用 $@ 调用生成器(脚本)。
单后缀规则应为
.gen:
但是没有被击中。
Actually -d tells me (even with .PHONY : lib):
Found an implicit rule for 'lib.gen'.
Finished prerequisites of target file 'lib.gen'.
No need to remake target 'lib.gen'.
我玩过并使用过
%.gen:
配方被击中,但前提是 lin.gen 不存在……
后者看起来像一个模式规则。其实
% : %.gen
(根据 O'Reilly 的书)也不会被调用。
是否有机会调用隐式规则?
PS:我使用单后缀,因为生成器将生成 .c 和 .h 文件。
我不明白你想要什么。如果您解释了您想要进行的操作的完整示例,将会很有帮助。
但是,在 make 中,all 目标只有在过期时才会运行。使用的规则是隐式的还是显式的并不重要。如果 (a) 目标不存在,或者 (b) 目标确实存在,但其修改时间早于其一个或多个先决条件,则目标已过时。或者,如果您声明它是
.PHONY
。
根据上面显示的输出,似乎您的
lib.gen
文件 does 存在,并且您没有为其提供任何先决条件,因此 make 认为它是最新的并且不会重建它。这正是我所期望的行为。
makefile 需要如下所示才能工作:
.SUFFIXES:
.SUFFIXES: .gen
.gen:
@echo code generation from $< started...
bin: lib
@echo building $@
# library is built with source files generated
# from lib.gen
lib: lib.c lib_cfg
@echo building $@ using $^
在最后一条规则中,必须省略依赖项中的“.gen”!
注意:lib_cfg.gen 文件必须存在。