Makefile:从模式列表中创建规则

时间:2017-01-15 13:53:01

标签: makefile

在我的目录中,我有许多名为的文件 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 

1 个答案:

答案 0 :(得分:0)

您应该阅读的文档的两个重要部分包括:

  

eval函数非常特殊:它允许您定义不是常量的新makefile构造;这是评估其他变量和函数的结果。扩展eval函数的参数,然后将该扩展的结果解析为makefile语法。扩展结果可以定义新的变量,目标,隐式或显式规则等。

  

多个模式规则可能符合这些标准。在这种情况下,make将选择具有最短词干的规则(即,最具体匹配的模式)。如果多个模式规则具有最短的词干,则make将选择在makefile中找到的第一个。

最短的词干规则将难以分别为A.yyyA01.yyyZ01.yyy设置3种不同的模式规则。但是,使用eval函数,您可以使用list变量中的可用信息为A.yyyB.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 3A01.yyy不会选择回退解决方案(B01.yyy),因为LIST_RULE模板中的模式规则会导致较短的干( 01代替A01B01