приоритет makefile для похожих имен файлов - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть make-файл, подобный следующему:

dist/myapp_darwin.tar.gz: release

myapp_%: $(SRC)
  recipe1

release:
  recipe2

sometarget: dist/myapp_darwin.tar.gz
  recipe3

Я использую make sometarget, для чего требуется dist/myapp_darwin.tar.gz. Я ожидаю, что это требование будет выполнено с использованием recipe2 (цель выпуска) благодаря конкретной цели в первой строке, но оно строится с использованием recipe1. что я делаю неправильно, и как я могу это исправить?

(просто для контекста цель myapp_% предназначена для создания двоичного файла в корневом каталоге с именем myapp_darwin, а dist/myapp_darwin.tar.gz -построить другой артефакт, архив для раздачи.)

1 Ответ

1 голос
/ 09 ноября 2019

Проблема в том, что make всегда хочет рецепт для каждой цели. Если вы пишете это без рецепта, связанного с ним:

dist/myapp_darwin.tar.gz: release

, который не определяет правило для цели dist/myapp_darwin.tar.gz, все, что он делает, это добавляет новое условие release к этой цели. Make все равно придется искать в своей базе данных правил, чтобы найти правило для построения этой цели, и оно будет соответствовать шаблонному правилу.

Итак, он будет запускать обоих recipe2 затем recipe1.

Если вы хотите объявить явное правило для цели, вы должны дать ему рецепт, даже если это неоперация:

dist/myapp_darwin.tar.gz: release
         @:

Теперь make имеетрецепт для этой цели, и ему не нужно будет искать его с помощью поиска неявных правил.

...