Autotools (configure/make)
Классическая система сборки: configure, make, make install.
На этой странице
Autotools (GNU Build System) — классическая система сборки, состоящая из autoconf, automake и libtool. Большинство проектов на C/C++ всё ещё используют её.
Признаки Autotools
В исходниках есть:
configureилиconfigure.ac/configure.inMakefile.amилиMakefile.inaclocal.m4- Каталог
m4/
Стандартная сборка
%build
%configure
%make_build
%install
%make_install
Это работает для 90% проектов на Autotools.
Макросы подробно
%configure
%configure [опции]
Раскрывается в:
./configure \
--build=x86_64-redhat-linux-gnu \
--host=x86_64-redhat-linux-gnu \
--program-prefix= \
--disable-dependency-tracking \
--prefix=/usr \
--exec-prefix=/usr \
--bindir=/usr/bin \
--sbindir=/usr/sbin \
--sysconfdir=/etc \
--datadir=/usr/share \
--includedir=/usr/include \
--libdir=/usr/lib64 \
--libexecdir=/usr/libexec \
--localstatedir=/var \
--sharedstatedir=/var/lib \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
[ваши опции]
Типичные опции:
%configure \
--enable-feature \
--disable-static \
--with-system-libfoo \
--without-bundled-bar
%make_build
%make_build [цели]
Раскрывается в:
make -O -j8 # параллельная сборка
-j8 зависит от %{?_smp_mflags}.
С дополнительными параметрами:
%make_build CFLAGS="%{optflags} -DEXTRA" V=1
%make_install
%make_install [переменные]
Раскрывается в:
make install DESTDIR=%{buildroot}
Полный пример SPEC
Name: hello
Version: 2.12.1
Release: 1%{?dist}
Summary: The classic greeting program
License: GPL-3.0-or-later
URL: https://www.gnu.org/software/hello/
Source0: https://ftp.gnu.org/gnu/hello/hello-%{version}.tar.gz
BuildRequires: gcc
BuildRequires: make
BuildRequires: gettext
%description
The GNU Hello program produces a familiar, friendly greeting.
%prep
%autosetup
%build
%configure
%make_build
%install
%make_install
%find_lang %{name}
%check
make check
%files -f %{name}.lang
%license COPYING
%doc README NEWS AUTHORS
%{_bindir}/hello
%{_mandir}/man1/hello.1*
%{_infodir}/hello.info*
%changelog
* Mon Feb 03 2025 Your Name <your@email.com> - 2.12.1-1
- Initial package
Генерация configure
Некоторые проекты распространяют только configure.ac без готового configure:
%prep
%autosetup
# Сгенерировать configure
autoreconf -fiv
BuildRequires:
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: libtool
Или если есть autogen.sh:
%prep
%autosetup
./autogen.sh
Распространённые опции configure
Включение/отключение возможностей
%configure \
--enable-gtk-doc \
--disable-static \
--disable-rpath
Использование системных библиотек
%configure \
--with-system-zlib \
--without-bundled-sqlite
Пути установки
%configure \
--docdir=%{_pkgdocdir} \
--with-systemdsystemunitdir=%{_unitdir}
Работа с libtool
Libtool создаёт файлы .la — они обычно не нужны:
%install
%make_install
# Удалить .la файлы
find %{buildroot} -name '*.la' -delete
Отключение статических библиотек
%configure --disable-static
Если статические библиотеки нужны, они идут в -static подпакет.
Параллельная сборка
По умолчанию %make_build использует все ядра. Если сборка ломается:
%build
%configure
make # Без параллельности
Или ограничить:
%build
%configure
make -j2
Отладка configure
Посмотреть доступные опции
cd ~/rpmbuild/BUILD/project-1.0
./configure --help
Посмотреть, что configure определил
cat config.log
cat config.h
Типичные ошибки
«checking for FOO… no»
checking for FOO... no
configure: error: FOO is required
Найти и добавить BuildRequires:
dnf provides '*/FOO'
dnf provides 'pkgconfig(foo)'
«configure: error: C compiler cannot create executables»
sudo dnf install gcc
Примеры из реальных пакетов
Проект с подкаталогом сборки
Некоторые проекты требуют out-of-tree сборку:
%build
mkdir build && cd build
%configure
%make_build
%install
cd build
%make_install
Проект с нестандартными путями
%configure \
--with-configdir=%{_sysconfdir}/%{name} \
--with-datadir=%{_datadir}/%{name} \
--with-rundir=%{_rundir}/%{name}
Отключение ненужных зависимостей
%configure \
--disable-dependency-tracking \
--disable-silent-rules \
--disable-nls
Типичные проблемы
«Makefile: No rule to make target ‘install’»
Проект не использует стандартный make install:
%install
install -Dm 755 myapp %{buildroot}%{_bindir}/myapp
«libtool: error: cannot find the library»
Путь к библиотеке неверен. Возможно, нужно:
%configure LDFLAGS="-L%{_libdir}"
Configure падает на зависимости
Проверьте, что установлены -devel пакеты:
sudo dnf install libfoo-devel libbar-devel
Проверьте понимание
- Какие файлы указывают на использование Autotools?
- Что делает макрос
%configure? - Как отключить статические библиотеки?
- Что делать с файлами
.la? - Как запустить configure с опцией
--enable-feature?
Далее: CMake