Алексей Махоткин

домашняя страница

Automake

Go to the first, previous, next, last section, table of contents.


Автоматическая де-ANSI-фикация

Хотя стандарты GNU позволяют использование ANSI C, это может привести к ограничению переносимости пакета на некоторые старые компиляторы (особенно SunOS).

Automake позволяет вам обойти проблему с такими машинами путем де-ANSI-фикации каждого исходного файла перед компиляцией.

Если в `Makefile.am’ переменная AUTOMAKE_OPTIONS (see section Изменение поведения Automake) содержит ключ ansi2knr, то в генерируемый файл `Makefile.in’ будет вставлен код для де-ANSI-фикации.

Это заставит считать каждый исходный текст на языке C соответствующим ANSI C. Если доступен компилятор, соответствующий ANSI C, то он будет использован. В противном случае для преобразования исходных файлов в стандарт K&R будет использована программа ansi2knr, а затем преобразованные файлы будут скомпилированы.

Программа ansi2knr совершенно бесхитростна. Она предполагает, что исходный текст будет отформатирован определенным способом; подробное описание находится на странице руководства по ansi2knr.

Поддержка де-ANSI-фикации требует наличия файлов `ansi2knr.c’ и `ansi2knr.1’ в том же пакете, где находятся и исходные тексты на ANSI C; эти файлы поставляются в комплекте Automake. Файл `configure.in’ должен также содержать вызов макроса AM_C_PROTOTYPES (see section Макросы Autoconf, поставляемые с Automake).

Automake также работает в тех случаях, когда файлы ansi2knr находятся в другом подкаталоге текущего пакета. Это делается добавлением в опцию ansi2knr относительного пути к соответствующему каталогу. Например, предположим, что исходные тексты на ANSI C располагаются в подкаталогах `src’ и `lib’. Файлы `ansi2knr.c’ и `ansi2knr.1’ находятся в подкаталоге `lib’. Вот что должно быть написано в `src/Makefile.am’:

AUTOMAKE_OPTIONS = ../lib/ansi2knr

Если никакой префикс не задан, то считается, что файлы находятся в текущем каталоге.

Файлы, перечисленные в переменной LIBOBJS и нуждающиеся в де-ANSI-фикации, не будут обрабатываться автоматически. Это происходит из-за того, что configure будет генерировать имена объектных файлов в виде `regex.o’, в то время как make будет искать `regex_.o’ (при выполнении де-ANSI-фикации). В конечном счете эта проблема может быть решена с помощью методов autoconf, но для этого вы должны поместить следующий код в ваш файл `configure.in’, как раз перед вызовом макроса AC_OUTPUT:

# This is necessary so that .o files in LIBOBJS are also built via
# the ANSI2KNR-filtering rules.
LIBOBJS=`echo $LIBOBJS|sed ‘s/.o /\$U.o /g;s/.o$/\$U.o/’`


Go to the first, previous, next, last section, table of contents.

Comments