Product SiteDocumentation Site

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 файлы таких типов просто удаляются на этапе формирования пакета.