2010-05-06 82 views
1

我只需要在決定執行更新目標的命令時分配xpi_hash變量。然後我使用這個變量作爲環境,導出等。Makefile:在目標命令行中分配函數變量

如果我把它放在規則之外,它會被首先展開,在調用$(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) $< > [email protected] 

以上當然是不正確的,因爲對於命令部分來說shell是表示的。所以也許另一種解決這個問題的方法是 - 如何將變量作爲命令輸出?

回答

1

我不確定你在找什麼,你打算如何使用xpi_hash?如果您想在每次使用變量use =來指定變量而不是:=(例如,

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

將在更新後打印xpi的散列。

對於make中的變量,請參見手冊的section 6.2。簡單地說:'='會在右側展開變量,'='會讓它們稍後展開。

在我的評論(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="..."語法在bash的子shell定義一個變量,而不是在化妝使用的變量。

+0

@Scott:我出口'xpi_hash'在Perl命令後使用它。我嘗試了'=',它有所不同,但仍在$(xpi)目標之前調用,所以'sha1sum'永遠不能找到xpi文件......希望現在清楚。 – Pablo 2010-05-06 03:38:27

+0

嘗試將'substitute'定義更改爲'substitute = xpi_hash =「$(xpi_hash)」perl -p -e's/@([^ @] +)@/$$ ENV {$$ 1} bla bla ... '',它明確地將xpi_hash添加到perl命令的環境中。 – 2010-05-06 03:43:40

+0

可否請你給我一些關於'='的參考章節以及將變量導出到環境的替代機制? – Pablo 2010-05-06 04:22:29

1

如果只有substitute必須使用xpi_hash,使xpi_hash特定目標變量:

$(target_update_rdf): xpi_hash = $(shell ...) 
$(target_update_rdf): $(update_rdf) 
    $(substitute) $< > [email protected] 

如果其他的Perl腳本需要xpi_hash,你想出口嗎,你有問題,因爲變量分配在一個規則的子殼體中不能(容易地)傳達給Make。但是你可以將其存儲在一個文件中,並include它:

xpi_hash_file: $(xpi) 
    rm -f [email protected] 
    echo xpi_hash = $(shell...) > [email protected] 

-include xpi_hash_file