Spec-Zone.ru › GNU Make

Несколько целей в правиле

Когда в явном правиле есть несколько целей, они могут быть обработаны одним из двух способов: как независимые цели или как групповые цели. Способ обработки определяется разделителем, который появляется после списка целей.

Правила с независимыми целями

Правила, использующие стандартный разделитель целей, :, определяют независимые цели. Это эквивалентно написанию того же правила один раз для каждой цели с дублированными предварительными условиями и рецептами. Как правило, рецепт использует автоматические переменные, такие как ‘$@’, чтобы указать, какая цель строится.

Правила с независимыми целями полезны в двух случаях:

  • Вам нужны только предварительные условия, но нет рецепта. Например:
    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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API