GNU Makefile - 具有一个依赖项的多个目标的模式规则忽略所有目标,但第一个目标

时间:2015-01-08 08:58:22

标签: makefile gnu-make

我想制作一个语言依赖目标。特别是:我有一个源文件,我想创建不同的对象,其中添加到相应的语言文件夹。单个源文件在C-Flags中会有所不同,编译器会得到。只要我以静态方式使用它,它就可以正常工作。

de/info.o en/info.o es/info.o : info.c
    $(ECHO)     (DEP) $< for $@

现在我想,如果它有点动态,那将是很好的,以防我将添加一个新的语言依赖文件。所以我使用了一个通配符:

de/%.o en/%.o es/%.o : %.c
    $(ECHO)     (DEP) $< for $@

但是现在它只是制造了第一个目标而忽略了其余的目标。 Make-Debug打印出以下内容:

Successfully remade target file `de/info.o'.
Considering target file `en/info.o'.
File `en/info.o' was considered already.

以防万一:不,对象不存在。所以没有目标,但是现有的依赖,所以make应该执行规则。

编辑:找到解决该问题的方法。

define FOO

$(1)/%.o : %.c
    $(ECHO)     $$< for $(1)

endef

 $(foreach lang,$(LANGUAGE_LIST), $(eval $(call FOO,$(lang))))

灵感来自:http://www.gnu.org/software/make/manual/make.html#Eval-Function

1 个答案:

答案 0 :(得分:7)

模式规则与隐式规则的工作方式不同。而隐含的规则,如

a b c: d
      command

相当于较长的符号

a: d
      command
b: d
      command
c: d
      command

这不适用于模式规则。明确需要具有多个目标的模式规则,以便在command的单个调用中构建其目标的所有。因此你必须写

$ cat GNUmakefile
all: de/x.o en/x.o es/x.o

de/%.o: %.c
        @echo $@ from $<
en/%.o: %.c
        @echo $@ from $<
es/%.o: %.c
        @echo $@ from $<
$ gmake
de/x.o from x.c
en/x.o from x.c
es/x.o from x.c

相关文档可在GNU make手册的 10.5.1模式规则简介中找到:

  

模式规则可能有多个目标。与普通规则不同,这并不会使用相同的先决条件和配方来执行许多不同的规则。如果模式规则具有多个目标,则make知道规则的配方负责制作所有目标。配方仅执行一次以制作所有目标。当搜索模式规则以匹配目标时,除了匹配需要规则的目标的规则之外的规则的目标模式是偶然的:仅担心给出当前有问题的文件的配方和先决条件。但是,当运行此文件的配方时,其他目标将标记为已自行更新。