Дата и время публикации : Дата и время модификации:
Построение и организация простого проекта
1. Что такое Automake
1.1 Назначение
С помощью GNU Automake, реализуется автоматический режим сборки пакета файлов исходного кода путем генерации Маkefile.in от производных файлов, называемых Маkefile.am, которые содержат ряд определений своих переменных вперемешку с правилами GNU Make.
Генерация файлов Маkefile.in осуществляется в соответствии с стандартами GNU, предъявляемым к файлам формата Маkefile или GNU Make. При этом автоматизация сборки с участием GNU Automake преследует цель облегчить процесс сопровождения пакетов исходного кода программного обеспечения: за счет снятия нагрузки по созданию и сопровождению Маkefile каждого в отдельности.
Automake предъявляет к проекту ряд ограничений, накладываемых из-за использования в нем GNU/Autoconf, что отражается в содержимом файла configure.ac . Кроме того, Automake требует поддержки perl во время генерации файлов Маkefile.in . Однако, дистрибутивы проектов файлов исходного кода, созданные на основе Automake, полностью отвечают стандартам GNU и не требуют обязательного наличия perl во время компиляции пакета, потому что предоставляя всю необходимую среду сборки внутри пакета исходного кода. Конечно же, за исключением случаев, когда perl используется в задействованных во время сборки скриптах самого программного обеспечения.
1.2 Состав программного обеспечения
Для GNU Automake показано на рисунке 1.1
Рисунок 1.1
Как показано на рисунке 1.1, в дистрибутиве Debian, пакеты Automake и Autoconf находятся в жестких зависимостях и устанавливаются одновременно, как и debianutils, perl, m4, а также autotools-dev
Хотя, часто в некоторых статьях, например от разработчиков Gnome, обозначают GNU Automake, как набор утилит автоматической сборки (Autotools), что вносит в неокрепшие головы "Юнных" (или по западной классификации -- Junior) разработчиков некоторый коллапс. Поэтому разработчики Debian в названии пакета autotools-dev использовали суффикс ‘-dev’
В тоже время, необходимые утилиты, реализующие
- программный интерфейс, через написанные на perl утилиты, такие как /usr/bin/autoconf, /usr/bin/autoheader, и скриптов m4, поставляемых в пакете Autoconf; также как подобные утилиты /usr/bin/aclocal-1.16, /usr/bin/automake-1.16 и скрипты m4 из пакета Аutomake ;
- интерактивный интерфейс пользователя из пакета Autoconf, в виде написанных на Perl утилит /usr/bin/autoreconf, /usr/bin/autoscan, /usr/bin/ifnames; при этом указанные /usr/bin/autoconf и /usr/bin/autoheader могут вызываться пользователем самостоятельно из командной строки.
При этом пакет Autoconf будет установлен менеджером пакетов APT(8) вместе с Automake, а вот пакеты debhelper и cdbs необходимо будет указать следом за ним, если есть желание в дальнейшем использовать утилиты сборки пакетов DEB, являющейся неотъемлемой частью среды управления дистрибутива Debian
user@home ~$ sudo apt update ... user@home ~$ sudo apt install automake debhelper cdbs ...
Также вместе с debhelper и cdbs будет установлена куча пакетов автомитизированной среды их сборки дистрибутива Debian, так же как необходимые в зависимостях бинарная утилита GNU m4 макропроцессора UNIX (пакет m4), так и практический язык Ларри Уолла для извлечения данных и составления отчётов (пакет perl) и вместе с ним в зависимостях пакеты libperl5.30 pan> и perl-base. В конечном итоге, которые тянут за собой зависимости пакетов системных библиотеки GNU Library C и компилятора
При этом у Дебиановцев ядро фактически в зависимостях не фигурирует и следовательно требуемая версия ядра должна определяться по системным вызвовам, используемых библиотекой GNU Library C для указанной архитектуры.
1.3 Модель использования пакетов Automake и Autoconf
На рисунке 1.2, взятая от разработчиков Gnome, показана модель использования пакетов Automake и Autoconf
Рисунок 1.1. (c) developer.gnome.org
Соответственно, как показано на рисунке 1.2, пакет Autoconf используется для генерирования конфигурационного скрипта, который обычно обзывается ./configure, согласно установленных клише или макросов в файле configure.ac. При этом вместе c генерацией ./configure, используется пакет Automake, который на основе простейших шаблонов в Makefile.am генерит выходные файлы Makefile.in с более полными и расширенными шаблонами, как это будет показано ниже.
При этом,
- в обоих случае задействуется утилита aclocal, которая генерирует файл aclocal.m4 с макросами понятными не только Autoconf, но и Automake в файле configure.ac, также как с использованием бинарной утилиты GNU m4 макропроцессора UNIX ((пакет m4), что делает такую реализацию удобной и избавленной от лишних поисков нужных макросов, как для построения на выходе скрипта ./configure , так и выходных файлов-шаблонов Makefile.in .
- Пакет Automake требует наличие интерпретатора Perl для генерации выходных файлов Makefile.in. Однако, как уже было сказано выше в дальнейших операциях сборки и компиляции проекта файлов исходного кода не участвует.
Соответственно, с получением на выходе скрипта ./configure и файлов шаблонов Makefile.in дерево проекта файла исходных кодов считается построенным.
2. Построение дерева проекта
2.1 Директория файлов исходного кода
В качестве примера берутся файлы исходного кода проекта sthp которые были закачены в предварительно созданную директорию $HOME/projects/sthp, как показано ниже.
user@home ~$ mkdir -p ~/Projects/sthp/src && cd ~/Projects/sthp/src user@home:~/Projects/sthp/src$ user@home:~/Projects/sthp/src$ wget \ http://rjaan.narod.ru/projects/sthp/sthp_h.txt -O sthp.h ... user@home:~/project/sthp/src$ wget \ http://rjaan.narod.ru/projects/sthp/sthp_c.txt -O sthp.c ... user@home:~/project/sthp/src$ wget \ http://rjaan.narod.ru/projects/sthp/sthp_cli_c.txt -O sthp_cli.c ... User@home:~/project/sthp/src$ wget \ http://rjaan.narod.ru/projects/sthp/sthp_serv_c.txt -O sthp_serv.c ...
Создаем файл Makefile.am спонятными для Automake правиалами и переменными для генерации файла Makefile.in :
user@home:~/Projects/sthp/src$ nano Makefile.am ## Copyright (C) 2017-2020 Andrey Rzhavskov (aka rjaan) ## ## This Makefile.am is free software; the Free Software Foundation ## gives unlimited permission to copy, distribute and modify it. sthp_srcs = sthp.c sthp.h bin_PROGRAMS = sthp_cli sthp_serv sthp_cli_SOURCES = sthp_cli.c $(sthp_srcs) sthp_serv_SOURCES = sthp_serv.c $(sthp_srcs)
Переменная bin_PROGRAMS создает цели для сборки бинарников программ sthp_cli и sthp_serv, которые должны получится на выходе после компиляции файлов проекта sthp_cli.c, sthp_serv.c и sthp.c .
В переменных sthp_cli_SOURCES и sthp_serv_SOURCES перечисляются указанные выше файлы с исходным кодом, необходимые для сборки целей средствами GNU Make или просто make. Зависимости для целей sthp_cli и sthp_serv будут созданы автоматически.
Как вы могли увидеть, что заголовочный файл sthp.h и файл с исходным кодом sthp.c используются в обеих целях sthp_cli и sthp_serv. В связи с чем, была внесена переменная sthp_srcs, в которой укажем эти файлы, тем самым нормализуем запись в Makefile.am при перечислении файлов исходного кода для используемых нами целей. Особенно, когда их может быть указано несколько. Имя переменной создатели automake рекомендуют делать в нижнем регистре, как было показано выше для переменной sthp_srcs.
Затем, переходим в корневую директорию и опять же создаем Makefile.am, используемый для построение схемы рекурсивного обхода поддиректорий файлов исходного кода проекта.
user@home:~/Projects/sthp/$ nano Makefile.am ## Copyright (C) 2017-2020 Andrey Rzhavskov (aka rjaan) ## ## This Makefile.am is free software; the Free Software Foundation ## gives unlimited permission to copy, distribute and modify it. SUBDIRS = src
Режим рекурсивного обхода задается переменной SUBDIRS, о которой более подробно рассказывается в статье Построение и организация рекурсивной сборки .
2.2 Создание файла Readme и configure.ac
На заключительном этапе создания проекта необходимо создать файл configure.ac и желательно, но необязательно, файл README
Поэтому оставаясь в корне создаваемого проекта файлов исходного кода, директории $HOME/Projects/sthp, и создаем файл README, в котором дается краткое описание того, что делает исходный код проекта :
user@home:~/Projects/sthp$ nano README ## Copyright (C) 2017-2020 Andrey Rzhavskov (aka rjaan) ## ## This Makefile.am is free software; the Free Software Foundation ## gives unlimited permission to copy, distribute and modify it. Those programs are an implementation of the string type handle protocol(sthp)
После чего, с чистой совестью завершаем создание проекта файла configure.ac, генерирующего как выходной файл ./configure, так и устанавливающий количество создаваемых на выходе Makefile.in
user@home:~/Projects/sthp$ nano configure.ac ## Copyright (C) 2017-2020 Andrey Rzhavskov (aka rjaan) ## ## This configure.ac script is free software; the Free Software Foundation ## gives unlimited permission to copy, distribute and modify it. AC_INIT([sthp], [1.1], [rjaan@yandex.ru]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT
В котором в первых двух макросах AC_INIT и AM_INIT_AUTOMAKE.
Макрос AC_INIT передает Autoconf идентифицирующие проект данные через запятую в виде несколько списков и заключенные в квадратные скобки, которые идентифицируют проект по :
- имени проекта или пакета исходного кода (package),
- версии (version),
- адресату, которому нужно направлять сообщения об ошибках (bug-report).
Дополнительно можно указать каким будет имя архивного файла, дистрибутива пакета и ссылка URI на сайт в Интернете, где его искать.
При этом package и version являются обязательными согласно принятому формату макроса AC_INIT, приводимый ниже:
... AC_INIT(package, version, [bug-report], [tarname], [url]) ...
Макрос AM_INIT_AUTOMAKE используется для передачи Automake списка опций в единственном аргументе и разделенные друг от друга пробелом в котором передаем опции -Wall, -Werror и foreign
... AM_INIT_AUTOMAKE([-Wall -Werror gnu]) ...
Первые две опции указывают. При этом, -Wall и -Werror являются опциями Automake и указывают во время генерации выходных файлов Makefile.in и ./configure, также как промежуточного aclocal.m4 выводить все предупреждения и трактовать их как ошибки. Соответственно использование опций -Wall, -Werror и gnu приведет к интерпретации отсутствия файлов NEWS, AUTHORS и CHANGELOG, как и копии лицензии GPLv3, приведет к образованию ошибки на выход пользовательского интерфейса, реализуемого утилитой /usr/bin/autoreconf.
... Makefile.am: installing './INSTALL' Makefile.am: error: required file './NEWS' not found Makefile.am: error: required file './AUTHORS' not found Makefile.am: error: required file './ChangeLog' not found Makefile.am: installing './COPYING' using GNU General Public License v3 file Makefile.am: Consider adding the COPYING file to the version control system Makefile.am: for your code, to avoid questions about which license your project uses autoreconf: automake failed with exit status: 1 ...
Для их отключения использовать опции -Wnone и foreign :
... AM_INIT_AUTOMAKE([-Wnone foreign]) ...
Опция foreign сообщает Automake, что пакет программного обеспечения не следует проверять на соответствие стандарту GNU, поэтому в случае отсутствие обязательных для него файлов, таких как README не стоит удивляться наличию предупреждений на выходе Automake
Переменные AC_CONFIG_FILES и AC_OUTPUT управляют генерацией выходных файлов Makefile.in, которые в списке указываются без расширения .in в каждой отдельной строке.
... AC_CONFIG_FILES([ Makefile src/Makefile ]) AC_OUTPUT ...
Так, выходные файлы Makefile.in будут получены на выходе генерации проекта с файлами исходного кода проекта sthp
2.3 Генерация проекта файлов исходного кода
Соответственно, теперь можно запустить процедуру получения выходных файлов ./configure, Makefile.in в корне проекта и поддиректории src :
user@home:~/Projects/sthp$ autoreconf -i configure.ac:7: installing './compile' configure.ac:6: installing './install-sh' configure.ac:6: installing './missing' src/Makefile.am: installing './depcomp'
2.4 Проверка выходных файлов
Оставаясь в корне проекта выполним команду LS(1)
user@home:~/Projects/sthp$ ls -lR .: ... rw-r--r-- 1 user user 42023 авг 25 09:36 aclocal.m4 ... -rw-r--r-- 1 user user 625 авг 25 09:23 config.h.in -rwxr-xr-x 1 user user 146271 авг 25 09:36 configure -rw-r--r-- 1 user user 413 авг 25 09:36 configure.ac ... -rw-r--r-- 1 user user 135 авг 25 09:13 Makefile.am -rw-r--r-- 1 user user 24533 авг 25 09:36 Makefile.in ... ./src: ... -rw-r--r-- 1 user user 342 авг 25 09:13 Makefile.am -rw-r--r-- 1 user user 18274 авг 25 09:36 Makefile.in -rw-r--r-- 1 user user 6152 апр 4 2013 sthp.c -rw-r--r-- 1 user user 3051 апр 4 2013 sthp_cli.c -rw-r--r-- 1 user user 2110 апр 4 2013 sthp.h -rw-r--r-- 1 user user 5040 апр 4 2013 sthp_serv.c ...
В результате, должно быть найдено два Makefile.in и скрипт ./configure, а так же промежуточный файл aclocal.m4
(Продолжение следует, в части проверки изоляции среды создания GNU Automake от его реализации, т.е. дистрибьюции)
3. Библиография
3.2 Использование Autoconf и Automake вместе с языком программирования С++(перевод)
3.3 Как организовать дерево проекта в Automake с рекурсией и без неё
3.3 Developer Gnome. Create autotools
3.4 Как применять лицензии GNU со своими программами
3.6 Auto-generating aclocal.m4
3.7 Autoconf. Initializing configure