GNU Makefile-具有多个目标且具有一个依赖项的模式规则将忽略除第一个目标以外的所有目标

GNU Makefile-具有多个目标且具有一个依赖项的模式规则将忽略除第一个目标以外的所有目标,makefile,gnu-make,Makefile,Gnu Make,我想使语言依赖于目标。特别是:我有一个源文件,我想创建不同的对象,并将其添加到相应的语言文件夹中。编译器将得到,单个源文件的C标志不同。只要我以静态的方式使用它,它就工作得很好 de/info.o en/info.o es/info.o : info.c $(ECHO) (DEP) $< for $@ 以防万一:不,对象不存在。因此,没有目标,但存在一个dependencie,因此make应该执行规则 编辑:找到了该问题的解决方案 define FOO $(1)/%.o

我想使语言依赖于目标。特别是:我有一个源文件,我想创建不同的对象,并将其添加到相应的语言文件夹中。编译器将得到,单个源文件的C标志不同。只要我以静态的方式使用它,它就工作得很好

de/info.o en/info.o es/info.o : info.c
    $(ECHO)     (DEP) $< for $@
以防万一:不,对象不存在。因此,没有目标,但存在一个dependencie,因此make应该执行规则

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

define FOO

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

endef

 $(foreach lang,$(LANGUAGE_LIST), $(eval $(call FOO,$(lang))))
定义FOO
$(1)/%.o:%.c
$(回声)$$<表示$(1)
恩德夫
$(foreach lang,$(语言列表),$(eval$(call FOO,$(lang)))

灵感来自:

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

a b c: d
      command
相当于更长的符号

a: d
      command
b: d
      command
c: d
      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
$cat GNUmakefile
所有:de/x.o en/x.o es/x.o
de/%.o:%.c
@echo$@来自$<
en/%.o:%.c
@echo$@来自$<
es/%.o:%.c
@echo$@来自$<
$gmake
从x.c.de/x.o
从x.c.发送en/x.o
x.c.的es/x.o
相关文件见GNU make手册的10.5.1模式规则简介:

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


啊,好吧,是的,我读过这篇文章……但我认为这个问题会有一个可靠的解决方案。”因为每次添加语言时都必须添加一个目标。如果你的命令是多行的,考虑定义一个多行宏名为“代码>命令< /代码>,并使用<代码> @ $(call命令)< />代码。然后,每种新语言只需要添加两行。宏是一个很好的提示!
$(foreach,)
$(eval)
$(call)
的组合解决了这个问题!我编辑了我的第一篇文章。
a: d
      command
b: d
      command
c: d
      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