Функции для подстановки строк и анализа
Вот некоторые функции, которые работают со строками:
$(subst from,to,text)-
Выполняет текстовую замену в строке text: каждое вхождение from заменяется на to. Результат подставляется вместо вызова функции. Например,
$(subst ee,EE,feet on the street)
производит значение ‘fEEt on the strEEt’.
$(patsubst pattern,replacement,text)-
Находит разделенные пробелами слова в text, которые соответствуют pattern, и заменяет их на replacement. Здесь pattern может содержать символ ‘%’, который действует как символ подстановки, сопоставляя любое количество любых символов внутри слова. Если replacement также содержит ‘%’, то ‘%’ заменяется текстом, который соответствовал ‘%’ в pattern. Слова, которые не соответствуют шаблону, сохраняются в выводе без изменений. Только первый символ ‘%’ в pattern и replacement обрабатывается таким образом; все последующие ‘%’ остаются без изменений.
Символы ‘%’ в вызовах функции
patsubstможно экранировать с помощью предшествующих обратных слэшей (‘\’). Обратные слэши, которые в противном случае экранировали бы символы ‘%’, могут быть экранированы с помощью дополнительных обратных слэшей. Обратные слэши, экранирующие символы ‘%’ или другие обратные слэши, удаляются из шаблона перед сравнением с именами файлов или заменой основы. Обратные слэши, которые не представляют опасности для экранирования символов ‘%’, остаются без изменений. Например, шаблон the\%weird\\%pattern\\ содержит ‘the%weird\’ перед управляющим символом ‘%’ и ‘pattern\\’ после него. Последние два обратных слэша оставлены без изменений, потому что они не могут повлиять на какой-либо символ ‘%’.Пробелы между словами сворачиваются в одиночные пробелы; начальные и конечные пробелы отбрасываются.
Например,
$(patsubst %.c,%.o,x.c.c bar.c)
производит значение ‘x.c.o bar.o’.
Ссылки на подстановку (см. Ссылки на подстановку) — более простой способ получить эффект функции
patsubst:$(var:pattern=replacement)
эквивалентно
$(patsubst pattern,replacement,$(var))
Второй сокращенный вариант упрощает одно из наиболее распространённых применений функции
patsubst: замену суффикса в конце имён файлов.$(var:suffix=replacement)
эквивалентно
$(patsubst %suffix,%replacement,$(var))
Например, у вас может быть список объектных файлов:
objects = foo.o bar.o baz.o
Чтобы получить список соответствующих исходных файлов, вы можете просто написать:
$(objects:.o=.c)
вместо использования общей формы:
$(patsubst %.o,%.c,$(objects))
$(strip string)-
Удаляет начальные и конечные пробелы из string и заменяет каждую последовательность одного или нескольких пробельных символов одиночным пробелом. Таким образом, ‘$(strip a b c )’ даёт результат ‘a b c’.
Функция
stripможет быть очень полезна в сочетании с условными операторами. При сравнении чего-либо с пустой строкой ‘’ с помощьюifeqилиifneq, вы обычно хотите, чтобы строка только из пробелов соответствовала пустой строке (см. Условные операторы).Таким образом, следующее может не дать желаемых результатов:
.PHONY: all ifneq "$(needs_made)" "" all: $(needs_made) else all:;@echo 'Nothing to make!' endif
Замена ссылки на переменную ‘$(needs_made)’ вызовом функции ‘$(strip $(needs_made))’ в директиве
ifneqсделало бы её более надёжной. $(findstring find,in)-
Ищет в in вхождение find. Если оно есть, значение равно find; в противном случае значение пустое. Вы можете использовать эту функцию в условном операторе для проверки наличия определённой подстроки в данной строке. Таким образом, два примера,
$(findstring a,a b c) $(findstring a,b c)
дают значения ‘a’ и ‘’ (пустая строка) соответственно. См. Флаги проверки для практического применения функции
findstring. $(filter pattern…,text)-
Возвращает все разделенные пробелами слова в text, которые соответствуют хотя бы одному из слов pattern, удаляя слова, которые не соответствуют. Шаблоны записываются с использованием ‘%’, как и шаблоны, используемые в функции
patsubstвыше.Функция
filterможет использоваться для разделения различных типов строк (например, имён файлов) в переменной. Например:sources := foo.c bar.c baz.s ugh.h foo: $(sources) cc $(filter %.c %.s,$(sources)) -o fooуказывает, что foo зависит от foo.c, bar.c, baz.s и ugh.h, но только foo.c, bar.c и baz.s должны быть указаны в команде компилятору.
$(filter-out pattern…,text)-
Возвращает все разделенные пробелами слова в text, которые не соответствуют ни одному из слов pattern, удаляя слова, которые соответствуют одному или нескольким. Это полная противоположность функции
filter.Например, при условии:
objects=main1.o foo.o main2.o bar.o mains=main1.o main2.o
следующее генерирует список, который содержит все объектные файлы, не входящие в ‘mains’:
$(filter-out $(mains),$(objects))
$(sort list)-
Сортирует слова в list в лексикографическом порядке, удаляя дубликаты. Вывод — список слов, разделенных одиночными пробелами. Таким образом,
$(sort foo bar lose)
возвращает значение ‘bar foo lose’.
Кстати, так как
sortудаляет дубликаты слов, вы можете использовать его для этой цели, даже если вам не важен порядок сортировки. $(word n,text)-
Возвращает n-е слово из text. Допустимые значения n начинаются с 1. Если n больше числа слов в text, значение пустое. Например,
$(word 2, foo bar baz)
возвращает ‘bar’.
$(wordlist s,e,text)-
Возвращает список слов из text, начиная со слова s и заканчивая словом e (включительно). Допустимые значения s начинаются с 1; e может начинаться с 0. Если s больше числа слов в text, значение пустое. Если e больше числа слов в text, возвращаются слова до конца text. Если s больше e, ничего не возвращается. Например,
$(wordlist 2, 3, foo bar baz)
возвращает ‘bar baz’.
$(words text)-
Возвращает количество слов в text. Таким образом, последнее слово в text —
$(word $(words text),text). $(firstword names…)-
Аргумент names рассматривается как ряд имён, разделенных пробелами. Значение — первое имя в этом ряду. Остальные имена игнорируются.
Например,
$(firstword foo bar)
дает результат ‘foo’. Хотя
$(firstword text)то же самое, что и$(word 1,text), функцияfirstwordсохранена из-за своей простоты. $(lastword names…)-
Аргумент names рассматривается как ряд имён, разделенных пробелами. Значение — последнее имя в этом ряду.
Например,
$(lastword foo bar)
дает результат ‘bar’. Хотя
$(lastword text)то же самое, что и$(word $(words text),text), функцияlastwordбыла добавлена для простоты и лучшей производительности.
Вот реальный пример использования subst и patsubst. Предположим, что makefile использует переменную VPATH для указания списка каталогов, в которых make должен искать файлы-предшественники (см. VPATH Путь поиска всех предшественников). Этот пример показывает, как указать компилятору C искать заголовочные файлы в том же списке каталогов.
Значение VPATH — это список каталогов, разделенных двоеточиями, например, ‘src:../headers’. Сначала используется функция subst для преобразования двоеточий в пробелы:
$(subst :, ,$(VPATH))
Это даёт ‘src ../headers’. Затем patsubst используется для преобразования каждого имени каталога в флаг ‘-I’. Эти флаги можно добавить к значению переменной CFLAGS, которая автоматически передаётся компилятору C, например так:
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
Это приводит к добавлению текста ‘-Isrc -I../headers’ к ранее заданному значению CFLAGS. Директива override используется для того, чтобы новое значение было присвоено, даже если предыдущее значение CFLAGS было указано с аргументом команды (см. Директива override).
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/Text-Functions.html