International conference of developers
and users of free / open source software

mk-configure – легковесная альтернатива GNU autotools

Алексей Чеусов, Invention Machine corp., Минск, Беларусь

В феврале 2009 года в результате очередного “обсуждения” ;-) в одной из эхоконференций сети FIDO различных вопросов, связанных со сборкой программных проектов, как то “чей make лучше”, “так почему всё-таки autotools”, “чем плох и хорош make” и прочих веселых вопросов я решил, что пришло время реализовать свои идеи и представления об идеальной с моей точки зрения системе сборки ПО что называется “в железе”. Вот так, в ответ на вопрос “Зачем слова? Вы мне покажите…”, родился еще один проект с открытым исходным кодом, один из десятков тысяч других таких же, и имя его mk-configure (иногда я называю его mk-c или даже mkc). Целью и задачей проекта является, ни много ни мало, составить конкуренцию таким известным и популярным проектам, как GNU autotools, scons, CMake, а также другим, менее популярным, но решающим все ту же задачу — сборку программного проекта и установку его на систему пользователя для дальнейшего использования.

Наиболее часто задаваемый мне вопрос — “Зачем?”. И действительно, зачем? Проектов аналогичного назначения — масса. К тому же “GNU autotools прекрасно у всех работает. Зачем что-то еще?” ©. Я не стану отвлекаться на тему, насколько хорошо работает GNU autotools, и как много этих “всех”. В качестве ответа приведу маленький пример кода из NetBSD, который в определенном смысле и явился первопричиной… Думаю, большинству пользователей операционных систем с открытым исходным кодом, и даже пользователям закрытых коммерческих ОС известна программа GNU grep. Она входит в состав практически каждого Linux дистрибутива, является частью базовых систем NetBSD, OpenBSD, FreeBSD и многих других. Программистам, связанным с UNIX-подобными системами, хорошо известно, что в качестве системы сборки GNU grep использует GNU autotools. Менее известный факт, но о котором хорошо знают пользователи BSD систем: процессом сборки в BSD управляет по большому счету одна программа, make, и центральным элементом дерева исходного кода этих систем являются Makefile-ы. Вот как выглядит src/usr.bin/grep/Makefile в NetBSD (по умолчанию в NetBSD-5 используется GNU grep).

==============================================
# !http://www.codecogs.com/png.latex?\textstyle%20NetBSD:%20Makefile,v%201.2%202006/05/15%2021:12:21%20rillig%20Exp!
PROG=   grep
SRCS=   binary.c file.c grep.c mmfile.c queue.c util.c

LINKS=  !http://www.codecogs.com/png.latex?\textstyle%20%7BBINDIR%7D/grep!{BINDIR}/egrep  \
        !http://www.codecogs.com/png.latex?\textstyle%20%7BBINDIR%7D/grep!{BINDIR}/fgrep  \
        !http://www.codecogs.com/png.latex?\textstyle%20%7BBINDIR%7D/grep!{BINDIR}/zgrep  \
        !http://www.codecogs.com/png.latex?\textstyle%20%7BBINDIR%7D/grep!{BINDIR}/zegrep \
        !http://www.codecogs.com/png.latex?\textstyle%20%7BBINDIR%7D/grep!{BINDIR}/zfgrep

MLINKS= grep.1 egrep.1  \
        grep.1 fgrep.1  \
        grep.1 zgrep.1  \
        grep.1 zegrep.1 \
        grep.1 zfgrep.1
LDADD=  -lz

WARNS=  4

.include <bsd.prog.mk>
==============================================

Я убежден в том, что даже начинающий UNIX-программист легко поймет без документации, что написано в этом Makefile-е и для чего. Просто? Конечно! И каким образом это “собирается”? Где правила компиляции и связывания, установки и чистки мусора? Всё, что необходимо для разработки, сборки и установки программы, находится в библиотечном файле bsd.prog.mk. И единственной программой необходимой для сборки является команда make(1) NetBSD. На мой взгляд именно так и должны выглядеть инструкции по сборке программного проекта: кратко, понятно, описательно, настолько, насколько это возможно. Можно сравнить самостоятельно это решение с тем, что мы имеем в GNU grep. bsd.prog.mk вместе с другими bsd.*.mk библиотечными файлами часто называют Mk файлами или скриптами. К сожалению, набор Mk скриптов NetBSD не лишен недостатков. Он изначально не был расчитан на разработку программного обеспечения вне NetBSD. То же относится и к
Mk файлам из FreeBSD и OpenBSD. Основная область их применения — базовые системы соответствующих ОС. Кроме того, они не предоставляют никакой функциональности для анализа программного окружения (аналога GNU autoconf), а это крайней важно для разработки переносимого ПО. Перспектив по развитию проекта в данном направлении тоже заметно не было. Поэтому, взяв за оcнову Mk files из NetBSD и NetBSD make, я и начал разработку проекта. Насколько удачно у меня получилось — судите сами.

Материалы к докладу