Makefile通用模式规则——xyzy.ext0中的xyzy-en_US.ext2

Makefile通用模式规则——xyzy.ext0中的xyzy-en_US.ext2,makefile,gnu-make,Makefile,Gnu Make,我想不出一种方法来为make的以下生产类型定义通用模式规则: 需要xyzy-en_US.ext2从xyzy.ext0通过xyzy.ext1 这项工作: all: xyzzy-en_US.ext2 # to be compiled from xyzzy.ext0 %.ext1 : %.ext0 # produce xyzzy.ext1 %-en_US.ext2 : %.ext1 # produce xyzzy-en_US.ext2 但是如何概括第二条规则的区域设置部分呢?或者我需要为

我想不出一种方法来为make的以下生产类型定义通用模式规则:

需要
xyzy-en_US.ext2
xyzy.ext0
通过
xyzy.ext1

这项工作:

all: xyzzy-en_US.ext2
# to be compiled from xyzzy.ext0

%.ext1 : %.ext0
  # produce xyzzy.ext1

%-en_US.ext2 : %.ext1
  # produce xyzzy-en_US.ext2
但是如何概括第二条规则的区域设置部分呢?或者我需要为所有不同的地区生成规则吗

这两项工作都不起作用:

%-??_??.ext2 : %.ext1
  # ...

%.ext2 : $(@,%-??_??.ext2,%.ext1)
  # ...

使用Make没有什么好办法(regex处理在我的愿望清单上很重要),但这里有一个难题

您可以为每个区域设置一个单独的规则,该规则适用于任何“东西”(xyzy或其他任何东西)。但由于您事先不知道将调用什么语言环境,但您确实知道存在什么ext0文件,因此最好为每个“东西”制定一个规则:

THINGS = $(basename $(wildcard *.ext0)) # xyzzy qrssr...

define TEMPLATE
$(1)-%.ext2: $(1).ext1
    @echo produce $$@ from $$^ using $$*
endef

$(foreach thing,$(THINGS),$(eval $(call TEMPLATE,$(thing))))