Makefile 可以在源代码列表上进行迭代,并为每个项目提供字母键吗?

Makefile 可以在源代码列表上进行迭代,并为每个项目提供字母键吗?,makefile,gnu-make,Makefile,Gnu Make,假设我有这样一条规则: SOURCES = one.pdf two.pdf three.pdf out.pdf: $(SOURCES) pdftk $^ cat output $@ 只要我只想使用$^作为一个空格分隔的列表,这就非常有效,但现在我需要在每个值前面加上前缀。在pdftk的情况下,我需要用大写字母leter命名每个输入流,以便从每个输入流获取页面范围。如果我想要所有输入文件的第一页,我需要运行如下命令: pdftk A=one.pdf B=two.pdf C=three.

假设我有这样一条规则:

SOURCES = one.pdf two.pdf three.pdf

out.pdf: $(SOURCES)
    pdftk $^ cat output $@
只要我只想使用
$^
作为一个空格分隔的列表,这就非常有效,但现在我需要在每个值前面加上前缀。在pdftk的情况下,我需要用大写字母leter命名每个输入流,以便从每个输入流获取页面范围。如果我想要所有输入文件的第一页,我需要运行如下命令:

pdftk A=one.pdf B=two.pdf C=three.pdf cat A1 B1 C1 output out.pdf …
pdftk $(foreach SOURCE,$^,A=$(SOURCE))
我知道foreach函数可以迭代如下内容:

pdftk A=one.pdf B=two.pdf C=three.pdf cat A1 B1 C1 output out.pdf …
pdftk $(foreach SOURCE,$^,A=$(SOURCE))
…但是当然,
A=one.pdf A=two.pdf A=three.pdf
不会让我走得很远。如何迭代输入列表并将其与另一个数组中的键关联?注意,我还需要来自另一个数组的长度和键,以便在命令行的其余部分再次用作句柄

GNU是否能够优雅地处理这种情况,或者我应该编写一个小包装器脚本


⑨注意:为了解决这个问题,这个用例被简化了,实际的源列表是在运行时生成的,长度未知,因此,硬编码一个替代数组或将文件名更改为a.pdf B.pdf,以便将basename用作pdftk句柄是行不通的。

GNU make实现的语言不是通用语言,这使得这种字符串处理非常棘手。我建议使用一种更适合字符串处理的语言——比如说一点perl怎么样

SOURCES = one.pdf two.pdf three.pdf

out.pdf: $(SOURCES)
    @echo pdftk $$(perl -e '$$x=65; \
     foreach (@ARGV) { \
      $$a .= sprintf "%c=%s ", $$x, $$_; \
      $$b .= sprintf "%c1 ", $$x; ++$$x; \
     }; print "$$a cat $$b output $@\n"' $^)

$ make
pdftk A=one.pdf B=two.pdf C=three.pdf cat A1 B1 C1 output out.pdf
这是非常灵活和可扩展的