Как собрать библотеку используя
configure, automake, autoconf и прочие «авто-утилиты»
Библиотеки в линукс это файлы с расширением «.so» и файлы с расширением «.a». Файлы с расширением «.so» это динамические библиотеки. Файлы с расширением «.a» это статические библиотеки. Оба этих типа библиотек можно создавать с использованием autotools.
Пример создания маленькой библиотеки с использованием autotools:
1. Создадим директорию для библиотеки test.
2. В директории test создадим директорию lib.
3. В lib создадим файл lib_file1.c
/* lib/lib_file1.c */ #include <stdio.h> #include "lib_header1.h" void receive_byte () { printf ("Hello, receive_byte\n"); }
4. В lib создадим файл lib_file2.c
/* lib/lib_file2.c */ #include <stdio.h> #include "lib_header1.h" void transmit_byte () { printf ("Bye, transmit_byte\n"); }
5. В lib создадим файл lib_header1.h
/* lib/lib_header1.h */ void receive_byte (void); void transmit_byte (void);
Для сборки статической или динамической библиотеки можно вручную написать Makefile, а лучше использовать autotools, которые сгенерируют её автоматически.
Для автоматического создания Makefile нужно всего лишь два файла шаблона - Makefile.am и configure.in. Причем первый пишется вручную, а второй генерируется автоматически и правится.
В корневой директории библиотеки (в директории test) создаем файл Makefile.am следующего содержания:
# Makefile.am ACLOCAL_AMFLAGS = -I m4 SUBDIRS = lib
Ключевое слово SUBDIRS означает, что исходный файлы для сборки находятся в данной директории.
Также нужно создать Makefile.am в директории lib следующего содержания:
#lib/Makefile.am lib_LTLIBRARIES = libhw.la libhw_la_SOURCES = lib_file1.c lib_file2.c lib_header1.h
Если нужно подключить дополнительную библиотеку, то следует добавить запись вида:
libhw_la_LIBADD = -lm
Всё этого достаточно.
configure.in создадим с помощью утилиты autoscan. Эта программа создает файл configure.scan, который и является прототипом configure.in.
Выполняем:
autoscan
Правим configure.scan и затем переименовывем его в configure.in :
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) AC_INIT([libhw], [1.0], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE AC_PROG_LIBTOOL AC_CONFIG_MACRO_DIR([m4]) # Checks for programs. AC_PROG_CXX AC_PROG_AWK AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_RANLIB # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile lib/Makefile]) AC_OUTPUT
ВСЁ! Терь выполняем следующую последовательность действий и Makefile готов.
aclocal - создает aclocal.m4.
libtoolize — стандартные средства для включения сервисов (libtool) для сборки библиотек.
autoconf - утилита создает скрипт configure в соответствии с макросами указанными в файле `configure.in'.
autoheader — создает заголовочный файл (config.h.in).
touch NEWS README AUTHORS ChangeLog (эти файлы нужны для automake)
automake --add-missing - программа создает файлы"Makefile.in", на основе файлов "Makefile.am".
configure — создает Makefile
make — собирает библиотеку