Эффективное использование GNU Make

Функции манипуляции с текстом


Утилита GNU Make содержит большое число полезных функций, манипулирующих текстовыми строками и именами файлов. В частности в своих make-файлах я использую функции addprefix, addsuffix, wildcard, notdir и patsubst. Для вызова функций используется синтаксис

$(имя_функции параметр1, параметр2 ... )

Функция addprefix рассматривает второй параметр как список слов разделенных пробелами. В начало каждого слова она добавляет строку, переданную ей в качестве первого параметра. Например, в результате выполнения make-файла:

src_dirs := Editor TextLine src_dirs := $(addprefix ../../, $(src_dirs)) all: @echo $(src_dirs) на экран будет выведено

../../Editor ../../TextLine

Видно, что к каждому имени директории добавлен префикс "../../". Функция addprefix обсуждается в разделе "Functions for File Names" руководства по GNU Make.

Функция addsuffix работает аналогично функции addprefix, только добавляет указанную строку в конец каждого слова. Например, в результате выполнения make-файла:

source_dirs := Editor TextLine search_wildcards := $(addsuffix /*.cpp, $(source_dirs)) all: @echo $(search_wildcards)

на экран будет выведено

Editor/*.cpp TextLine/*.cpp

Видно, что к каждому имени директории добавлен суффикс "/*.cpp". Функция addsuffix обсуждается в разделе "Functions for File Names" руководства по GNU Make.

Функция wildcard "расширяет" переданный ей шаблон или несколько шаблонов в список файлов, удовлетворяющих этим шаблонам. Пусть в директории Editor находится файл Editor.cpp, а в директории TextLine - файл TextLine.cpp:

  • wildcard_example /
  • Editor /
  • Editor.cpp
  • TextLine /
    • TextLine.cpp
    • makefile Тогда в результате выполнения такого make-файла:
    • search_wildcards := Editor/*.cpp TextLine/*.cpp source_files := $(wildcard $(search_wildcards)) all: @echo $(source_files)

      на экран будет выведено

      Editor/Editor.cpp TextLine/TextLine.cpp

      Видно, что шаблоны преобразованы в списки файлов. Функция wildcard подробно обсуждается в разделе "The Function wildcard" руководства по GNU Make.

      Функция notdir позволяет "убрать" из имени файла имя директории, где он находится. Например, в результате выполнения make-файла:

      source_files := Editor/Editor.cpp TextLine/TextLine.cpp source_files := $(notdir $(source_files)) all: @echo $(source_files)

      на экран будет выведено

      Editor.cpp TextLine.cpp Видно, что из имен файлов убраны "пути" к этим файлам. Функция notdir обсуждается в разделе "Functions for File Names" руководства по GNU Make.

      Функция patsubst позволяет изменить указанным образом слова, подходящие под шаблон. Она принимает три параметра - шаблон, новый вариант слова и исходную строку. Исходная строка рассматривается как список слов, разделенных пробелом. Каждое слово, подходящее под указанный шаблон, заменяется новым вариантом слова. В шаблоне может использоваться специальный символ '%', который означает "любое количество произвольных символов". Если символ '%' встречается в новом варианте слова (втором параметре), то он заменяется текстом, соответствующим символу '%' в шаблоне. Например, в результате выполнения make-файла:

      source_files := Editor.cpp TextLine.cpp object_files := $(patsubst %.cpp, %.o, $(source_files)) all: @echo $(object_files)

      на экран будет выведено

      Editor.o TextLine.o

      Видно, что во всех словах окончание ".cpp" заменено на ".o". Функция patsubst имеет второй, более короткий вариант записи для тех случаев, когда надо изменить суффикс слова (например, заменить расширение в имени файла). Более короткий вариант выглядит так:

      $(имя_переменной:.старый_суффикс=.новый_суффикс) Применяя "короткий" вариант записи предыдущий пример можно записать так:

      source_files := Editor.cpp TextLine.cpp object_files := $(source_files:.cpp=.o) all: @echo $(object_files)

      Функция patsubst обсуждается в разделе "Functions for String Substitution and Analysis" руководства по GNU Make.



      Содержание раздела