× К оглавлению На главную Об авторе

Дата и время публикации   :
Дата и время модификации:

Построение и организация простого проекта


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’

В тоже время, необходимые утилиты, реализующие

При этом пакет 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 и perl-base. В конечном итоге, которые тянут за собой зависимости пакетов системных библиотеки GNU Library C и компилятора GСС с портируемой сборкой под архитектуру x86.

При этом у Дебиановцев ядро фактически в зависимостях не фигурирует и следовательно требуемая версия ядра должна определяться по системным вызвовам, используемых библиотекой 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 с более полными и расширенными шаблонами, как это будет показано ниже.

При этом,

Соответственно, с получением на выходе скрипта ./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 идентифицирующие проект данные через запятую в виде несколько списков и заключенные в квадратные скобки, которые идентифицируют проект по :

Дополнительно можно указать каким будет имя архивного файла, дистрибутива пакета и ссылка 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.1 GNU automake manual

3.2 Использование Autoconf и Automake вместе с языком программирования С++(перевод)

3.3 Как организовать дерево проекта в Automake с рекурсией и без неё

3.3 Developer Gnome. Create autotools

3.4 Как применять лицензии GNU со своими программами

3.5 Autotools Introduction

3.6 Auto-generating aclocal.m4

3.7 Autoconf. Initializing configure

3.8 Setting up a real-life GTK application

3.9 Changing Automake’s Behavior