Почему поведение ведет себя странно при написании нескольких целей с использованием символа%?

Согласно GNU Make Manual

Правило с несколькими целями эквивалентно написанию многих правил, каждый из которых имеет одну цель и все идентичные в стороне от этого. Тот же рецепт применяется ко всем целям, но его эффект может быть различным, потому что вы можете заменить фактическое имя цели на рецепт, используя «$ @». Правило вносит одни и те же предпосылки для всех целей.

Это мой первый Makefile:

%.in %.out: echo BLANK > $@ 

И это моя первая сессия bash:

 $ ls Makefile $ make a.in a.out echo BLANK > a.in make: Nothing to be done for 'a.out'. $ ls Makefile a.in $ make a.out echo BLANK > a.out $ ls Makefile a.in a.out $ make b.in c.out echo BLANK > b.in echo BLANK > c.out $ make d.in d.out echo BLANK > d.in make: Nothing to be done for 'd.out'. $ make e.out e.in echo BLANK > e.out make: Nothing to be done for 'e.in'. $ ls Makefile a.in a.out b.in c.out d.in e.out 

Это мой второй Makefile:

 %.in: echo BLANK > $@ %.out: echo BLANK > $@ 

И это соответствующая сессия bash:

 $ ls Makefile $ make a.in a.out echo BLANK > a.in echo BLANK > a.out $ ls Makefile a.in a.out $ # nice 

Почему первый Makefile не создает цели, такие как <name>.in <same name>.out одновременно? Почему он не интерпретируется как второй Makefile?

One Solution collect form web for “Почему поведение ведет себя странно при написании нескольких целей с использованием символа%?”

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

 $ cat Makefile %.in %.out : echo BLANK > $@ $ make -d a.in a.out [... irrelevant output skipped ...] Updating goal targets.... Considering target file 'a.in'. File 'a.in' does not exist. Looking for an implicit rule for 'a.in'. Trying pattern rule with stem 'a'. Found an implicit rule for 'a.in'. Finished prerequisites of target file 'a.in'. Must remake target 'a.in'. echo BLANK > a.in Successfully remade target file 'a.in'. Considering target file 'a.out'. File 'a.out' was considered already. make: Nothing to be done for 'a.out'. 

Обратите внимание на строки:

 Considering target file 'a.out'. File 'a.out' was considered already. 

Неявные цели не «существуют» до тех пор, пока они не будут судимы, и, таким образом, правило не будет «разделено» на несколько правил. Когда a.in и успешно сопоставляется, все остальные цели помечены как проверенные. Подавляющее большинство времени это не то, что вы хотите. Просто напишите два правила.

  • / bin / sh: ./check-dependencies.pl: не найден - но check-dependencies.pl существует!
  • PHP 7.1.2 не может Gmake: Zend Error
  • Что означает символ% в Makefile
  • Latexmk, из Makefile, из скрипта bash, из Cron - Latexmk не выполняется
  • Сделать цель двумя словами
  • Как скомпилировать dcp2icc?
  • Как отображать зависимости, заданные в make-файле как дерево?
  • Ограничение GNU-Make на POSIX Сделать поведение
  • Процент символа в $ (оболочке) в зависимости от GNU Makefile
  • Как этот Makefile делает программу C даже без указания компилятора?
  • Создание каталогов соответствия шаблонов
  • Linux и Unix - лучшая ОС в мире.