Spec-Zone.ru › GNU Make

Функции для подстановки строк и анализа

Вот некоторые функции, которые работают со строками:

$(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

Spec-Zone.ru

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