Целевое имя Double $ Dollar "$$ @" в GNU Make - PullRequest
0 голосов
/ 12 июня 2019

У меня есть правило из OP-TEE (использует большие make-файлы для включения и создания деревьев вызовов для компиляции двух ядер операционной системы и приложений) с некоторыми сразу развернутыми переменными - насколько я могу судить, здесь нет второго соответствующего расширения, поскольку двойной двойной доллар находится в правиле и, следовательно, не подлежит второму расширению.На втором этапе его всегда следует расширять:

$(link-out-dir$(sm))/$(user-ta-uuid).elf: $(objs) $(libdeps) \
                  $(link-script-pp$(sm))
    @$(cmd-echo-silent) '  LD      $$@'
    echo Target '$@', '$$@', "$@", "$$@"

В выводе видно, что все вхождения $@ и $$@ расширяются по марке, а не по sh, а по одному доллару.те не заполнены с правильным значением, и двойные не избежали себя:

echo Target '', 'out/someuuid.elf', "", "out/someuuid.elf"
Target , out/someuuid.elf, , out/someuuid.elf

То, что я ожидал, было:

echo Target 'out/someuuid.elf', '$@', "out/someuuid.elf", "$@"
Target out/someuuid.elf, $@, out/someuuid.elf,

Какой механизм изготовления мог быть причинойчтобы расширение работало здесь по-другому?

Эта цель вложена двумя слоями в другие make-файлы и четырьмя вызовами make, поэтому немного сложно выяснить, что buildhain настроил здесь по-другому.


Я не могу воспроизвести это поведение с минимальным make-файлом:

all: target1 target2 target3

.PHONY: target1 target2 target3 all
.SUFFIXES:

target1:
        echo Target1 '$@', '$$@', "$@", "$$@"

# should make no difference, since used in immediate context on rule specification
TARGET2 := target2
TARGET3 = target3

$(TARGET2):
        echo Target2 '$@', '$$@', "$@", "$$@"

$(TARGET3):
        echo Target3 '$@', '$$@', "$@", "$$@"

, получая ожидаемый результат с расширением $ @ до целевого имени и расширением $$ @ до строки или пустого списка позиционных параметров оболочки:

echo Target1 'target1', '$@', "target1", "$@"
Target1 target1, $@, target1,
echo Target2 'target2', '$@', "target2", "$@"
Target2 target2, $@, target2,
echo Target3 'target3', '$@', "target3", "$@"
Target3 target3, $@, target3,

Указание .SECONDEXPANSION не меняет результаты, как ожидалось.

1 Ответ

0 голосов
/ 12 июня 2019

Подсветка синтаксиса может быть непростой - я не знал, что вся цель является содержимым самой переменной - у некоторых целей выше было define gen-link-t, начинающееся с многострочной переменной, заканчивающееся некоторыми целями ниже.

Цель была фактически вызвана после генерации, используя $(eval $(call gen-link-t)) в конце файла, вместо того, чтобы быть прочитанной построчно - что вызвало первое расширение $$ в $ при расширении переменной внутри $(вызов), делая вызов вернуть $ в виде простого текста.Вторая оценка произошла, когда make снова читал эту цель через $ (eval)

...