Makefile:从模式列表创建规则

Makefile:从模式列表创建规则,makefile,Makefile,在我的目录中,我有许多名为 A.xxx A01.xxx A02.xxx A03.xxx B.xxx B01.xxx Z 我想创建如下规则 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

在我的目录中,我有许多名为 A.xxx A01.xxx A02.xxx A03.xxx B.xxx B01.xxx

Z

我想创建如下规则

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)


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

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

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

最短茎规则将使
A.yyy
A01.yyy
Z01.yyy
分别难以拥有3种不同的模式规则。但是,使用eval函数,您可以使用
列表
变量中的可用信息为
A.yyy
B.yyy
生成非模式规则,并为其他目标生成正确的模式规则(假设根据名称前缀做出决定):


请注意,不会为
A01.yyy
B01.yyy
选择回退解决方案(
command 3
),因为
LIST\u规则
模板中的模式规则会导致较短的干(
01
而不是
A01
B01

您的问题不清楚。您希望它如何构建
A02.yyy
?是否有一个
B05.xxx
?我试图解决我的问题。例如A02.yyy:A02.xxx A.xxx;cat$+>$@我可以有数百个类型的文件,或者A…xxx B…xxx和C…xxx D…xxx,所以我需要一个包含所有前缀A B C D的列表,因为我不想手动点全部。当A是列表的一部分时,有没有办法从字符串A中提取字符串A?你可以找到答案,但是它涉及到一些先进的制造技术。非常感谢,我会试试这个。作为makefiles的新用户,这似乎是一个艰难的挑战:很好的挑战!!
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 
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