具有动态先决条件的动态Makefile目标

时间:2019-10-03 14:30:45

标签: makefile

如果我有这样的清单:

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似乎很标准。

1 个答案:

答案 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