Динамический Makefile цели с динамическими предпосылками - PullRequest
0 голосов
/ 03 октября 2019

Если у меня есть список таких вещей, как этот:

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

Мне бы хотелось иметь возможность запускать make all и запускать эти цели для всего в моем списке.

Я очень новичок в Makefiles, и я просто не понимаю, как что-то подобное сработает, а документация и синтаксис Make меня очень смущает.

Я готов использовать любой инструмент для этогоно похоже, что Make очень стандартен.

1 Ответ

1 голос
/ 03 октября 2019

Вы можете использовать Make's Substitution References для создания цели 'all'. Этого будет достаточно, чтобы начать обработку всех правил.

Обратите внимание на незначительные изменения: в файле '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, ...)

Замещающие ссылки man: https://www.gnu.org/software/make/manual/html_node/Substitution-Refs.html

pathsubst function: https://www.gnu.org/software/make/manual/html_node/Text-Functions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...