在我的目录中,我有许多名为的文件 A.xxx A01.xxx A02.xxx A03.xxx B.xxx B01.xxx
ž......
我想创建像
这样的规则A.yyy : A.xxx
command type 1
A01.yyy : A01.xxx A.xxx
command type 2
B.yyy : B.xxx
command type 1
B01.yyy : B01.xxx B.xxx
command type 2
Z01.yyy: Z01.xxx
command type 3
有人能给我一个提示吗?
我尝试了类似这样的东西(对于命令1和3似乎没问题,但在命令2中,我看不到如何放置第二个perequisit)
list:= A B
source=$(wildcard *.xxx)
compi:=$(patsubst %.xxx, %.yyy, $(source))
list_pattern=$(addsuffix %, $(list))
list_yyy=$(addsuffix .yyy, $(list))
list_nb_yyy=$(filter $(list_pattern), $(compi))
%.yyy:%xxx
@echo $@ - $+ - command 3
all: $(compi)
.SECONDEXPANSION:
$(list_yyy): $$(patsubst %.yyy, %.xxx, $$@)
@echo $@ - $+ - command 1
$(list_nb_yyy): $$(patsubst %.yyy, %.xxx, $$@)
@echp $@ - $+ - command 2
答案 0 :(得分:0)
您应该阅读的文档的两个重要部分包括:
eval函数非常特殊:它允许您定义不是常量的新makefile构造;这是评估其他变量和函数的结果。扩展eval函数的参数,然后将该扩展的结果解析为makefile语法。扩展结果可以定义新的变量,目标,隐式或显式规则等。
多个模式规则可能符合这些标准。在这种情况下,make将选择具有最短词干的规则(即,最具体匹配的模式)。如果多个模式规则具有最短的词干,则make将选择在makefile中找到的第一个。
最短的词干规则将难以分别为A.yyy
,A01.yyy
和Z01.yyy
设置3种不同的模式规则。但是,使用eval函数,您可以使用list
变量中的可用信息为A.yyy
和B.yyy
生成非模式规则,并为其他目标生成正确的模式规则(假设决定是在名称前缀上做出的:)
list:= A B
source=$(wildcard *.xxx)
compi:=$(patsubst %.xxx, %.yyy, $(source))
all: $(compi)
define LIST_RULE
$(1).yyy: $(1).xxx
@echo $$@ - $$+ - command 1
$(1)%.yyy: $(1)%.xxx $(1).xxx
@echo $$@ - $$+ - command 2
endef
$(foreach l,$(list),$(eval $(call LIST_RULE,$(l))))
%.yyy: %.xxx
@echo $@ - $+ - command 3
请注意,command 3
和A01.yyy
不会选择回退解决方案(B01.yyy
),因为LIST_RULE
模板中的模式规则会导致较短的干( 01
代替A01
或B01
)