12.3. Автоматизация Libtool
Поскольку libtool является классическим инструментом автосборки библиотек, в autotools есть поддержка его обработки.
Для начала соберём классический configure.ac:
@user:
inc-pkg/configure.ac
AC_INIT([inc], [1.0], [UsamG1t])
AC_CONFIG_SRCDIR([src/main.c])
AM_INIT_AUTOMAKE([foreign subdir-objects])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
# Optional clues
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
Перенесём исходники в отдельную поддиректорию и сделаем
Makefile.am для обработки:
.
├── configure.ac
├── Makefile.am
└── src
├── fun.c
├── global.c
├── libinc.h
├── main.c
└── Makefile.am
@user:
inc-pkg/Makefile.am
SUBDIRS = src
@user:
inc-pkg/src/Makefile.am
CFLAGS = -Wall -O0 -g
bin_PROGRAMS = inc
inc_SOURCES = main.c fun.c global.c
fun.c global.c: libinc.h
check: inc
test "`./$< 123`" = "124"
Сборка уже работает корректно, однако получился просто многофайловый проект. Добавим обработку libtool: в configure.ac добавим инициализацию libtool и укажем явный запрет сборки статической библиотеки, в src/Makefile.am укажем сборку библиотеки из исходников (lib_LTLIBRARIES), а также связь библиотеки с исполняемым файлом (inc_LDADD):
@user:
inc-pkg/configure.ac
AC_INIT([inc], [1.0], [UsamG1t])
AC_CONFIG_SRCDIR([src/main.c])
AM_INIT_AUTOMAKE([foreign subdir-objects])
LT_INIT([disable-static])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])
# Optional clues
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
@user:
inc-pkg/src/Makefile.am
CFLAGS = -Wall -O0 -g
lib_LTLIBRARIES = libinc.la
libinc_la_SOURCES = fun.c global.c
bin_PROGRAMS = inc
inc_SOURCES = main.c
inc_LDADD = libinc.la
BUILT_SOURCES = libinc.h
check: inc
test "`./$< 123`" = "124"
Добавим .gear/rules и spec-файл для сборки пакета:
@user:
inc-pkg/.gear/rules
spec: .gear/inc.spec
tar.gz: . name=@name@-@version@
@user:
inc-pkg/.gear/inc.spec
Name: inc
Version: 1.0
Release: alt1
Summary: Test pkg with libtool
License: GPL-3.0-or-later
Group: Development/Other
Source0: %name-%version.tar.gz
%description
This is a small testing package, builded with libtool
%prep
%setup
%build
%autoreconf
%configure
%make_build
%install
%makeinstall_std
%check
make check
%files
%_bindir/%name
%_libdir/*
%changelog
* Tue Aug 05 2025 UsamG1t <usamg1t@altlinux.org> 1.0-alt1
- Initial Build
Напомним, что в
autotools задаются места для установки всех компонентов проекта, а в макросе
%configure они определены в соответствии с дисциплиной оформления пакетов ALT. Библиотека
libinc.so автоматически установится в
/usr/lib64, и при описании файлов пакета (директива
%files) необходимо будет просто указать директорию
%_libdir:
.
├── configure.ac
├── Makefile.am
└── src
├── fun.c
├── global.c
├── libinc.h
├── main.c
└── Makefile.am
.gear/
├── inc.spec
└── rules
@user
[user@VM inc-pkg]$ gear-hsh --lazy
<...>
Executing(%build): /bin/sh -e /usr/src/tmp/rpm-tmp.60211
<...>
+ make -j2
<...>
/bin/sh ../libtool --tag=CC --mode=compile x86_64-alt-linux-gcc -DHAVE_CONFIG_H -I. -I.. -Wall -O0 -g -c -o fun.lo fun.c
libtool: compile: x86_64-alt-linux-gcc -DHAVE_CONFIG_H -I. -I.. -Wall -O0 -g -c fun.c -fPIC -DPIC -o .libs/fun.o
/bin/sh ../libtool --tag=CC --mode=compile x86_64-alt-linux-gcc -DHAVE_CONFIG_H -I. -I.. -Wall -O0 -g -c -o global.lo global.c
libtool: compile: x86_64-alt-linux-gcc -DHAVE_CONFIG_H -I. -I.. -Wall -O0 -g -c global.c -fPIC -DPIC -o .libs/global.o
/bin/sh ../libtool --tag=CC --mode=link x86_64-alt-linux-gcc -Wall -O0 -g -o libinc.la -rpath /usr/lib64 fun.lo global.lo
libtool: link: x86_64-alt-linux-gcc -shared -fPIC -DPIC .libs/fun.o .libs/global.o -O0 -g -Wl,-soname -Wl,libinc.so.0 -o .libs/libinc.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libinc.so.0" && ln -s "libinc.so.0.0.0" "libinc.so.0")
libtool: link: (cd ".libs" && rm -f "libinc.so" && ln -s "libinc.so.0.0.0" "libinc.so")
libtool: link: ( cd ".libs" && rm -f "libinc.la" && ln -s "../libinc.la" "libinc.la" )
/bin/sh ../libtool --tag=CC --mode=link x86_64-alt-linux-gcc -Wall -O0 -g -o inc main.o libinc.la
libtool: link: x86_64-alt-linux-gcc -Wall -O0 -g -o .libs/inc main.o ./.libs/libinc.so
<...>
Executing(%install): /bin/sh -e /usr/src/tmp/rpm-tmp.31330
<...>
make[3]: Entering directory '/usr/src/RPM/BUILD/inc-1.0/src'
/usr/bin/mkdir -p '/usr/src/tmp/inc-buildroot/usr/lib64'
/bin/sh ../libtool --mode=install /usr/libexec/rpm-build/install -p libinc.la '/usr/src/tmp/inc-buildroot/usr/lib64'
libtool: install: /usr/libexec/rpm-build/install -p .libs/libinc.so.0.0.0 /usr/src/tmp/inc-buildroot/usr/lib64/libinc.so.0.0.0
libtool: install: (cd /usr/src/tmp/inc-buildroot/usr/lib64 && { ln -s -f libinc.so.0.0.0 libinc.so.0 || { rm -f libinc.so.0 && ln -s libinc.so.0.0.0 libinc.so.0; }; })
libtool: install: (cd /usr/src/tmp/inc-buildroot/usr/lib64 && { ln -s -f libinc.so.0.0.0 libinc.so || { rm -f libinc.so && ln -s libinc.so.0.0.0 libinc.so; }; })
libtool: install: /usr/libexec/rpm-build/install -p .libs/libinc.lai /usr/src/tmp/inc-buildroot/usr/lib64/libinc.la
libtool: warning: remember to run 'libtool --finish /usr/lib64'
/usr/bin/mkdir -p '/usr/src/tmp/inc-buildroot/usr/bin'
/bin/sh ../libtool --mode=install /usr/libexec/rpm-build/install -p inc '/usr/src/tmp/inc-buildroot/usr/bin'
libtool: warning: 'libinc.la' has not been installed in '/usr/lib64'
libtool: install: /usr/libexec/rpm-build/install -p .libs/inc /usr/src/tmp/inc-buildroot/usr/bin/inc
<...>
Adjusting library links in /usr/src/tmp/inc-buildroot
./usr/lib64: (from <cmdline>:0)
libinc.so.0 -> libinc.so.0.0.0
Verifying ELF objects in /usr/src/tmp/inc-buildroot (arch=normal,fhs=normal,lfs=relaxed,lint=relaxed,rpath=normal,stack=normal,textrel=normal,unresolved=normal)
Splitting links to aliased files under /{,s}bin in /usr/src/tmp/inc-buildroot
Executing(%check): /bin/sh -e /usr/src/tmp/rpm-tmp.55059
<...>
test "`./inc 123`" = "124"
<...>
Wrote: /usr/src/RPM/SRPMS/inc-1.0-alt1.src.rpm (w2.lzdio)
Wrote: /usr/src/RPM/RPMS/x86_64/inc-1.0-alt1.x86_64.rpm (w2.lzdio)
Wrote: /usr/src/RPM/RPMS/x86_64/inc-debuginfo-1.0-alt1.x86_64.rpm (w2.lzdio)
7.09user 5.34system 0:15.58elapsed 79%CPU (0avgtext+0avgdata 22740maxresident)k
0inputs+17184outputs (0major+731782minor)pagefaults 0swaps
@user
[user@VM inc-pkg]$ cp ~/hasher/repo/x86_64/RPMS.hasher/inc-1.0-alt1.x86_64.rpm ~/hasher/chroot/.in/
[user@VM inc-pkg]$ hsh-shell --rooter
@rooter
[root@localhost .in]# rpm -i inc-1.0-alt1.x86_64.rpm
<13>Aug 5 12:39:54 rpm: inc-1.0-alt1 1754397543 installed
[root@localhost .in]# which inc
/usr/bin/inc
[root@localhost .in]# inc 123
124
[root@localhost .in]# ls -la /usr/lib64/libinc*
lrwxrwxrwx 1 root root 15 Aug 5 12:37 /usr/lib64/libinc.so -> libinc.so.0.0.0
lrwxrwxrwx 1 root root 15 Aug 5 12:37 /usr/lib64/libinc.so.0 -> libinc.so.0.0.0
-rw-r--r-- 1 root root 14232 Aug 5 12:37 /usr/lib64/libinc.so.0.0.0
[root@localhost .in]#
Стоит отдельно заметить, что установка .la- и .lo-файлов в систему запрещена дисциплиной оформления пакетов ALT Linux Team (в том числе и из-за соображений безопасности). Библиотеки и использующие их приложения должны быть скомпилированы так, чтобы работать без дополнительной прослойки, требующей запуска Shell. Случайно установленные в %buildroot файлы таких типов просто удаляются на этапе формирования пакета.