Make-файл: присвоение функциональной переменной в целевой командной строке

Мне нужно 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) $< > $@

и выше конечно, не корректно, потому что для команды отделяются, оболочка представлена. Таким образом, возможно, другой способ поместить этот вопрос - как принести переменную как вывод команды?

1
задан Pablo 6 May 2010 в 03:36
поделиться

2 ответа

Я не совсем понимаю, что именно вы здесь ищете, как вы планируете использовать 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, а не использование переменной в make.

1
ответ дан 3 September 2019 в 00:45
поделиться

Если только substitute должен использовать xpi_hash, сделайте xpi_hash переменной, специфичной для цели:

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

Если другим Perl-скриптам понадобится xpi_hash, и вы хотите экспортировать его, у вас возникнет проблема, потому что переменные, назначенные в под-оболочках правила, нельзя (легко) передать в Make. Но вы можете сохранить его в файле и включить его:

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

-include xpi_hash_file
1
ответ дан 3 September 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: