Значение $ (VAR): в make-файле - PullRequest
0 голосов
/ 20 апреля 2019

Я нашел в make-файле следующие команды:

$(var):  
          mkdir -p $(@D)

В чем смысл этой команды?

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Как уже объяснено @tripleee $(var) расширяется до переменной. Поскольку он указан здесь перед двоеточием, это означает, что он является целью в Makefile.

Для $(@D) см. 10.5.3 Автоматические переменные в руководстве по изготовлению:

Часть каталога с именем файла цели, с удаленной косой чертой. Если значение «$ @» равно dir / foo.o, тогда «$ (@ D)» - это dir. Это значение если ‘$ @’ не содержит косую черту.

ПРИМЕЧАНИЕ. Это НЕ сценарий оболочки. Это make-файл. Пожалуйста, используйте "man make" для описания того, что делает "make".

1 голос
/ 20 апреля 2019

$(VAR) расширяется до значения переменной VAR.Это переменная Make (не переменная оболочки и т. Д.).Например, если ранее в вашем Makefile вы определяете

VAR=ick/poo

, то VAR расширяется до ick/poo, а @D в вашем рецепте расширяется до части каталога, ick.

Поскольку вы, похоже, не понимаете отношения между shell и make, я, возможно, должен указать, что это два разных языка, хотя в Makefile вы встретите оба;рецепты - части с отступом от табуляции - будут переданы в оболочку для оценки (хотя обычно оболочкой будет /bin/sh, а не Bash, если вы специально не переопределите переменную Make SHELL для ее принудительного применения).

Кстати, в оболочке внешне похожая конструкция $(cmd) выполняет подстановку команд;команда cmd будет оценена, а ее вывод будет вставлен в виде текста.Так, например,

echo Running in $(pwd)

напечатает

Running in /home/you

, если выполняется в каталоге /home/you (команда pwd выводит ваш текущий рабочий каталог).... Хотя в Makefile знак доллара обычно оценивается и потребляется самой make;таким образом, чтобы передать буквенный знак доллара в оболочку, вы должны удвоить его.

test:
    echo Running in $$(pwd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...