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