Мне нужно 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) $< > $@
и выше конечно, не корректно, потому что для команды отделяются, оболочка представлена. Таким образом, возможно, другой способ поместить этот вопрос - как принести переменную как вывод команды?
Я не совсем понимаю, что именно вы здесь ищете, как вы планируете использовать 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.
Если только 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