コマンドラインからMakefileに引数を渡す方法は?
私はできることを理解しています
$ make action VAR="value"
$ value
Makefile
VAR = "default"
action:
@echo $(VAR)
次の動作を取得するにはどうすればよいですか?
$ make action value
value
?
どう?
$make action value1 value2
value1 value2
おそらくこれを行うべきではありません。 Makeの動作の基本パターンを破っています。しかし、ここにあります:
action:
@echo action $(filter-out $@,$(MAKECMDGOALS))
%: # thanks to chakrit
@: # thanks to William Pursell
編集:
最初のコマンドを説明するには、
$(MAKECMDGOALS)
は、コマンドラインで綴られた「ターゲット」のリストです。 「アクションvalue1 value2」。
$@
は、ルールのターゲット名(この場合は「アクション」)の 自動変数 です。
filter-out
は、リストからいくつかの要素を削除する関数です。 $(filter-out bar, foo bar baz)
はfoo baz
を返します(より微妙な場合もありますが、ここでは微妙なことは必要ありません)。
これらをまとめると、$(filter-out $@,$(MAKECMDGOALS))
は、「アクション」以外のコマンドラインで指定されたターゲットのリストを返します。
@Betaに基づいた一般的な作業ソリューションを次に示します。
Makefileの上でGNU Make 4.1 with Shell=/bin/bash
を使用しているので、YMMV!
これにより、エラーをスローするのではなく、一致しないジョブを取得したときに何もしないことで、追加の引数を受け入れることができます。
%:
@:
そして、これは引数を取得するマクロです:
args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}`
これはこれを呼ぶかもしれない仕事です:
test:
@echo $(call args,defaultstring)
結果は次のようになります。
$ make test
defaultstring
$ make test hi
hi
注意! 「Taskfile」を使用したほうがよい場合があります。これは、Maketoolsの微妙な違いを除いて、makeと同様に機能するbashパターンです。 https://github.com/adriancooney/Taskfile を参照してください
はるかに簡単なアプローチ。タスクを検討してください:
provision:
ansible-playbook -vvvv \
-i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory \
--private-key=.vagrant/machines/default/virtualbox/private_key \
--start-at-task="$(AT)" \
-u vagrant playbook.yml
今、私はそれを呼び出したいとき、私は次のようなものを実行するだけです:
AT="build assets" make provision
あるいは単に:
make provision
この場合AT
は空の文字列です