Как получить все правила в make-файле, чтобы запомнить имя цели верхнего уровня (подстановочный знак) - PullRequest
0 голосов
/ 27 ноября 2018

Когда я везде ищу простую вещь и не могу ее найти, у меня возникает вопрос, делаю ли я что-то совершенно неправильно.Я использовал фреймворки, в которых вы набираете make targetname, где make-файл не знает targetname, поэтому он должен выбрать targetname в качестве переменной make-файла и выяснить ее зависимости оттуда.Я пытаюсь это сделать, но я не могу понять, как, и, видимо, никто не делает этого, потому что я не могу найти никого, кто бы говорил о том, как это сделать.Они говорят обо всем остальном под солнцем, но не о том, как заставить make hooplah выполнить, используя hooplah.html в качестве цели верхнего уровня.

Множество поисков и догадок дало мне понять, насколько неудачныMakefile ниже, и я так расстроен, что здесь я рискую жизнью и здоровьем, задавая вопрос о SO.В случае, если это спасет меня от вреда, я упомяну, что я прочитал этот ТАК ответ и это , это и это , а также копать число из страниц в документации по make-файлу GNU, все безрезультатно.

Я хочувведите make page-72 в командной строке и заставьте make воспринимать page-72.html как его зависимость верхнего уровня в make-файле, а не только в правиле верхнего уровня.Другие правила должны знать о page-72.html, но я не могу понять, как дать им информацию.

Я читал о MAKECMDGOALS, но похоже, что это полезно только для проверкиконкретные целевые имена;Я ищу что-то, что позволит любое имя цели и рассматривать его как выходное имя файла.Ниже то, что у меня есть.Он показывает мне page-72 из-за цели %, и зависимость $@.html работает, но ни одна переменная, которую я нашел, не позволяет правилу $@.html знать имя цели, которое было указано в командной строке.

%: $@.html
    @echo "Top: dollar-at = $@"

$@.html:
    @echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

Я получаю следующий вывод:

html: .html, , , , , , , 
Top: dollar-at = makefile
Top: dollar-at = index

Я неправильно понимаю это?Разве это не так?Бонусные баллы, если кто-нибудь может помочь мне избавиться от Top: dollar-at = makefile.Приветствия

1 Ответ

0 голосов
/ 27 ноября 2018

Да, вы все неправильно поняли:).

Ни в одном из найденных вами мест никто не пытался использовать автоматическую переменную, такую ​​как $@, в списке предварительных условий, как вы делали выше.и на самом деле это не может работать. Автоматические переменные устанавливаются только в рецепте правила, но не в списке предварительных условий.

В результате после того, как make расширяет ваши цели и предпосылки, переменная $@ там не устанавливается ион расширяется до пустой строки.Итак, ваши правила выглядят так:

%: .html
        @echo "Top: dollar-at = $@"

.html:
        @echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

Может быть, это поможет объяснить, почему вы получаете вывод, который видите.

В шаблонном правиле ствол (часть, которая соответствует шаблону %), должна быть одинаковой в целевом и предварительном условии.

Вы хотите написать свое правило следующим образом:

%: %.html
        @echo "Top: dollar-at = $@"

%.html:
        @echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

Однако я действительно непонять, что вы пытаетесь сделать.Я не знаю, что вы имеете в виду под «зависимостью верхнего уровня во всем make-файле».И я не вижу из приведенного вами примера, как вы ожидаете make для создания файла x.html.

Чтобы написать make-файл, вам нужно создать для себя ряд шагов, которые говорят: Я хочу построить эту цель.Чтобы построить его, он будет использовать эти предпосылки.И с учетом этих предварительных условий он будет использовать этот набор команд.Затем вы повторяете это рекурсивно для любого из предварительных условий, которые необходимо построить.Вам не нужно писать правила для исходных файлов (вещи, которые не нужно создавать).Они уже существуют.

Когда у вас есть этот набор шагов, довольно просто превратить их в правила makefile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...