Поддержка регулярных выражений в GNU make (make_pcre)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Поддержка регулярных выражений в GNU make

Сообщение Bizdelnick »

В сугубо джастфофанных академических целях написал плагин к GNU make для поиска совпадений с регулярным выражением (PCRE). Работает он примерно так:

Код: Выделить всё

#!/usr/bin/env make -f
load pcre.so

text = foo.c bar.c baz.y

all:
    @echo '$(m \bba(\S+)\.[xyz]\b,$(text))'
    @echo '$(1)'
выведет

make

baz.y
z
Больше на данный момент почти ничего не умеет. Более подробное описание (in bad English) - тут, скачать архив с исходниками на поиграться можно здесь. Для работы нужен GNU make версии не ниже 4.0, потому как только в нём поддержка плагинов и появилась.
Буду благодарен за замечания и пожелания, и совсем непомерно - за соображения на предмет практической применимости, поскольку таковые у меня напрочь отсутствуют.

Upd. Основной репозиторий исходного кода расположен здесь, также зеркала имеются на github и gitlab. Загрузить архив любой версии можно отсюда.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Поддержка регулярных выражений в GNU make

Сообщение Hephaestus »

Bizdelnick писал(а):
23.11.2014 19:40
и совсем непомерно - за соображения на предмет практической применимости, поскольку таковые у меня напрочь отсутствуют.
Ну как же?
У меня была ситуация.
Хотелось компилять одним запуском make кучу сишных исходников, каждый из которых - пример из книги, то есть отдельная задача.
Причём, компилять надо было только тех, которые изменились.
Файлы исходников и исполняемые файлы были названы однотипными именами.
Сначала было лень и я писал каждому исходнику отдельную команду, потом, когда их стало больше пяти - это стало надоедать, когда их перевалило за десять, я плюнул и перекроил весь Makefile, если не ошибаюсь, c Вашей (в числе прочих) помощью.

Так вот, подозреваю, что всю эту петрушку можно было разрулить при помощи регулярных выражений (был у меня такой соблазн), но... просто так make регулярки не принимал, а без них нужно было использовать make-овские шаблоны, которые порой гораздо непонятней, чем регулярки.

Так что не сумлевайтесь, применение найдется.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поддержка регулярных выражений в GNU make

Сообщение Bizdelnick »

Hephaestus
Я на тот момент был с make'ом на "Вы", так что решение подсказал не я. И, насколько помню, оно было намного элегантнее, чем могло бы быть с использованием регулярок.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поддержка регулярных выражений в GNU make

Сообщение Bizdelnick »

Нарекаю то, что допилил за неделю, версией 0.2.
архив описание

Изменения:
  • Добавлен глобальный поиск (опция 'g').
  • Исправлен захват строк, содержащих символ '$'.
  • Улучшена обработка ошибок.

Что касается глобального поиска, с его помощью можно реализовать фильтрацию наподобие встроенной функции filter, но более гибко. Например

Код: Выделить всё

#!/usr/bin/env make -f
load pcre.so

files = foo.c foo1.c foo2.c foo.h bar.c bar.h baz.cc baz.hh

all:
	@echo '$(m \b(?:foo\d*\.c)|(?:\w+\.h)\b,$(files),g)'
выведет

make

foo.c foo1.c foo2.c foo.h bar.h

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поддержка регулярных выражений в GNU make

Сообщение Bizdelnick »

В связи сами знаете с чем репозиторий переехал сюда.
Копия на гитхабе тоже будет поддерживаться в актуальном состоянии.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поддержка регулярных выражений в GNU make

Сообщение Bizdelnick »

Готова версия 0.3. Главное новшество - функция подстановки. Делает она ровно то, что должна делать:

Код: Выделить всё

#!/usr/bin/env make -f
load pcre.so

all:
	@echo '$(s (\w+\.)y\b,$(1)c,file1.y file2.y,g)'
выведет

make

file1.c file2.c


Подробнее - в описании.
Из других изменений - исправление мелких ошибок (в частности ошибки при выводе сообщения об ошибке, содержащего непарные скобки) и не влияющие на функционал улучшения.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поддержка регулярных выражений в GNU make

Сообщение Bizdelnick »

В версии 0.3.1 исправлена ошибка, приводившая к зависанию глобального поиска или замены при обнаружении совпадения нулевой длины.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Basileus
Сообщения: 181
ОС: Mandriva, OpenSUSE

Re: Поддержка регулярных выражений в GNU make

Сообщение Basileus »

Позволил себе разместить в твиттере здесь упоминания об этом плагине.
Верблюд - это лошадь, спроектрированная комитетом по стандартизации.
Спасибо сказали:
Ответить