Product SiteDocumentation Site

9.2. Авто-автосборка

Общий поток автосборочного окружения одинаков:
  • единожды используется autoscan для создания базового профиля;
  • описывается configure.ac;
  • вызываются autoheader для генерации config.h.in и aclocal для подготовки к работе automake;
  • описывается make-генератор Makefile.am;
  • вызывается automake --add-missing для подготовки Makefile.in;
  • вызывается autoconf для генерации основного конфигурационного файла configure.
При уже описанных configure.ac и Makefile.am и лишь небольшом редактировании этих файлов подготовка к сборке представляет из себя последовательный вызов aclocalautoconfautoheaderautomake --add-missing. Для того чтобы делать эти действия за один раз используется утилита autoreconf с ключами -fisv. Весь путь по созданию конфигурационного окружения показан здесь:
Процесс авто-автосборки
В spec-файле для директивы %build есть даже специальный макрос %autoreconf, буквально разворачивающийся в команду autoreconf -fisv. После его исполнения необходимо лишь вызвать configure и завершить сборку с помощью make:
@user: autoenv-pkg/autoenv-pkg.spec
Name: autoenv-pkg
Version: 1.0
Release: alt1

Summary: Test pkg with autotool

License: GPL-3.0-or-later
Group: Development/Other

Source0: %name-%version.tar.gz
BuildRequires: libncurses-devel


%description
This is a small testing package, builded by autotools

%prep
%setup

%build
%autoreconf
%configure
%make_build

%install
%makeinstall_std

%check
make check

%files
%_bindir/*

%changelog
* Mon Jul 21 2025 UsamG1t <usamg1t@altlinux.org> 1.0-alt1
- Initial build
Макрос %makeinstall_std разворачивается в make install с параметрами; ни цели install, ни цели check в прототипе Makefile.am нет: их (и десятки других рецептов) добавляет в конечный Makefile сценарий configure.
Поскольку для корректной сборки конфигурационного окружения достаточно лишь двух файлов — configure.ac и Makefile.am —  gear-репозиторий может выглядеть достаточно компактным. На практике часть промежуточных файлов генерации не считаются такими в рамках разработки. Обычно в итоговый набор файлов входит всё, что необходимо для работы основного конфигурационного сценария configure. Однако мы остановимся на минимальном рабочем варианте:
@user
[user@VM autoenv-pkg]$ tree . .gear
.
├── autoenv-pkg.spec
├── configure.ac
├── Makefile.am
└── src
   └── prog.c
.gear
└── rules

3 directories, 5 files
[user@VM autoenv-pkg]$
Рассмотрим информационный вывод при сборке пакета:
@user
[user@VM autoenv-pkg]$ gear-hsh
<...>
Wrote: /usr/src/in/srpm/autoenv-pkg-1.0-alt1.src.rpm (w1.gzdio)
Installing autoenv-pkg-1.0-alt1.src.rpm
<...>
При выполнении секции %build макрос %autoreconf, действительно, разворачивается в команду пересборки configure:
Executing(%build): /bin/sh -e /usr/src/tmp/rpm-tmp.51756
+ umask 022
+ /bin/mkdir -p /usr/src/RPM/BUILD
+ cd /usr/src/RPM/BUILD
+ cd autoenv-pkg-1.0
+ autoreconf -fisv
<...>
Подробнее остановимся на самом исполнении configure при сборке. В макросе к нему добавляется множество флагов сборки, указывающих на местоположение исходников, библиотек и т.д:
+ ./configure --build=x86_64-alt-linux --host=x86_64-alt-linux --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/lib --localstatedir=/var/lib --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --disable-silent-rules --runstatedir=/var/run --without-included-gettext
configure: WARNING: unrecognized options: --without-included-gettext
checking for a BSD-compatible install... /usr/bin/ginstall -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
В рамках выполнения configure проверяются наличие всех сборочных зависимостей системы: наличие make, компилятора gcc и т. д.:
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for x86_64-alt-linux-gcc... x86_64-alt-linux-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether x86_64-alt-linux-gcc accepts -g... yes
checking for x86_64-alt-linux-gcc option to enable C11 features... none needed
checking whether x86_64-alt-linux-gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of x86_64-alt-linux-gcc... none
Проверяется достижимость библиотек: как по указанным в AC_CHECK_LIB проверкам, так и по заголовочным файлам:
checking for initscr in -lncurses... yes
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for unistd.h... (cached) yes
checking for ncurses.h... yes
checking for error_at_line... yes
checking that generated files are newer than configure... done
Создаётся специальный сценарий config.status, хранящий информацию и параметры последней удачной сборки окружения:
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
configure: WARNING: unrecognized options: --without-included-gettext
<...>
Отдельное внимание заслуживает директива %check, в которой описываются результаты тестирования сценариев из Makefile.am:
Executing(%check): /bin/sh -e /usr/src/tmp/rpm-tmp.61556
+ umask 022
+ /bin/mkdir -p /usr/src/RPM/BUILD
+ cd /usr/src/RPM/BUILD
+ cd autoenv-pkg-1.0
+ make check
make: Entering directory '/usr/src/RPM/BUILD/autoenv-pkg-1.0'
make  check-TESTS
make[1]: Entering directory '/usr/src/RPM/BUILD/autoenv-pkg-1.0'
make[2]: Entering directory '/usr/src/RPM/BUILD/autoenv-pkg-1.0'
echo 'test "`./autoenv < /dev/null 2>&1`" = "./autoenv: Not a terminal"' > isterm.sh
chmod +x isterm.sh
PASS: isterm.sh
============================================================================
Testsuite summary for autoenv-pkg 1.0
============================================================================
# TOTAL: 1
# PASS:  1
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
make[2]: Leaving directory '/usr/src/RPM/BUILD/autoenv-pkg-1.0'
make[1]: Leaving directory '/usr/src/RPM/BUILD/autoenv-pkg-1.0'
make: Leaving directory '/usr/src/RPM/BUILD/autoenv-pkg-1.0'
+ exit 0
<...>