web-dev-qa-db-ja.com

コマンドラインからMakefileに引数を渡す方法は?

コマンドラインからMakefileに引数を渡す方法は?

私はできることを理解しています

$ make action VAR="value"
$ value

Makefile

VAR = "default"
action:
    @echo $(VAR)

次の動作を取得するにはどうすればよいですか?

$ make action value
value

どう?

$make action value1 value2
value1 value2
93
Meng Lu

おそらくこれを行うべきではありません。 Makeの動作の基本パターンを破っています。しかし、ここにあります:

action:
        @echo action $(filter-out [email protected],$(MAKECMDGOALS))

%:      # thanks to chakrit
    @:    # thanks to William Pursell

編集:
最初のコマンドを説明するには、

$(MAKECMDGOALS)は、コマンドラインで綴られた「ターゲット」のリストです。 「アクションvalue1 value2」。

[email protected]は、ルールのターゲット名(この場合は「アクション」)の 自動変数 です。

filter-outは、リストからいくつかの要素を削除する関数です。 $(filter-out bar, foo bar baz)foo bazを返します(より微妙な場合もありますが、ここでは微妙なことは必要ありません)。

これらをまとめると、$(filter-out [email protected],$(MAKECMDGOALS))は、「アクション」以外のコマンドラインで指定されたターゲットのリストを返します。

181
Beta

@Betaに基づいた一般的な作業ソリューションを次に示します。

Makefileの上でGNU Make 4.1 with Shell=/bin/bashを使用しているので、YMMV!

これにより、エラーをスローするのではなく、一致しないジョブを取得したときに何もしないことで、追加の引数を受け入れることができます。

%:
    @:

そして、これは引数を取得するマクロです:

args = `arg="$(filter-out [email protected],$(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 を参照してください

10
M3D

はるかに簡単なアプローチ。タスクを検討してください:

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は空の文字列です

9
kharandziuk