Как собрать проект, используя
configure, automake, autoconf и прочие «авто-утилиты»
Применение «авто-утилит» позволяет сделать проект архитектурно независимым и свести к минимуму процесс написания Makefile.
Пример маленького проекта, написанного на языке Си:
1. Создадим директорию для проекта test
2. В директории test создадим директорию src
3. В src создадим файл main.c
/* src/main.c */ #include "main.h" int main (void) { test (); return 0; }
4. В src создадим файл test.c
/* src/test.c */ #include "main.h" void test (void){ printf("i am test!\n"); }
5. В src создадим файл main.h
/* src/main.h */ #include <stdio.h> extern void test (void);
Для сборки такого проекта можно вручную написать Makefile, а лучше использовать автотулсы, которые сгенерируют его автоматически.
Для автоматического создания Makefile нужно всего лишь два файла-шаблона - Makefile.am и configure.in. Причем первый пишется вручную, а второй генерируется автоматически и правится.
В корневой директории проекта (в директории test) создаем файл Makefile.am следующего содержания:
## Makefile.am SUBDIRS = src
Ключевое слово SUBDIRS означает, что исходные файлы для сборки находятся в данной директории.
Также нужно создать Makefile.am в директории src следующего содержания:
## src/Makefile.am bin_PROGRAMS = hello hello_SOURCES = main.c main.h test.c
Ключевое слово bin_PROGRAMS определяет имя исполняемого файла, который будет получен в результате сборки.
Ключевое слово hello_SOURCES используется для перечисления имен файлов исходного кода, из которых будет создаваться файл «hello».
Если требуется подключить явным образом какую-либо библиотеку, то нужно добавить следующую строку:
hello_LDADD = -lpthread
Таким образом подключается библиотека lpthread.
Если требуется явным образом указать какой-то флаг, это делается так:
AM_LDFLAGS = -rdynamic
или
AM_LDFLAGS = -L. -Wl,-rpath,.
В последнем случае добавляется путь, где искать библиотеку. (точка означает в текущем каталоге).
Если требуется подключить какую-либо директорию с хедерами, то нужно добавить:
INCLUDES = -I/usr/src/linux-headers-2.6.32-23-generic/include/
Всё, этого достаточно.
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([hello], [1.0], [info@h-wrt.com]) AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT
Макрос AC_INIT. В качестве параметров передаются — имя программы, её версия, email.
Макрос AC_CONFIG_SRCDIR. В качестве параметра передаётся - путь к файлу, с которого начинается сборка.
Макрос AM_INIT_AUTOMAKE включает поддержку Automake
Макрос AC_PROG_CC проверяет наличие и работоспособности в системе Си компилятора.
Макрос AC_OUTPUT служит для указания Makefile, которые будут созданы в результате исполнения скрипта configure.
ВСЁ! Теперь выполняем следующую последовательность действий и Makefile готов.
aclocal - создает aclocal.m4.
autoconf - утилита создает скрипт configure в соответствии с макросами, указанными в файле `configure.in'.
autoheader — создает заголовочный файл (config.h.in).
touch NEWS README AUTHORS ChangeLog (эти файлы нужны для automake )
automake --add-missing - утилита создает файлы"Makefile.in", на основе файлов "Makefile.am".
configure — создает Makefile
make — собирает проект