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

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

Autoconf

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


Проверка отдельных заголовочных файлов

@anchor{Particular Headers}

Эти макросы выполняют проверку отдельных заголовочных файлов— существуют ли они и, в некоторых случаях, объявлены ли в них какие-либо символы.

Macro: AC_DECL_SYS_SIGLIST
Определяет переменную SYS_SIGLIST_DECLARED, если переменная sys_siglist объявлена в системном заголовочном файле— либо в `signal.h’, либо в `unistd.h’.

Macro: AC_DIR_HEADER
Подобен вызову макросов AC_HEADER_DIRENT и AC_FUNC_CLOSEDIR_VOID, но определяет немного другой набор макросов препроцессора C, для указания того, какой заголовочный файл найден. Этот макрос и имена, которые он определяет, считаются устаревшими. Макрос определяет следующие имена:
`dirent.h’
DIRENT
`sys/ndir.h’
SYSNDIR
`sys/dir.h’
SYSDIR
`ndir.h’
NDIR

Вдобавок, если функция closedir не возвращает информативного значения, то определяется переменная VOID_CLOSEDIR.

Macro: AC_HEADER_DIRENT

Проверка следующих заголовочных файлов, и для первого файла, который найден и определяет `DIR’, определить нижеследующие макросы препроцессора C:

`dirent.h’
HAVE_DIRENT_H
`sys/ndir.h’
HAVE_SYS_NDIR_H
`sys/dir.h’
HAVE_SYS_DIR_H
`ndir.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.

Macro: AC_HEADER_MAJOR
Если `sys/types.h’ не определяет major, minor и makedev, но это делается в `sys/mkdev.h’, то определяется переменная MAJOR_IN_MKDEV; в противном случае, если эти функции определяются в `sys/sysmacros.h’, то определяется переменная MAJOR_IN_SYSMACROS.

Macro: AC_HEADER_STDC
Определяет 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)’.

Macro: AC_HEADER_SYS_WAIT
Если `sys/wait.h’ существует и совместим с POSIX.1, то определяется переменная 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

Macro: AC_MEMORY_H
Определяет NEED_MEMORY_H, если memcpy, memcmp, и т. п. не объявлены в файле `string.h’ и существует файл `memory.h’. Этот макрос является устаревшим; вместо него используйте вызов AC_CHECK_HEADERS(memory.h). Смотрите пример для AC_HEADER_STDC.

Macro: AC_UNISTD_H
Определяет переменную 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’.

Macro: AC_USG

Определяет USG, если система не имеет файла `strings.h’, rindex, bzero и т. п. Это означает, что система имеет `string.h’, strrchr, memset и т. п.

Символ USG является устаревшим. Вместо этого макроса смотрите пример для AC_HEADER_STDC.


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

Comments