Makefile:在目标命令行中分配函数变量

时间:2010-05-06 03:02:45

标签: makefile command target

只有在决定执行更新目标的命令时才需要分配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被表示。所以提出这个问题的另一种方法是 - 如何将变量作为命令输出?

2 个答案:

答案 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