Несколько целей в правиле
Когда в явном правиле есть несколько целей, они могут быть обработаны одним из двух способов: как независимые цели или как групповые цели. Способ обработки определяется разделителем, который появляется после списка целей.
Правила с независимыми целями
Правила, использующие стандартный разделитель целей, :, определяют независимые цели. Это эквивалентно написанию того же правила один раз для каждой цели с дублированными предварительными условиями и рецептами. Как правило, рецепт использует автоматические переменные, такие как ‘$@’, чтобы указать, какая цель строится.
Правила с независимыми целями полезны в двух случаях:
- Вам нужны только предварительные условия, но нет рецепта. Например:
kbd.o command.o files.o: command.h
дает дополнительное предварительное условие для каждого из трех файлов объектных файлов. Это эквивалентно написанию:
kbd.o: command.h command.o: command.h files.o: command.h
- Для всех целей работают похожие рецепты. Автоматическая переменная ‘$@’ может быть использована для подстановки конкретной цели, которая должна быть перестроена в команды (см. Автоматические переменные). Например:
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Здесь мы предполагаем гипотетическую программу
generateсоздает два типа вывода, один при задании ‘-big’, а другой при задании ‘-little’. См. Функции для подстановки и анализа строк для объяснения функцииsubst.
Предположим, вы хотите изменить предварительные условия в соответствии с целью, так же как переменная ‘$@’ позволяет вам изменить рецепт. Вы не можете сделать это с несколькими целями в обычном правиле, но можете сделать это с статическим правилом шаблона. См. Статические правила шаблонов.
Правила с групповыми целями
Если вместо независимых целей у вас есть рецепт, который генерирует несколько файлов с помощью одного вызова, вы можете выразить эту связь, объявив своё правило для использования групповых целей. Правило групповой цели использует разделитель &: (здесь ‘&’ используется для обозначения «все»).
Когда make строит любую из групповых целей, он понимает, что все остальные цели в группе также обновляются в результате вызова рецепта. Кроме того, если только некоторые из групповых целей устарели или отсутствуют make поймет, что запуск рецепта обновит все цели. Наконец, если какая-либо из групповых целей устарела, все групповые цели считаются устаревшими.
В качестве примера, это правило определяет групповую цель:
foo bar biz &: baz boz
echo $^ > foo
echo $^ > bar
echo $^ > biz
Во время выполнения рецепта групповой цели, автоматическая переменная ‘$@’ устанавливается в имя конкретной цели в группе, которая вызвала правило. Следует проявлять осторожность при использовании этой переменной в рецепте правила групповой цели.
В отличие от независимых целей, правило групповой цели обязательно должно содержать рецепт. Однако цели, являющиеся членами групповой цели, также могут появляться в определениях правил независимых целей, которые не имеют рецептов.
Каждая цель может иметь только один связанный с ней рецепт. Если групповая цель появляется в правиле независимой цели или в другом правиле групповой цели с рецептом, вы получите предупреждение, и последний рецепт заменит предыдущий. Кроме того, цель будет удалена из предыдущей группы и появится только в новой группе.
Если вы хотите, чтобы цель появлялась в нескольких группах, то вы должны использовать двойной двоеточие разделитель групповых целей, &:: при объявлении всех групп, содержащих эту цель. Групповые цели с двойным двоеточием рассматриваются независимо, и рецепт каждого группового правила с двойным двоеточием выполняется не более одного раза, если по крайней мере одна из его множественных целей требует обновления.
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html