Spec-Zone.ru › GNU Make

Недостатки использования шаблонов

Теперь рассмотрим пример наивного использования подстановки шаблонов, который не даёт ожидаемого результата. Предположим, вы хотите, чтобы исполняемый файл foo был составлен из всех объектных файлов в каталоге, и вы пишете следующее:

objects = *.o

foo : $(objects)
        cc -o foo $(CFLAGS) $(objects)

Значение objects — это фактическая строка ‘*.o’. Подстановка шаблонов происходит в правиле для foo, так что каждый существующий файл ‘.o’ становится предшественником для foo и будет перекомпилирован при необходимости.

Но что если вы удалите все файлы ‘.o’? Когда шаблон не соответствует ни одному файлу, он остаётся неизменным, поэтому foo будет зависеть от файла с необычным именем *.o. Поскольку такого файла, скорее всего, не существует, make выдаст ошибку, говоря, что не может определить, как создать *.o. Этого вы не хотите!

На самом деле, желаемый результат можно получить с помощью подстановки шаблонов, но вам понадобятся более сложные техники, включая функцию wildcard и подстановку строк. Смотрите Функцию wildcard.

Операционные системы Microsoft (MS-DOS и MS-Windows) используют обратную косую черту для разделения каталогов в именах путей, например:

  c:\foo\bar\baz.c

Это эквивалентно пути в стиле Unix c:/foo/bar/baz.c (часть c: — это так называемая буква диска). Когда make выполняется на этих системах, она поддерживает обратные косые черты, а также прямые косые черты в именах путей. Однако эта поддержка не включает подстановку шаблонов, где обратная косая черта является символом кавычки. Поэтому в этих случаях вы обязательно должны использовать прямые косые черты в стиле Unix.

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/Wildcard-Pitfall.html

Spec-Zone.ru

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