Как собрать проект, используя
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 — собирает проект


