Четыре знака доллара в Makefile

Я читаю документ GNU Make. Вот пример

%.d: %.c

    @set -e; rm -f $@; \

     $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

     sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \

     rm -f $@.$$$$

Я пробовал это в программе на С++ и получил список файлов

init3d.d init3d.d.18449 input.d input.d.18444 main.d main.d.18439

Вот что я нашел, но не понимаю в том же документе< /а>

Если вы включили вторичное расширение и хотите, чтобы в списке предварительных требований был буквальный знак доллара, вы должны написать четыре знака доллара («$$$$»).

Интересно, что на самом деле означают четыре знака доллара $$$$? Как они 18449, 18444 или 18439?

Спасибо и привет!


person Tim    schedule 24.08.2009    source источник


Ответы (3)


Если включено «вторичное расширение», $$$$ требуется для создания одного $ в фактическом выводе. $ обычно используется для расширения переменных, вызова функций make и т. д. $$ с включенным вторичным расширением делает что-то еще, но в противном случае он генерирует фактическое $ на выходе.

Оболочка, которая использует make для выполнения командных строк в Unix-подобных системах, обычно интерпретирует $$ как расширение до идентификатора процесса оболочки. Таким образом, без включения вторичного расширения $$$$ на выходе превратится в $$, которое оболочка расширит до идентификатора процесса.

(Использование идентификатора процесса оболочки в качестве суффикса — это простой способ гарантировать уникальность имени файла для временного файла.)

person Barry Kelly    schedule 24.08.2009
comment
Вторичное расширение не влияет на содержание рецепта. Просто обязательный список. Таким образом, $$$$ всегда будет производить $$ в контексте рецепта. Вам нужно только $$$$ в списке обязательных условий, чтобы получить один $ при включенном дополнительном расширении (если он не использует $$, вы получите это). - person Etan Reisner; 23.11.2015
comment
Это не ответ. Вторичное расширение не имеет значения. - person reinierpost; 22.12.2016
comment
@reinierpost кажется, у вас те же трудности с пониманием, что и у Этана Рейснера :) В оригинальном постере говорилось о вторичном расширении, поэтому я и написал об этом. Фактическое объяснение находится во втором абзаце, а наиболее вероятная причина использования этой конструкции — в третьем абзаце в скобках. - person Barry Kelly; 22.12.2016
comment
Хорошо... Я думаю, что порядок, в котором вы это объясняете, сбивает с толку. - person reinierpost; 22.12.2016

$$ будет преобразовано в $, но в правилах Makefile (которые являются выражениями оболочки) вам также придется экранировать полученное $, используя \ или заключая выражение в одинарные кавычки '.

Вот пример, демонстрирующий это:

DOLLAR:=$$
dollar:
    echo '$$'  >  $@
    echo "\$$" >> $@
    echo '$(DOLLAR)'  >> $@
    echo "\$(DOLLAR)" >> $@
    cat dollar
person Sébastien Pierre    schedule 06.03.2012
comment
Гоша, я люблю тебя. Я искал снова и снова, почему $$ превращается для меня в ничто. - person Profpatsch; 30.10.2014

18449, 18444 или 18439 выглядят как идентификаторы процессов, так что, возможно, это идентификатор процесса?

person stefanB    schedule 24.08.2009