Недостатки использования шаблонов
Теперь рассмотрим пример наивного использования подстановки шаблонов, который не даёт ожидаемого результата. Предположим, вы хотите, чтобы исполняемый файл 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