Хотя стандарты 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.