| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы выполняют проверку отдельных возможностей системы, в которых пакет нуждается или которые он может использовать. Если вам необходимо протестировать возможность, не проверяемую ни одним из имеющихся макросов, то, скорее всего, вы сможете это сделать путем вызова примитивных макросов с соответствующими аргументами (see section 5. Написание тестов).
Эти тесты сообщают пользователю, что именно они проверяют, и каков
результат проверки. Результаты кэшируются для ускорения последующих
запусков configure
(see section 6.3 Кэширование результатов).
Некоторые из этих макросов устанавливают выходные переменные. See section 3.3 Подстановки в файлах Makefile, для того, чтобы узнать о том, как получить значения этих переменных. Фраза "определить name" ниже используется как сокращение, обозначающее "определить символ name препроцессора C в значение 1". See section 6.1 Определение символов препроцессора С, для того, чтобы узнать о том, как получить определения этих символов в вашей программе.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы проверяют наличие или поведение определенных программ. Они используются для выбора между несколькими различными программами и для решения того, что делать, когда нужная программа выбрана. Если для проверки наличия необходимой вам программы нет отдельного макроса, и вам не нужно выполнять проверку специальных возможностей этой программы, то можно использовать один из стандартных макросов проверки программ.
программ. * Общие программы:: Как найти остальные программы.
4.1.1 Проверка отдельных программ
4.1.2 Общие программы и проверки файлов
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы выполняют проверку отдельных программ--- существуют ли они, а также, в некоторых случаях, проверку того, поддерживают ли эти программы определенные свойства.
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 8. Ручная настройка.
NO_MINUS_C_MINUS_O.
CPP устанавливается равным имени
команды, которая запускает препроцессор C. Если `$CC -E' не
работает, то используется `/lib/cpp'. Переносимым решением является
запуск CPP только для обработки файлов с расширением `.c'.
Если текущим языком является C (see section 5.8 Выбор языка), то многие
специфические тесты косвенно используют значение переменной 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 8. Ручная настройка.
Значение выходной переменной CXXCPP устанавливается равным имени
команды, которая запускает препроцессор C++. Если `$CXX -E' не
работает, то используется `/lib/cpp'. Переносимым решением является
запуск CXXCPP только для обработки файлов с расширениями `.c',
`.C' или `.cc'.
Если текущим языком является C++ (see section 5.8 Выбор языка), то многие
специфические тесты косвенно используют значение переменной
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 3.2 Создание выходных файлов). Этот макрос также устанавливает переменные
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'.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы используются для обнаружения программ, для которых нет
отдельных макросов. Если вам необходимо проверить не только присутствие
программы, но и ее поведение, то вам необходимо написать свой тест для
данной программы (see section 5. Написание тестов). По умолчанию эти макросы
используют переменную среды 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 8.2 Получение канонического типа системы). Например, если пользователь запустит
`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 получает значение,
равное полному пути к найденной программе.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Нижеописанные макросы проверяют наличие определенных библиотек 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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы проверяют отдельные функции библиотеки C. Если для функции, которая вам нужна, нет отдельного макроса, и вам не нужно проверять специальные возможности этой функции, то можно использовать один из общих макросов проверки функций.
4.3.1 Проверка отдельных функций 4.3.2 Проверка базовых функций
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы выполняют проверку отдельных функций: существуют ли они и, в отдельных случаях, как они работают при задании определенных аргументов.
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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
AC_CHECK_LIB для проверки наличия нужных библиотек. Если вам
нужно не только проверить, существует ли функция, но и уточнить ее
поведение, то вам придется написать свой собственный тест для этой
функции (see section 5. Написание тестов).
AC_CHECK_FUNCS. Этот макрос
проверяет компоновку с библиотекой C, даже если был вызван макрос
AC_LANG_CPLUSPLUS, поскольку C++ является более
стандартизованным, чем C. (see section 5.8 Выбор языка для дополнительной
информации о выборе языка, для которого проводятся проверки).
HAVE_function (все буквы заглавные). Если задан аргумент
action-if-found, то выполняется дополнительный код командного
процессора при условии, что одна из функций найдена. Вы можете задать
значение `break' для прекращения цикла при нахождении первой
функции. Если задан аргумент action-if-not-found, то эти команды
выполняются, когда одна из функций не найдена.
AC_CHECK_FUNCS с
использованием кода action-if-not-found, который добавляет
`function.o' к выходной переменной LIBOBJS. Вы можете
объявить функцию, для которой будет использована ваша замена, поместив
ее прототип между директивами `#ifndef HAVE_function'. Если
система имеет нужную функцию, то эта функция, вероятно, будет объявлена
в заголовочном файле, который должен быть включен в вашу программу,
так что вы не должны повторно объявлять ее, во избежание конфликта
объявлений.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы проверяют наличие определенных заголовочных файлов языка C. Если для нужного вам заголовочного файла нет специального макроса, и при этом вам не нужно проверять специальные особенности этого файла, то можно использовать один из стандартных макросов проверки заголовочных файлов.
4.4.1 Проверка отдельных заголовочных файлов 4.4.2 Базовые проверки заголовочных файлов
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы выполняют проверку отдельных заголовочных файлов--- существуют ли они и, в некоторых случаях, объявлены ли в них какие-либо символы.
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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы используются для нахождения системных заголовочных файлов, для которых не существует отдельного теста. Если вам надо проверить не только наличие заголовочного файла, но и его содержимое, то придется написать для этого собственный тест. (see section 5. Написание тестов).
AC_CHECK_HEADERS.
HAVE_header-file (все буквы заглавные). Если задан аргумент
action-if-found, то выполняется дополнительный код командного
процессора в случае, когда файл найден. Вы можете задать аргумент
`break' для прекращения итераций, когда найден первый файл. Если
задан аргумент action-if-not-found, то он выполняется, когда
заголовочный файл не найден.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы проверяют наличие определенных структур или полей
структур. Для проверки структур, не перечисленных в этом разделе,
используйте макрос AC_EGREP_CPP (see section 5.1 Исследование деклараций)
или AC_TRY_COMPILE (see section 5.2 Проверка синтаксиса).
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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы проверяют определения типов (typedef) языка C. Если для нужного вам определения типа нет специального макроса, и вам не нужно выполнять проверку специальных возможностей, то можно использовать общие макросы проверки объявлений типов.
4.6.1 Проверка отдельных объявлений типов 4.6.2 Базовые проверки объявлений типов
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы проверяют конкретные объявления типов 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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти макросы используются для проверки определений типов (typedef), которые не были описаны в разделе конкретных макросов проверок.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы выполняют проверку свойств компилятора C или
архитектуры машины. Для проверки характеристик, не перечисленных в этом
разделе, используйте макросы AC_TRY_COMPILE (see section 5.2 Проверка синтаксиса) или AC_TRY_RUN (see section 5.4 Проверка поведения во время выполнения).
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)'.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы используются для проверки характеристик компилятора
Fortran 77. Для проверки характеристик, не перечисленных в этом
разделе, используйте макросы AC_TRY_COMPILE (see section 5.2 Проверка синтаксиса) или AC_TRY_RUN (see section 5.4 Проверка поведения во время выполнения),
убедившись, что перед этим вы установили Fortran 77 текущим языком.
AC_LANG_FORTRAN77 (see section 5.8 Выбор языка).
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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы проверяют наличие сервисов операционной системы или ее возможности.
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.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Следующие макросы проверяют наличие конкретных операционных систем, что может потребовать специальной обработки в программах из-за исключительных странностей в их заголовочных файлах или библиотеках. Эти макросы являются бородавками (наростами); они будут заменены на более систематизированные, разбитые на предоставляемые ими функции или устанавливаемые ими параметры среды.
_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.
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |