Makefile: назначение переменной функции в целевой командной строке - PullRequest
1 голос
/ 06 мая 2010

Мне нужно, чтобы переменная xpi_hash была назначена только тогда, когда было решено выполнить команду цели обновления. Затем я использую эту переменную в качестве среды, экспорта и т. Д.

Если я поставлю его вне правила, сначала он будет раскрыт перед вызовом $(xpi) target, поэтому не найдет этот файл.

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

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

Ответы [ 2 ]

1 голос
/ 06 мая 2010

Если только 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
1 голос
/ 06 мая 2010

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

...