@anchor{Existing Tests}
Эти макросы выполняют проверку отдельных возможностей системы, в которых пакет нуждается или которые он может использовать. Если вам необходимо протестировать возможность, которую не проверяет ни один из имеющихся макросов, то, скорее всего, вы сможете это сделать путем вызова примитивных макросов с соответствующими аргументами (see section Написание тестов).
Эти тесты сообщают пользователю, что именно они проверяют и каков
результат проверки. Результаты кэшируются для ускорения последующих
запусков configure
(see section Кэширование результатов).
Некоторые из этих макросов устанавливают выходные переменные. See section Подстановки в файлах Makefile, для того, чтобы узнать о том, как получить значения этих переменных. Фраза "определить name" ниже используется как сокращение, обозначающее "определить символ name препроцессора C в значение 1". See section Определение символов препроцессора С, для того, чтобы узнать о том, как получить определения этих символов в вашей программе.
@anchor{Alternative Programs}
Эти макросы проверяют наличие или поведение определенных программ. Они используются для выбора между несколькими различными программами и для решения того, что делать, когда нужная программа выбрана. Если для проверки наличия необходимой вам программы нет отдельного макроса, и вам не нужно выполнять проверку специальных возможностей этой программы, то можно использовать один из стандартных макросов проверки программ.
@anchor{Particular Programs}
Эти макросы выполняют проверку отдельных программ--- существуют ли они, а также, в некоторых случаях, проверку того, поддерживают ли эти программы определенные свойства.
YYTEXT_POINTER
, если yytext
имеет тип
`char *', а не `char []'. Также устанавливает значение
выходной переменной LEX_OUTPUT_ROOT
равным основе имени файла,
создаваемого лексическим генератором; обычно это значение равно
`lex.yy', но иногда используется что-то другое. Эти результаты
различаются в зависимости от того, используется ли lex
или
flex
.
mawk
, gawk
, nawk
и awk
, в таком
порядке и устанавливает выходную переменную AWK
, равную имени найденной
программы. Сначала пытается найти mawk
, который считается
самой быстрой реализацией.
CC
не
установлена, то проверить наличие gcc
и использовать
cc
, если gcc
не найден. Устанавливает выходную переменную
CC
, равную имени найденного компилятора.
Если используется компилятор GNU C, то значение переменной GCC
устанавливается в значение `yes', в противном случае оно остается
пустым. Если выходная переменная CFLAGS
еще не была установлена,
то установить ее равной `-g -O2' для компилятора GNU C (`-O2'
на системах, в которых GCC не понимает ключа `-g') или равной
`-g' для других компиляторов.
Если используемый компилятор C не создает исполняемых файлов, которые
могут запускаться в той системе, где исполняется configure
, то
переменной командного процессора cross_compiling
присваивается
значение `yes', в противном случае она получает значение
`no'. Другими словами, здесь проверяется, отличается ли тип системы, для
которой производится сборка, от системы, на которой производится сборка
(тип целевой системы не относится к этому тесту). Для получения
дополнительной информации о кросс-компиляции See section Ручная настройка.
NO_MINUS_C_MINUS_O
.
CPP
устанавливается равным имени
команды, которая запускает препроцессор C. Если `$CC -E' не
работает, то используется `/lib/cpp'. Переносимым решением является
запуск CPP
только для обработки файлов с расширением `.c'.
Если текущим языком является C (see section Выбор языка), то многие
специфические тесты косвенно используют значение переменной CPP
,
вызывая макросы AC_TRY_CPP
, AC_CHECK_HEADER
,
AC_EGREP_HEADER
или AC_EGREP_CPP
.
CXX
или CCC
(именно в
таком порядке); если одна из них установлена, то значение выходной переменной
CXX
устанавливается равным значению этой переменной. В противном
случае производится поиск компилятора C++, используя вероятные имена (c++
,
g++
, gcc
, CC
, cxx
и cc++
). Если ни
одна из этих проверок не прошла успешно, то в качестве последнего шанса
значение переменной CXX
устанавливается равным gcc
.
Если используется компилятор GNU C++, то переменная командного
процессора GXX
получает значение `yes', иначе ей
присваивается пустое значение. Если выходная переменная CXXFLAGS
еще не была установлена, то ей присваивается значение `-g -O2' для
компилятора GNU C++ (`-O2' на системах, где G++ не распознает ключ
`-g') или значение `-g' для других систем.
Если используемый компилятор C++ не создает исполняемых файлов, которые
могут запускаться в системе, где выполняется configure
, то
переменной командного процессора cross_compiling
присваивается
значение `yes', в противном случае устанавливается значение
`no'. Другими словами, здесь проверяется, отличается ли тип системы, для
которой производится сборка, от системы, на которой производится сборка
(тип целевой системы не относится к этому тесту). Для получения
дополнительной информации о кросс-компиляции See section Ручная настройка.
Значение выходной переменной CXXCPP
устанавливается равным имени
команды, которая запускает препроцессор C++. Если `$CXX -E' не
работает, то используется `/lib/cpp'. Переносимым решением является
запуск CXXCPP
только для обработки файлов с расширениями `.c',
`.C' или `.cc'.
Если текущим языком является C++ (see section Выбор языка), то многие
специфические тесты косвенно используют значение переменной
CXXCPP
, вызывая AC_TRY_CPP
, AC_CHECK_HEADER
,
AC_EGREP_HEADER
или AC_EGREP_CPP
.
F77
не установлена, то производится проверка наличия
программ g77
, f77
and f2c
, в описанном порядке. Имя
найденной программы присваивается выходной переменной F77
.
Если используется программа g77
(компилятор GNU Fortran 77), то
макрос AC_PROG_F77
установит переменную G77
равной
значению `yes', а в противном случае ей будет присвоено пустое
значение. Если выходная переменная FFLAGS
не была установлена в
среде, то для g77
данной переменной присваивается значение
`-g -02' (или `-O2' в тех случаях когда g77
не
принимает ключ `-g'). Иначе, для всех остальных компиляторов
Fortran 77, переменной FFLAGS
присваивается значение `-g'.
F77_NO_MINUS_C_MINUS_O
.
CC
в
том случае, если используемый компилятор GNU C и функции ioctl
неправильно работают без нее. Обычно это
случается, если в старой системе не были установлены исправленные
заголовочные файлы. Поскольку свежие версии компилятора GNU C при
установке исправляют заголовочные файлы, это становится менее
распространенной проблемой.
INSTALL
, равной полному пути к
совместимой с BSD программе install
, если она найдена в текущей
переменной PATH
. Иначе, переменная INSTALL
получает
значение `dir/install-sh -c', проверяя каталоги, указанные в
AC_CONFIG_AUX_DIR
(или каталоги по умолчанию) для определения
dir (see section Создание выходных файлов). Этот макрос также устанавливает переменные
INSTALL_PROGRAM
и INSTALL_SCRIPT
равными значениям
`${INSTALL}', а INSTALL_DATA
значение `${INSTALL}
-m 644'.
Этот макрос не замечает версии install
о которых известно, что
они не работают. Этот макрос также предпочитает использовать программу
на языке C вместо скриптов командного процессора. Вместо
`install-sh', он также может использовать `install.sh', но это
имя устарело, поскольку некоторые программы make
имеют правило,
которое создает файл `install' из этого файла, если нет файла
`Makefile'.
Копия `install-sh', которую вы можете использовать, поставляется с
Autoconf. Если вы используете AC_PROG_INSTALL
, то вы должны
включить в свой дистрибутив либо `install-sh', либо
`install.sh', иначе configure
выдаст ошибку, сообщающую о
том, что он не может найти эти файлы--- даже если система имеет
нормальную программу install
. Это мера безопасности, чтобы вы
случайно не забыли про этот файл, тем самым лишив пользователя
возможности установить ваш пакет в системе, в которой нет
BSD-совместимой
программы install
.
Если вам необходимо использовать вашу собственную программу установки
(поскольку она имеет возможности, отсутствующие в стандартных программах
install
), то нет никакой надобности в использовании макроса
AC_PROG_INSTALL
; просто поместите путь к вашей программе в ваши
файлы `Makefile.in'.
flex
, то выходная переменная LEX
получает значение `flex', а LEXLIB
-- значение `-lfl', в
случае, если библиотека располагается в стандартном месте. Иначе
переменная LEX
получает значение `lex', а LEXLIB
---
значение `-ll'.
LN_S
получает значение `ln -s', в
противном случае значение равно `ln'.
Если ссылка помещается в другой, отличный от текущего, каталог, то смысл
этой ссылки зависит от того, какая команда будет использована: `ln' или
`ln -s'. Чтобы безбоязненно создавать ссылки, используя
`$(LN_S)', либо определите, какая форма команды используется и
соответственно измените ее аргументы, либо всегда запускайте ln
в
том каталоге, где будет создаваться ссылка.
Другими словами, не делайте
$(LN_S) foo /x/bar
Вместо этого выполняйте
(cd /x && $(LN_S) foo bar)
ranlib
найдена, то выходная переменная
RANLIB
получает значение равное `ranlib', в противном случае
используется значение `:' (не делать ничего).
bison
, то выходная переменная YACC
получает значение `bison -y'. В противном случае, если найдена команда
byacc
, то переменная YACC
получит значение `byacc'. В
противном случае YACC
устанавливается в `yacc'.
@anchor{Generic Programs}
Эти макросы используются для обнаружения программ, для которых нет
отдельных макросов. Если вам необходимо проверить не только присутствие
программы, но и ее поведение, то вам необходимо написать свой
тест для данной программы (see section Написание тестов). По умолчанию эти
макросы используют переменную среды PATH
. Если вам необходимо
проверить наличие программы, которая может находится в каталогах
пользовательской переменной PATH
, то вы можете передать макросу
измененную переменную PATH
, вот как в этом случае:
AC_PATH_PROG(INETD, inetd, /usr/libexec/inetd,
$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc)
AC_CHECK_FILE
для каждого из файлов в списке
files. Дополнительно определяет переменную `HAVEfile'
для каждого из найденных файлов и устанавливает ее равной 1.
PATH
. Если эта программа найдена, то
переменная variable устанавливается равным значению
value-if-found, в противном случае равным значению
value-if-not-found (если оно задано). Никогда не использует
reject (имя файла с абсолютным путем), даже если такая программа была
найдена в путях поиска; в этом случае переменная variable
устанавливается, используя абсолютное имя найденной программы
prog-to-check-for, которая не является reject. Если
переменная variable уже установлена, то ничего не делается.
Вызывает макрос AC_SUBST
для variable.
PATH
каждой программы из списка через пробел
progs-to-check-for. Если программа найдена, то
переменная variable устанавливается в значение, равное имени
найденной программы. В противном случае продолжается проверка наличия
следующей программы. Если ни одна из программ не найдена, то переменная
variable получает значение value-if-not-found; если
value-if-not-found не указано, то значение variable не
изменяется. Вызывает макрос AC_SUBST
для variable.
AC_CHECK_PROG
, но сначала проверяет наличие
prog-to-check-for с префиксом типа системы, который определяется
макросом AC_CANONICAL_HOST
, за которым следует тире
(see section Получение канонического типа системы). Например, если пользователь запустит
`configure --host=i386-gnu', то этот вызов:
AC_CHECK_TOOL(RANLIB, ranlib, :)
установит переменную RANLIB
в значение `i386-gnu-ranlib',
если эта программа находится в каталогах, перечисленных в PATH
,
или в `ranlib', если эта программа находится в PATH
, или в
`:', если ни одна из программ не существует.
AC_CHECK_PROG
, но устанавливает variable
равной полному пути к найденной программе prog-to-check-for.
AC_CHECK_PROGS
, но если найдена любая из программ
progs-to-check-for, то переменная variable получает значение,
равное полному пути к найденной программе.
@anchor{Libraries}
Нижеописанные макросы проверяют наличие определенных библиотек C, C++ или Fortran 77.
action-if-found является списком команд командного процессора,
которые запускаются в случае, если процесс компоновки прошел удачно;
action-if-not-found является списком команд, которые запускаются,
если процесс компоновки потерпел неудачу. Если аргумент action-if-found
не указан, то действие по умолчанию добавит `-llibrary' в
переменную LIBS
и определит переменную
`HAVE_LIBlibrary' (все буквы заглавные).
Если при компоновке с library выдаются сообщения о ненайденных символах, которые могут быть найдены, компонуя программы с дополнительными библиотеками, то вы должны передать список этих библиотек через пробелы в аргументе other-libraries: `-lXt -lX11'. В противном случае этот макрос не сможет определить, что библиотека library присутствует, поскольку компоновка тестовой программы всегда будет аварийно завершаться с сообщениями о ненайденных символах.
AC_CHECK_LIB
с аргументом
function, равным main
. Вдобавок, library
может быть указана как `foo', `-lfoo' или `libfoo.a'. Во
всех этих случаях компилятору передается строка `-lfoo'. Однако
library не может быть переменной командного процессора; ее
значение должно быть символьным именем. Этот макрос считается
устаревшим.
AC_TRY_LINK_FUNC
сначала без указания библиотек, а затем для каждой из
библиотек, перечисленных в списке search-libs.
Если функция найдена, то выполняются команды action-if-found, в противном случае выполняются action-if-not-found.
Если при компоновке с library выдаются сообщения о ненайденных символах, которые могут быть найдены, компонуя программы с дополнительными библиотеками, то вы должны передать список этих библиотек через пробел, используя аргумент other-libraries: `-lXt -lX11'. В противном случае этот макрос не сможет определить, что библиотека library присутствует, поскольку компоновка тестовой программы всегда будет аварийно завершаться с сообщениями о ненайденных символах.
AC_TRY_LINK_FUNC
для каждой из
библиотек, перечисленных в списке search-libs. Макрос добавляет
`-llibrary' к содержимому переменной LIBS
для первой
библиотеки, которая содержит function и выполняет
action-if-found. В противном случае выполняется
action-if-not-found.
@anchor{Library Functions}
Следующие макросы проверяют отдельные функции библиотеки C. Если для функции, которая вам нужна, нет отдельного макроса, и вам не нужно проверять специальные возможности этой функции, то можно использовать один из общих макросов проверки функций.
@anchor{Particular Functions}
Эти макросы выполняют проверку отдельных функций: существуют ли они и, в отдельных случаях, как они работают при задании определенных аргументов.
alloca
. Макрос пробует получить
встроенную версию, проверяя наличие файла `alloca.h' или
предопределенных макросов препроцессора C __GNUC__
и
_AIX
. Если этот макрос находит `alloca.h', то определяется
переменная HAVE_ALLOCA_H
.
Если эти попытки оканчиваются неудачей, то макрос будет искать функцию в
стандартной библиотеке C. Если любой из этих методов закончится успешно,
то будет определена переменная HAVE_ALLOCA
. В противном случае
выходная переменная ALLOCA
получит значение `alloca.o' и
будет определена переменная C_ALLOCA
(так что программы смогут
периодически вызывать `alloca(0)' для сборки мусора). Эта
переменная отделена от LIBOBJS
, так что несколько программ смогут
использовать одно и то же значение ALLOCA
, без необходимости создания настоящей
библиотеки, если лишь некоторые из них используют код в
LIBOBJS
.
Эти макросы не пытаются получить alloca
из библиотеки System V
R3 `libPW' или из библиотеки System V R4 `libucb', поскольку
эти библиотеки содержат некоторые несовместимые функции, что может в
дальнейшем вызвать проблемы. Некоторые версии библиотек даже не содержат
alloca
или содержат версию с ошибками. Если вы все таки хотите
использовать alloca
из этих библиотек, то вместо компиляции файла
`alloca.c' используйте ar
для извлечения из них
`alloca.o'.
Для правильного объявления этой функции исходные тексты, использующие
alloca
, должны начинаться примерно с нижеизложенного кода. В некоторых
версиях AIX, объявление alloca
должно предшествовать всему, за
исключением комментариев и директив препроцессора. Директива
#pragma
специальным образом выровнена (перед ней стоит несколько
пробелов), чтобы старые не-ANSI компиляторы C игнорировали ее, а не
выдавали ошибку.
/* AIX требует, чтобы это было первым кодом в файле. */
#ifndef __GNUC__
# if HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifdef _AIX
#pragma alloca
# else
# ifndef alloca /* предопределено в cc +Olibcalls фирмы HP */
char *alloca ();
# endif
# endif
# endif
#endif
closedir
, не несет полезной
информации, то определяется CLOSEDIR_VOID
. В противном случае
тот, кто вызывает эту функцию, может проверить возвращаемое значение на
наличие ошибки.
fnmatch
доступна и работает (в отличие от имеющейся
в SunOS 5.4), то определяется переменная HAVE_FNMATCH
.
getloadavg
, то этот макрос определяет переменную
HAVE_GETLOADAVG
, и добавляет к LIBS
библиотеки,
необходимые для получения этой функции.
В противном случае макрос добавляет `getloadavg.o' к выходной
переменной LIBOBJS
и, возможно, определяет другие макросы
препроцессора C и выходные переменные:
SVR4
, DGUX
, UMAX
или UMAX4_3
на соответствующих системах.
NLIST_STRUCT
.
NLIST_NAME_UNION
.
LDAV_PRIVILEGED
,
то программы необходимо специальным образом устанавливать на эту систему, чтобы
getloadavg
работала, и этот макрос определяет
GETLOADAVG_PRIVILEGED
.
NEED_SETGID
. Ее значением
является `true', если требуется специальная установка, и `false'
в противном случае. Если NEED_SETGID
равен `true', то этот
макрос устанавливает KMEM_GROUP
в значение, равное названию группы,
которая должна владеть установленной программой.
getmntent
в библиотеках `sun', `seq'
и `gen' для Irix 4, PTX и Unixware, соответственно. Затем, если
функция getmntent
доступна, определяется переменная
HAVE_GETMNTENT
.
getpgrp
запускается без аргументов (версия POSIX.1), то
определяется GETPGRP_VOID
. В противном случае функция является
BSD-версией, которая принимает в качестве аргумента идентификатор процесса.
Этот макрос не выполняет проверку наличия getpgrp
; если вам
необходимо работать в такой ситуации, то сначала вызовите
AC_CHECK_FUNC
для getpgrp
.
memcmp
недоступна, или не работает с восьмибитными
данными (как функция в SunOS 4.1.3), то `memcmp.o' добавляется к
выходной переменной LIBOBJS
.
mmap
существует и работает правильно, то
определяется переменная HAVE_MMAP
. Проверяется только
фиксированное приватное отображение уже отображенной памяти.
select
, и определяет эти типы в переменных
SELECT_TYPE_ARG1
, SELECT_TYPE_ARG234
и
SELECT_TYPE_ARG5
. Значением по умолчанию для
SELECT_TYPE_ARG1
является `int', для
SELECT_TYPE_ARG234
типом по умолчанию является `int *' и для
SELECT_TYPE_ARG5
типом по умолчанию является `struct timeval
*'.
setpgrp
запускается без аргументов (версия POSIX.1), то
определяется SETPGRP_VOID
. В противном случае, функция является
BSD-версией, которая принимает в качестве аргумента идентификатор процесса.
Этот макрос не выполняет проверку наличия setpgrp
; если вам
необходимо работать в такой ситуации, то сначала вызовите
AC_CHECK_FUNC
для setpgrp
.
setvbuf
принимает тип буферизации как второй аргумент, а
указатель на буфер как третий аргумент, а не наоборот, то
определяется переменная SETVBUF_REVERSED
. Это справедливо для
System V до выпуска 3.
strcoll
существует и работает правильно, то
определяется переменная HAVE_STRCOLL
. Этот макрос выполняет
больше проверок, чем просто вызов `AC_CHECK_FUNCS(strcoll)',
потому что некоторые системы имеют неправильные определения
strcoll
, которыми не следует пользоваться.
strftime
в библиотеке `intl', для SCO UNIX.
Затем, если strftime
доступна, определяется переменная
HAVE_STRFTIME
.
HAVE_UTIME_NULL
.
HAVE_VFORK_H
. Если работающая версия vfork
не найдена, то
определить vfork
как fork
. Этот макрос проверяет несколько
известных ошибок в реализации vfork
и если найдена одна из таких
реализаций, то считается, что система не имеет работающей версии
vfork
. Макрос не считает, ошибкой реализации, если
при вызове потомком функции signal
изменяются обработчики
сигналов родителя, поскольку потомки редко изменяют обработчики
сигналов родительского процесса.
vprintf
, то определяется переменная
HAVE_VPRINTF
. В противном случае, если найдена функция
_doprnt
, то определяется переменная HAVE_DOPRNT
. (Если
функция vprintf
доступна, то вы можете считать, что
функции vfprintf
и vsprintf
тоже доступны).
wait3
найдена, и заполняет содержимое своего
третьего аргумента (`struct rusage *'), чего не делает HP-UX, то
определяется переменная HAVE_WAIT3
.
@anchor{Generic Functions}
Эти макросы используются для нахождения функций, которые не имеют
специальных макросов проверки. Если функции могут находиться в других
библиотеках, а не в стандартной библиотеке C, то сначала вызовите макрос
AC_CHECK_LIB
для проверки наличия нужных библиотек. Если вам
нужно не только проверить, существует ли функция, но и уточнить ее
поведение, то вам придется написать свой собственный тест для этой
функции (see section Написание тестов).
AC_CHECK_FUNCS
. Этот макрос проверяет
компоновку с библиотекой C, даже если был вызван макрос
AC_LANG_CPLUSPLUS
, поскольку C++ является более
стандартизованным, чем C. (see section Выбор языка, для дополнительной
информации о выборе языка, для которого проводятся проверки).
HAVE_function
(все буквы заглавные). Если задан аргумент
action-if-found, то выполняется дополнительный код командного
процессора, если одна из функций найдена. Вы можете задать значение
`break' для прекращения цикла при нахождении первой функции. Если
задан аргумент action-if-not-found, то эти команды выполняются,
когда одна из функций не найдена.
AC_CHECK_FUNCS
, используя код
action-if-not-found, который добавляет `function.o' к
выходной переменной LIBOBJS
. Вы можете объявить функцию, для
которой будет использована ваша замена, поместив ее прототип
между директивами `#ifndef HAVE_function'. Если система имеет
нужную функцию, то эта функция, вероятно, будет объявлена в заголовочном
файле, который вы должны включить в свою программу, так что вы не должны
повторно объявлять ее, во избежание конфликта объявлений.
@anchor{Header Files}
Следующие макросы проверяют наличие определенных заголовочных файлов языка C. Если для нужного вам заголовочного файла нет специального макроса, и при этом вам не нужно проверять специальные особенности этого файла, то можно использовать один из стандартных макросов проверки заголовочных файлов.
@anchor{Particular Headers}
Эти макросы выполняют проверку отдельных заголовочных файлов--- существуют ли они и, в некоторых случаях, объявлены ли в них какие-либо символы.
SYS_SIGLIST_DECLARED
, если переменная
sys_siglist
объявлена в системном заголовочном файле--- либо
в `signal.h', либо в `unistd.h'.
AC_HEADER_DIRENT
и
AC_FUNC_CLOSEDIR_VOID
, но определяет немного другой набор макросов
препроцессора C, для указания того, какой заголовочный файл найден. Этот
макрос и имена, которые он определяет, считаются устаревшими. Макрос
определяет следующие имена:
DIRENT
SYSNDIR
SYSDIR
NDIR
Вдобавок, если функция closedir
не возвращает информативного
значения, то определяется переменная VOID_CLOSEDIR
.
Проверка следующих заголовочных файлов, и для первого файла, который найден и определяет `DIR', определить нижеследующие макросы препроцессора C:
HAVE_DIRENT_H
HAVE_SYS_NDIR_H
HAVE_SYS_DIR_H
HAVE_NDIR_H
В исходном тексте объявления библиотеки каталогов должны выглядеть
примерно так:
#if HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
# if HAVE_NDIR_H
# include <ndir.h>
# endif
#endif
Используя нижеследующие объявления, программа должна объявить переменные с
типом struct dirent
, а не struct direct
, а доступ к полю
длины имени каталога она должна получать путем передачи указателя на
struct dirent
макросу NAMLEN
.
Этот макрос также проверяет наличие библиотек `dir' и `x' в SCO Xenix.
major
, minor
и
makedev
, но это делается в `sys/mkdev.h', то определяется
переменная MAJOR_IN_MKDEV
; в противном случае, если эти функции
определяются в `sys/sysmacros.h', то определяется переменная
MAJOR_IN_SYSMACROS
.
STDC_HEADERS
, если система имеет заголовочные файлы
ANSI C. Это макрос проверяет наличие `stdlib.h', `stdarg.h',
`string.h' и `float.h'; если система имеет эти файлы, то,
скорее всего, имеются и остальные заголовочные файлы ANSI C. Этот макрос
также проверяет, что `string.h' объявляет memchr
(и поэтому,
скорее всего, еще и другие функции mem
), объявляется ли в
`stdlib.h' функция free
(и, по видимому, malloc
и
другие относящиеся к ним функции), и будут ли макросы из `ctype.h'
работать с символами с установленным старшим битом, как этого требует
ANSI C.
Используйте STDC_HEADERS
вместо of __STDC__
для
определения, имеются ли в системе совместимые с ANSI заголовочные файлы
(и, вероятно, функции библиотеки C), поскольку многие системы, имеющие GCC,
не имеют заголовочные файлы ANSI C.
На системах без заголовочных файлов ANSI C существует так много
вариантов, что, вероятно, легче объявить используемые вами функции, чем
точно определять, какой из заголовочные файлов определяет эти
функции. Некоторые системы содержат смесь функций ANSI и BSD; некоторые
из них по большей части совместимы с ANSI, но не имеют
`memmove'; некоторое определяют функции BSD как макросы в файлах
`string.h' или `strings.h'; некоторые из них имеют только
функции BSD, но с `string.h'; некоторые объявляют функции работы с
памятью в `memory.h', некоторые в `string.h'; и т. п.
Скорее всего,
достаточно проверить наличие одной функции работы со строками и одной
функции работы с памятью; если библиотека имеет ANSI-версии этих
функций, то, скорее всего, она имеет и большинство других функций. Вы
должны поместить следующий код в `configure.in':
AC_HEADER_STDC
AC_CHECK_FUNCS(strchr memcpy)
а затем, в вашем коде вы можете поместить следующие строки:
#if STDC_HEADERS
# include <string.h>
#else
# ifndef HAVE_STRCHR
# define strchr index
# define strrchr rindex
# endif
char *strchr (), *strrchr ();
# ifndef HAVE_MEMCPY
# define memcpy(d, s, n) bcopy ((s), (d), (n))
# define memmove(d, s, n) bcopy ((s), (d), (n))
# endif
#endif
Если вы используете функции, которые не имеют эквивалентов в BSD, такие
как memchr
, memset
strtok
или strspn
, то
просто макросов будет недостаточно; вы должны предоставить реализацию
каждой из функций. Простой способ подключить ваши реализации только
если они действительно нужны (потому что функции из системной библиотеки
могут быть вручную оптимизированы) --- это, например, поместить
функцию memchr
в файл `memchr.c', и использовать макрос
`AC_REPLACE_FUNCS(memchr)'.
HAVE_SYS_WAIT_H
. Несовместимость может возникнуть,
если файла `sys/wait.h' не существует, или для сохранения значения
статуса он использует старую BSD-версию union wait
вместо
int
. Если `sys/wait.h' не является совместимым с POSIX.1, то
вместо его включения определяется макрос POSIX.1 с его обычной
реализацией. Вот пример:
#include <sys/types.h>
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
#endif
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
#endif
#ifndef WIFEXITED
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
#endif
NEED_MEMORY_H
, если memcpy
, memcmp
, и
т. п. не объявлены в файле `string.h' и существует файл
`memory.h'. Этот макрос является устаревшим; вместо него
используйте вызов AC_CHECK_HEADERS(memory.h)
. Смотрите пример для
AC_HEADER_STDC
.
HAVE_UNISTD_H
, если в системе имеется файл
`unistd.h'. Этот макрос является устаревшим; вместо него
используйте вызов `AC_CHECK_HEADERS(unistd.h)'.
Для проверки того, что система поддерживает POSIX.1, можно использовать
следующий код:
#if HAVE_UNISTD_H
# include <sys/types.h>
# include <unistd.h>
#endif
#ifdef _POSIX_VERSION
/* Код для систем POSIX.1 */
#endif
_POSIX_VERSION
определяется, когда `unistd.h' подключен в
системах, совместимых с POSIX.1. Если файла `unistd.h' не существует,
то, скорее всего, эта система не относится к POSIX.1. Однако некоторые
не-POSIX.1 системы имеют файл `unistd.h'.
Определяет USG
, если система не имеет файла `strings.h',
rindex
, bzero
и т. п. Это означает, что система имеет
`string.h', strrchr
, memset
и т. п.
Символ USG
является устаревшим. Вместо этого макроса смотрите
пример для AC_HEADER_STDC
.
@anchor{Generic Headers}
Эти макросы используются для нахождения системных заголовочных файлов, для которых не существует отдельного теста. Если вам надо проверить не только наличие заголовочного файла, но и его содержимое, то придется написать для этого собственный тест (see section Написание тестов).
AC_CHECK_HEADERS
.
HAVE_header-file
(все буквы заглавные). Если
задан аргумент action-if-found, то выполняется дополнительный код
командного процессора в случае, когда файл найден. Вы можете задать
аргумент `break' для прекращения итераций, когда найден первый
файл. Если задан аргумент action-if-not-found, то он выполняется,
когда заголовочный файл не найден.
@anchor{Structures}
Следующие макросы проверяют наличие определенных структур или полей
структур. Для проверки структур, не перечисленных в этом разделе,
используйте макрос AC_EGREP_CPP
(see section Исследование деклараций)
или AC_TRY_COMPILE
(see section Проверка синтаксиса).
S_ISDIR
, S_ISREG
и т. п., определенные в
`sys/stat.h', работают неправильно (возвращая неверные
положительные результаты), то определяется переменная
STAT_MACROS_BROKEN
. Это происходит на системах Tektronix UTekV,
Amdahl UTS и Motorola System V/88.
TIME_WITH_SYS_TIME
. В некоторых старых
системах `sys/time.h' подключает `time.h', но `time.h'
не защищен от многократного подключения, так что программы не должны
явно подключать оба файла. Этот макрос полезен для программ, которые,
например, используют структуры struct timeval
или struct
timezone
, вместе с struct tm
. Этот макрос лучше всего
использовать
вместе с HAVE_SYS_TIME_H
, который может быть проверен с помощью
AC_CHECK_HEADERS(sys/time.h)
.
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
struct stat
содержит поле st_blksize
, то определяется
переменная HAVE_ST_BLKSIZE
.
struct stat
содержит поле st_blocks
, то определяется
переменная HAVE_ST_BLOCKS
. В противном случае, `fileblocks.o'
добавляется к выходной переменной LIBOBJS
.
struct stat
содержит поле st_rdev
, то определяется
переменная HAVE_ST_RDEV
.
struct tm
, то определяется
символ TM_IN_SYS_TIME
, что означает, что `sys/time.h'
следовало бы определить struct tm
.
struct tm
имеет поле tm_zone
, то определяется переменная
HAVE_TM_ZONE
. В противном случае, если найден внешний массив
tzname
, то определяется переменная HAVE_TZNAME
.
@anchor{Typedefs}
Следующие макросы проверяют определения типов (typedef) языка C. Если для нужного вам определения типа нет специального макроса, и вам не нужно выполнять проверку специальных возможностей, то можно использовать общие макросы проверки объявлений типов.
@anchor{Particular Typedefs}
Эти макросы проверяют конкретные объявления типов C в файлах `sys/types.h' и `stdlib.h' (если он существует).
GETGROUPS_T
равным gid_t
или int
, в
зависимости от того, что именно является базовым типом массива-аргумента
функции getgroups
.
mode_t
не определен, то определить тип mode_t
равным
int
.
off_t
не определен, то определить off_t
равным
long
.
pid_t
не определен, то определить pid_t
равным
int
.
signal
как возвращающий указатель
на функцию, возвращающую void
, то переменная RETSIGTYPE
становится равной void
; в противном случае она определяется с
типом int
.
Определить обработчики сигналов как возвращающие тип RETSIGTYPE
:
RETSIGTYPE
hup_handler ()
{
...
}
size_t
не определен, то определить size_t
как
unsigned
.
uid_t
не определен, то определить uid_t
равным
int
и gid_t
равным int
.
@anchor{Generic Typedefs}
Эти макросы используются для проверки определений типов (typedef), которые не были описаны в разделе конкретных макросов проверок.
@anchor{C Compiler Characteristics}
Следующие макросы выполняют проверку свойств компилятора C или
архитектуры машины. Для проверки характеристик, не перечисленных в этом
разделе, используйте макросы AC_TRY_COMPILE
(see section Проверка синтаксиса) или AC_TRY_RUN
(see section Проверка поведения во время выполнения).
WORDS_BIGENDIAN
.
const
,
то макросу const
присваивается пустое значение. Некоторые
компиляторы C не определяют константу __STDC__
, но поддерживают
const
; некоторые компиляторы, определяющие
__STDC__
, не полностью поддерживают const
. Программы могут
просто использовать const
, как будто любой компилятор C
поддерживает его; для тех компиляторов, которые не имеют такой поддержки,
`Makefile' или заголовочный файл настройки определят это слово как
имеющее пустое значение.
inline
, то ничего не
делается. В противном случае, inline
определяется равным
__inline__
или __inline
, если компилятор поддерживает один
из этих вариантов, иначе inline
определяется равным пустому
значению.
char
является беззнаковым, то определяется переменная
__CHAR_UNSIGNED__
(если компилятор C еще не определил ее).
long double
, то определяется
переменная HAVE_LONG_DOUBLE
. Некоторые компиляторы C, которые не
определяют __STDC__
, поддерживают long double
; а
некоторые компиляторы, определяющие __STDC__
, не поддерживают тип
long double
.
HAVE_STRINGIZE
. Строковым (stringinzing)оператором является `#'
и он используется в макросах, например:
#define x(y) #y
SIZEOF_uctype
равным числу байтов во встроенном
типе C (или C++) type, например, `int' или `char *'.
Если `type' неизвестен компилятору, то переменная получает
значение 0.
uctype является type, со строчными буквами,
преобразованными в прописные, пробелы преобразуются в знаки
подчеркивания, и знаки звездочка (*
) заменяются на `P'. Если
производится кросс-компиляция, то используется значение cross-size
(если оно задано), в противном случае configure
прекращает работу
с выдачей сообщения об ошибке.
Например, вызов
AC_CHECK_SIZEOF(int *)
определяет SIZEOF_INT_P
равным 8 на системах DEC Alpha AXP.
int
имеет размер 16 бит, то определяется переменная
INT_16_BITS
. Этот макрос является устаревшим; вместо него лучше
использовать общий макрос `AC_CHECK_SIZEOF(int)'.
long int
имеет размер 64 бита, то определяется
переменная LONG_64_BITS
. Этот макрос является устаревшим; вместо
него лучше использовать вызов `AC_CHECK_SIZEOF(long)'.
@anchor{Fortran 77 Compiler Characteristics}
Следующие макросы используются для проверки характеристик компилятора
Fortran 77. Для проверки характеристик, не перечисленных в этом разделе,
используйте макросы AC_TRY_COMPILE
(see section Проверка синтаксиса)
или AC_TRY_RUN
(see section Проверка поведения во время выполнения), убедившись, что перед
этим вы установили Fortran 77 текущим языком.
AC_LANG_FORTRAN77
(see section Выбор языка).
FLIBS
устанавливается равной этим флагам.
Этот макрос предназначен для использования в ситуациях, когда необходимо смешать исходный код, например на C++ и Fortran 77, в одну программу или разделяемую библиотеку (see section `Смешивание кода Fortran 77 с кодом на C и C++' in GNU Automake).
Например, если объектные файлы от компиляторов C++ и Fortran 77 должны быть скомпонованы вместе, то для компоновки должен использоваться компилятор/компоновщик C++, поскольку специфические для C++ вещи, такие как вызовы глобальных конструкторов, подстановке шаблонов, разрешении обработки исключений, и т. п., нуждаются в специальных действиях во время компоновки.
Однако в этих случаях должны быть подключены и внутренние библиотеки
Fortran 77, а также библиотеки времени исполнения, а
компилятор/компоновщик C++ просто не знает, какие библиотеки Fortran 77
должны быть добавлены. Для определения библиотек Fortran 77 и был создан
макрос AC_F77_LIBRARY_LDFLAGS
.
@anchor{System Services}
Следующие макросы проверяют наличие сервисов операционной системы или ее возможности.
CYGWIN
получает значение `yes'. В противном случае
переменная CYGWIN
получает пустое значение.
EXEEXT
, основанную на
расширении файла, выдаваемого компилятором, после исключения файлов с
расширениями .c, .o и .obj. Для Unix обычным значением является пустая
строка, а для Win32 --- `.exe' и `.EXE'.
OBJEXT
, основанную на выводе
компилятора, после исключения файлов с расширением .c. Обычно имеет
значение `.o' в Unix, и `.obj' на системах Win32.
MINGW32
получает значение `yes'. В противном
случае переменная MINGW32
получает пустое значение.
xmkmf
для
простого `Imakefile' и разбора полученного файла
`Makefile'. Если произошел сбой (например, если xmkmf
отсутствует), то производится поиск в нескольких каталогах, где часто
располагаются эти файлы. Если один из этих способов был удачен, то
переменные командного процессора x_includes
и x_libraries
устанавливаются равными найденным каталогам (в том случае, если эти
каталоги не входят в пути, в которых компилятор по умолчанию производит
поиск).
Если оба этих метода дают сбой, или пользователь задал ключ командной
строки `--without-x', то переменная командного процессора no_x
получает значение `yes'; в противном случае она получает пустое
значение.
AC_PATH_X
. Она добавляет к выходной переменной
X_CFLAGS
ключи компилятора C, которые необходимы X, а также флаги
X для компоновщика к переменной X_LIBS
. Если X не доступна, то
добавляется `-DX_DISPLAY_MISSING' к X_CFLAGS
.
Этот макрос также выполняет проверки специальных библиотек, в которых
нуждаются некоторые системы для того, чтобы скомпилировать программу
для X.
Он добавляет все, что необходимо для таких систем, к выходной
переменной X_EXTRA_LIBS
. Он также проверяет наличие специальных
библиотек X11R6, которые необходимо скомпоновать до использования
`-lX11', и добавляет найденные библиотеки к выходной переменной
X_PRE_LIBS
.
configure.in
может проверить переменную interpval
; она будет
равна `yes', если система поддерживает `#!', и `no' в
противном случае.
HAVE_LONG_FILE_NAMES
.
HAVE_RESTARTABLE_SYSCALLS
.
@anchor{UNIX Variants}
Следующие макросы проверяют наличие конкретных операционных систем, что может потребовать специальной обработки в программах из-за исключительных странностей в их заголовочных файлах или библиотеках. Эти макросы являются бородавками (наростами); они будут заменены на более систематизированные, разбитые на предоставляемые ими функции или устанавливаемые ими параметры среды.
_ALL_SOURCE
. Позволяет использовать
некоторые функции BSD. Должен вызываться до макросов,
запускающих компилятор C.
LIBS
. Этот макрос является устаревшим; используйте
вместо него AC_FUNC_GETMNTENT
.
LIBS
. Этот макрос является устаревшим. Если вы
используете его для проверки наличия getmntent
, то вместо него
используйте макрос AC_FUNC_GETMNTENT
. Если вы использовали его
для NIS-версий функций работы с паролями и группами, то вместо него
используйте `AC_CHECK_LIB(sun, getpwnam)'.
_POSIX_SOURCE
и
добавляет `-posix' (для компилятора GNU C) или `-Xp' (для
других компиляторов C) к выходной переменной CC
. Это позволяет
использовать возможности POSIX. Макрос должен быть вызван после вызова
AC_PROG_CC
и до вызова любых других макросов, которые запускают
компилятор C.
_MINIX
и _POSIX_SOURCE
и
определяет _POSIX_1_SOURCE
со значением 2. Это позволяет
использовать возможности POSIX. Должен вызываться до вызова других
макросов, запускающих компилятор C.
LIBS
.
Этот макрос является устаревшим; вместо него используйте макрос
AC_FUNC_STRFTIME
.
LIBS
. Также,
если используется `dirent.h', то к переменной LIBS
добавляется
`-ldir'. Этот макрос является устаревшим; вместо него используйте
AC_HEADER_DIRENT
.
Go to the first, previous, next, last section, table of contents.