m4
Мощный макропроцессор общего назначения, используемый в Unix-подобных системах для обработки текстовых файлов, генерации кода и автоматизации шаблонов. Он предоставляет язык макросов, который позволяет определять и расширять текстовые шаблоны, что делает его ключевым компонентом многих систем сборки, включая GNU Autotools. M4 широко применяется для конфигурации программного обеспечения, создания документации и обработки текста.
Особенности
- поддержка рекурсивного расширения макросов и аргументов;
- встроенные функции для работы со строками, числами и файлами;
- возможность определения пользовательских макросов с аргументами;
- поддержка условных операций и циклов.
Основные компоненты
M4 состоит из интерпретатора макропроцессора, который выполняет преобразование входного текста в выходной на основе определённых макросов и правил (подробнее с документацией можно ознакомиться здесь).
Базовые макросы и синтаксис
Язык M4 предоставляет набор встроенных макросов для выполнения основных операций, таких как определение макросов, работа со строками и числами, а также управление потоком выполнения. Макросы вызываются по имени, за которым следует список аргументов в скобках.
Основные встроенные макросы:
define— определение нового макроса;undefine— удаление определения макроса;defn— получение определения макроса (без расширения);pushdefиpopdef— управление определением макросов через стек;ifdef,ifelse— условные операторы;len,substr,index— функции для работы со строками;eval— вычисление арифметических выражений;include,sinclude— включение содержимого файла;divertиundivert— управление потоком вывода.
Работа с аргументами и цитатами
M4 использует символ обратной кавычки (`) и апостроф (') для цитирования аргументов, что позволяет контролировать процесс расширения макросов. Правильное использование цитат важно для избежания непреднамеренного расширения.
Правила цитирования:
- Обратная кавычка начинает цитату, апостроф заканчивает;
- Внутри цитаты макросы не расширяются;
- Функция
changequoteпозволяет изменить символы цитирования.
Управление потоком вывода
M4 предоставляет механизм диверсий (diversions), который позволяет накапливать текст во внутренних буферах и выводить его в определённом порядке. Это полезно для генерации сложных структур, таких как код программы с разделением на части.
Функции диверсий:
divert(n)— переключение вывода на буфер n (от -1 до 10);undivert(n)— вывод содержимого буфера n;divnum— получение текущего номера диверсии.
Поддержка регулярных выражений и подстановок
M4 включает функции для работы с регулярными выражениями и выполнения подстановок в тексте, что позволяет выполнять сложные текстовые преобразования.
Функции для подстановок:
regexp— поиск по регулярному выражению;patsubst— подстановка по шаблону;translit— замена символов.
Интеграция с внешними командами
M4 может запускать внешние команды и использовать их вывод в процессе обработки текста. Это позволяет интегрировать макропроцессор с другими инструментами и системами.
Функции для работы с внешними командами:
syscmd— выполнение системной команды;esyscmd— выполнение команды и включение её вывода в результат;sysval— получение кода возврата последней команды.
Использование в GNU Build System
M4 является неотъемлемой частью GNU Build System (Autotools), где он используется для создания configure-скриптов из шаблонов configure.ac. Макросы Autoconf написаны на M4 и определяют правила проверки системы и генерации кода.
Роль в Autotools:
- Обработка файлов configure.ac и Makefile.am;
- Генерация стандартных проверок и тестов;
- Создание переносимых configure-скриптов;
- Определение макросов для работы с компиляторами, библиотеками и системами.