Как реализовать неявное правило, которое зависит от файла с аналогичным именем в GNU Make? - PullRequest
0 голосов
/ 05 сентября 2018

Если я хочу создать foo.txt, когда пользователь запускает make foo, это достаточно просто:

foo: foo.txt

foo.txt:
    touch foo.txt

Но что, если я заранее не знаю имя foo и хочу поддержать создание любого другого текстового файла с произвольным именем?

Вот что я попробовал:

%: %.txt

%.txt:
    touch %.txt

Но если я попытаюсь make clojure вместо запуска touch clojure.txt, произойдет сбой с No rule to make target clojure.

Как это сделать?

1 Ответ

0 голосов
/ 05 сентября 2018

Здесь много чего не так. Во-первых, ваш рецепт неправильный; % в рецепте не является особенным для изготовления и не будет заменено. Ваша команда touch %.txt создает файл с буквальным именем %.txt независимо от того, какой шаблон соответствует. Вы хотите использовать touch $@ здесь; см. обсуждение автоматических переменных .

Во-вторых, ваше правило:

%: %.txt

не делает то, что вы думаете, что делает. В отличие от явных правил, создание неявного или шаблонного правила без рецепта не просто создает обязательное отношение для цели, которая соответствует шаблону: вместо этого удаляет существующее правило шаблона .

Поскольку у вас нет ранее существовавшего шаблонного правила, ваш make-файл идентичен простому написанию:

%.txt:
        touch %.txt

и нет способа создать цель clojure с этим make-файлом.

Одним из решений является создание фиктивного рецепта, подобного следующему:

% : %.txt
        @:

%.txt:
        touch $@

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

$(MAKECMDGOALS): % : %.txt

%.txt:
         touch $@

Переменная MAKECMDGOALS содержит любые цели, которые вы указали в командной строке.

...