只有在决定执行更新目标的命令时才需要分配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被表示。所以提出这个问题的另一种方法是 - 如何将变量作为命令输出?
答案 0 :(得分:1)
我不确定你在这里找到什么,你打算如何使用xpi_hash
?如果您想在每次使用变量时获取当前哈希,请使用=
来分配变量而不是:=
,例如
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中定义一个变量,而不是在make中使用变量。
答案 1 :(得分: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