GNU создает правило для нескольких целей - PullRequest
4 голосов
/ 20 мая 2010

Я пытаюсь заставить GNU make выдавать несколько выходов с одного входа. Самый простой пример, который я могу продемонстрировать:

a b : test
    cp $< $@

, который, я считаю, должен скопировать файл test в файлы с именами a и b. Тем не менее, он только делает файл a, что мне кажется противоречащим инструкциям, перечисленным здесь:

http://www.gnu.org/software/automake/manual/make/Multiple-Targets.html

Я что-то не так делаю?

Спасибо, Том

Ответы [ 3 ]

9 голосов
/ 20 мая 2010

Если вы запускаете правило, которое зависит от a, оно будет запускать ваше правило с $< как test и $@ как a. Если вы запускаете правило, которое зависит от b, $@ будет вместо b. Если вы создаете правило выше текущего, например:

all: a b

Он будет запускать правила для a и b, что является тем же правилом дважды. В противном случае, если ваше правило является первым в файле, оно будет запускаться только с первой целью, то есть a

0 голосов
/ 26 марта 2017

Все в порядке. В руководстве написано:

bigoutput littleoutput : text.g
        generate text.g -$(subst output,,$@) > $@

эквивалентно

bigoutput : text.g
        generate text.g -big > bigoutput
littleoutput : text.g
  generate text.g -little > littleoutput

Таким образом, ваш Makefile также эквивалентен

a : test
    cp $< $@
b : test
    cp $< $@

и когда вы ввели команду make, по умолчанию программа создала первую цель, то есть 'a'.

0 голосов
/ 05 апреля 2013

Небольшое уточнение к ответу @ MichaelMrozek.

Это:

a b : test
    cp $< $@

Точно так же, как:

a : test
    cp $< $@
b : test
    cp $< $@

a - первая цель в файле, поэтому это цель по умолчанию. Выполняется только правило для a , поскольку нет зависимости от b .

Как сказал @MichaelMrozek, вы можете добавить другое правило или запустить

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