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) $< > $@

以上当然是不正确的,因为对于命令部分,shell 是代表的。所以也许提出这个问题的另一种方式是 - 如何将变量作为命令输出?

4

2 回答 2

1

我不确定你在这里寻找什么,你打算如何使用xpi_hash?如果您想在每次使用变量时获取当前哈希值,请使用=分配变量而不是:=,例如

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

xpi将在更新后打印哈希值。

对于 中的变量make,请参阅手册的第 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 中定义一个变量,而不是在 make 中使用该变量。

于 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,并且您想要导出它,那么您就会遇到问题,因为在规则的子 shell 中分配的变量不能(轻松)传递给 Make。但是您可以将其存储在一个文件中,并且include它:

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

-include xpi_hash_file
于 2010-05-06T04:26:24.047 回答