Makefile文件。多维列表?

时间:2016-08-12 12:16:32

标签: makefile

我需要为以下情况编写模式规则:

  • 共有2个文件夹:AB
  • 运行命令python gen.py --a=A/file1.foo --b=file2.bar --c=file3.bar会生成B/file1.foo
  • file1file2file3是不同的字符串

有没有办法在某种多维数组中对这些文件名进行分组,以便所有文件只写一次(我将使用python语法):

files = [["a1.foo", "a2.bar", "a3.bar"],
         #...200 other groups...
         ["b1.foo", "b2.bar", "b3.bar"]]

然后规则如下:

$(files): B/{reference 1 elem}: A/{1 elem} {2 elem} {3 elem}
    python gen.py --a=A/{1 elem} --b={2 elem} --c={3 elem}

任何想法如何存档?

2 个答案:

答案 0 :(得分:2)

您可以使用标准的make语法:

all :

targets :=
define add_target
B/${1}: A/${1} ${2} ${3}
targets += B/${1}
endef

# Build dependencies.
$(eval $(call add_target,a1.foo,a2.bar,a3.bar)) 
# ...
$(eval $(call add_target,b1.foo,b2.bar,b3.bar))

# One generic rule for all ${targets}     
${targets} : % :
    @echo Making $@ from $^

all : ${targets}

.PHONY: all 

请注意,这些$(eval $(call add_target,...)对空格不敏感,请勿在其中插入空格。

如果您希望make自动创建输出目录,请执行以下操作:

${targets} : % : | B

B :
    mkdir $@

答案 1 :(得分:0)

有时重复一点也不是那么糟糕

targets := B/a1.foo B/b1.foo

.PHONY: all

all: $(targets)

$(targets): B/%: A/%
    python gen.py --a=$< --b=$(word 2,$^) --c=$(word 3,$^)

B/a1.foo: a2.bar a3.bar
B/b1.foo: b2.bar b3.bar