如果我有这样的清单:
nodes = A B C
我将如何生成具有动态先决条件的动态目标。例如(这不起作用,但可能有助于解释我想要什么)。
# node.csr is a file that already exists, like a template
# this would create outputs like node-A-csr.json, node-B-csr.json
# I am basically guessing at the syntax here
node-%-csr.json: node-csr.json
sed 's/$${node}/$*' node-csr.json > $@
# this would create outputs like node-A-key.pem node-A.pem and would require node-A-csr.json
node-%-key.pem node-%.pem: node-%-csr.json
# some command that generates node-NAME-key.pem and node-NAME-csr.pem
$(nodes): node-%-key.pem node-%.pem
Id基本上希望能够运行make all
并为我列表中的所有目标运行那些目标。
我对Makefiles还是很陌生,只是看不到这样的方法如何工作,Make的文档和语法使我感到非常困惑。
我愿意使用任何工具来执行此操作,但是Make似乎很标准。
答案 0 :(得分:1)
您可以使用Make的Substitution References生成“全部”目标。这足以开始处理所有规则。
注意较小的更改:“ node-csr.json”应具有令牌 NODE ,要在其中插入实际节点名称
# First rule is the default
default: all
nodes = A B C
# use node-csr as a template, replacing NODE with current ID: A, B, C
node-%-csr.json: node-csr.json
sed 's/__NODE__/$*/' node-csr.json > $@
# this would create node-A-key.pem node-A.pem from node-A-csr.json
# Put real commands here
node-%-key.pem node-%.pem: node-%-csr.json
ls -l node-$*-csr.json > node-$*-key.csr
ls -l node-$*-csr.json > node-$*.pem
# all will be node-A-key.pem, node-B-key.pem, ... node-C.pem
all: $(nodes:%=node-%-key.pem) $(nodes:%=node-%.pem)
echo "done"
# Using pathsubst: all: $(patsubst %,node-%-key.pem,$(nodes)) $(pathsubst
请注意制表符/空格,某些版本敏感。您将必须在所有命令(sed,ls,...)之前放回制表符
替代引用人:https://www.gnu.org/software/make/manual/html_node/Substitution-Refs.html
pathsubst函数:https://www.gnu.org/software/make/manual/html_node/Text-Functions.html