1

xpi_hash更新ターゲットのコマンドの実行が決定された場合にのみ、変数を割り当てる必要があります。次に、この変数を環境、エクスポートなどとして使用しています..

ルールの外に置くと、$(xpi)ターゲットが呼び出される前に最初に展開されるため、そのファイルが見つかりません。

substitute := perl -p -e 's/@([^@]+)@/$$ENV{$$1} bla bla...

export xpi_hash

.PHONY: dirs substitute update

update: $(xpi) $(target_update_rdf) 
    xpi_hash   := $(shell sha1sum $(xpi) | grep -Eow '^[^ ]+')
    @echo "Updating..."

$(target_update_rdf): $(update_rdf)
    $(substitute) $< > $@

コマンド部分ではシェルが表されているため、上記はもちろん正しくありません。したがって、この質問の別の言い方は、変数をコマンド出力として表示する方法です。

4

2 に答える 2

1

ここで何を探しているのか正確にはわかりません。どのように使用する予定xpi_hashですか? 変数を使用するたびに現在のハッシュを取得したい場合は、=の代わりに変数を割り当てます。:=

xpi_hash=$(shell sha1sum $(xpi) | grep -Eow '^[^ ]+')
update:$(xpi) $(target_update_rdf)
    @echo $(xpi_hash)

xpi更新後のハッシュを出力します。

の変数については、マニュアルのセクション 6.2makeを参照してください。簡単に言えば、':=' は右側の変数を展開し、'=' はそれらを後で展開するために残します。

私のコメント ( substitute = xpi_hash="$(xpi_hash)" perl -p -e 's/@([^@]+)@/$$ENV{$$1}...') の変更されたコマンドは、次のように展開されます。

$(substitute)
xpi_hash="$(xpi_hash)" perl -p -e 's/@([^@]+)@/$$ENV{$$1}...'
xpi_hash="`sha1sum $(xpi) | grep -Eow '^[^ ]+'`" perl -p -e 's/@([^@]+)@/$$ENV{$$1}...'
xpi_hash="`sha1sum xpi_expansion | grep -Eow '^[^ ]+'`" perl -p -e 's/@([^@]+)@/$$ENV{$$1}...'

このxpi_hash="..."構文は、make で変数を使用するのではなく、bash サブシェルで変数を定義しています。

于 2010-05-06T03:19:03.070 に答える
1

のみsubstituteを使用する必要がある場合xpi_hashは、xpi_hash をターゲット固有の変数にします。

$(target_update_rdf): xpi_hash = $(shell ...)
$(target_update_rdf): $(update_rdf)
    $(substitute) $< > $@

他の Perl スクリプトが を必要xpi_hashとし、それをエクスポートしたい場合、ルールのサブシェルで割り当てられた変数を (簡単に) Make に伝えることができないため、問題が発生します。ただし、それをファイルに保存すると、次のようになりますinclude

xpi_hash_file: $(xpi)
    rm -f $@
    echo xpi_hash = $(shell...) > $@

-include xpi_hash_file
于 2010-05-06T04:26:24.047 に答える