Fork me on GitHub

The WebDevil

Enjoy development

Сегодня попытался воспользоваться autoconf и automake для автоматической генерации Makefile для сборки проекта.
Исходники на C++, проект довольно старый.

Итак, вот как выглядит схема работы GNU build system:

И теперь маленький туториал по шагам.
Допустим, проект лежит в директории /project. Помещаем в папку /project/src.
Теперь в /project создаем файл Makefile.am со следующей начинкой:

SUBDIRS=src

Это сообщит где искать дополнительные make-файлы.
В директории /project/src создаем Makefile.am следующего содержания:

helloprgdir=../
helloprg_PROGRAMS=hello
hello_SOURCES=hello.c

Первая строка – куда копировать бинарники при make install.
Вторая – имя программы
Третья – исходники, которые будут компилироваться. Также все упомянутые тут файлы будут собраны при make dist. Но об этом советую почитать подробнее в доке.

Ок, теперь можно запустить в корне проекта команду

autoscan

Она создаст нужный нам файл – configure.scan. Переименовываем его в configure.ac и правим:

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

к примеру на

AC_INIT(HELLO WORLD, 0.1, bugs at example.com)

Также надо добавить директиву

AM_INIT_AUTOMAKE

чтобы утилиты создали Makefile.

Также советуют заменить AC_CONFIG_HEADER на AM_CONFIG_HEADER.

Теперь выполним

aclocal

Он создаст m4 скрипт для выполнения будущего configure.

autoheader

создаст необходимые заголоки для будущего configure.

Наконец, выполним

automake -ac

-a добавит отсутствующие файлы, -c скопирует их вместо создания симлинки.
А теперь смотрим какие файлы он не создал: NEWS, AUTHORS, ChangeLog, README. Для дальнейшей сборки надо их создать.

И теперь выполняем

autoconf

Если все прошло успешно – то теперь проект готов, можно делать ./configure && make. А кроме того make dist соберет аккуратный пакетик-архивчик со всеми исходниками и скриптами для сборки.

Ссылки:
autotoolset
The-GNU-Build-System
Tutorial

ЗЫ: я делал это впервые, потому замечаниям буду только рад.
ЗЫ2: задался вопросом – а как бы не описывать руками какие файлы собирать, а использовать некий хитрый макрос для того чтоб оно съело все исходники само?

One Response to “autotools”

  1. У GNU make есть такая штука как wildcard:
    CPPFILES = $(wildcard *.cc)

    gonzo