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知道规则的配方负责制作所有目标.配方仅执行一次以制作所有目标.当搜索模式规则以匹配目标时,除了匹配需要规则的目标的规则之外的规则的目标模式是偶然的:仅担心给出当前有问题的文件的配方和先决条件.但是,运行此文件的配方时,其他目标将标记为已自行更新.