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

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

21 голосов
/ 24 августа 2009

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

%. D:% .c

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

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

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

     rm -f $@.$$$$

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

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

Вот что я нашел, но не понял в том же документе

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

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

Спасибо и всего наилучшего!

Ответы [ 3 ]

21 голосов
/ 24 августа 2009

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

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

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

17 голосов
/ 06 марта 2012

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

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

DOLLAR:=$$
dollar:
    echo '$$'  >  $@
    echo "\$$" >> $@
    echo '$(DOLLAR)'  >> $@
    echo "\$(DOLLAR)" >> $@
    cat dollar
2 голосов
/ 24 августа 2009

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

...