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

Mar*_*rio 10 makefile gnu-make

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

de/info.o en/info.o es/info.o : info.c
    $(ECHO)     (DEP) $< for $@
Run Code Online (Sandbox Code Playgroud)

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

de/%.o en/%.o es/%.o : %.c
    $(ECHO)     (DEP) $< for $@
Run Code Online (Sandbox Code Playgroud)

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

Successfully remade target file `de/info.o'.
Considering target file `en/info.o'.
File `en/info.o' was considered already.
Run Code Online (Sandbox Code Playgroud)

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

编辑:找到该问题的解决方案.

define FOO

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

endef

 $(foreach lang,$(LANGUAGE_LIST), $(eval $(call FOO,$(lang))))
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*ens 10

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

a b c: d
      command
Run Code Online (Sandbox Code Playgroud)

相当于较长的符号

a: d
      command
b: d
      command
c: d
      command
Run Code Online (Sandbox Code Playgroud)

这不符合模式规则.明确需要具有多个目标的模式规则,以在单个调用中构建所有目标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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好吧,如果您的命令是多行的,请考虑定义一个名为`commands`的多行宏,并将其与`@ $(调用命令)`一起使用.然后每种新语言只需要添加两行. (2认同)