未调用单后缀规则(如预期)

问题描述 投票:0回答:2

帖子需要一个可以处理丢失文件的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 文件。

gnu-make
2个回答
0
投票

我不明白你想要什么。如果您解释了您想要进行的操作的完整示例,将会很有帮助。

但是,在 make 中,all 目标只有在过期时才会运行。使用的规则是隐式的还是显式的并不重要。如果 (a) 目标不存在,或者 (b) 目标确实存在,但其修改时间早于其一个或多个先决条件,则目标已过时。或者,如果您声明它是

.PHONY

根据上面显示的输出,似乎您的

lib.gen
文件 does 存在,并且您没有为其提供任何先决条件,因此 make 认为它是最新的并且不会重建它。这正是我所期望的行为。


0
投票

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 文件必须存在。

© www.soinside.com 2019 - 2024. All rights reserved.