これらのマクロは — その存在にかかわらず — 特定のC関数を調査し,場合 によっては,特定の引数が与えられたときの反応を調査します.
alloca
を使用する方法を調査します.alloca.hや,前もって定義 されているCプリプロセッサマクロの__GNUC__
と_AIX
を調査する ことで,組み込みバージョンを取得しようとします.このマクロが alloca.hを見つけた場合,HAVE_ALLOCA_H
を定義します.その試みが失敗する場合,標準Cライブラリで関数を探します.それらの手法の いずれかが成功した場合,それは
HAVE_ALLOCA
を定義します.それ以外の 場合は,出力変数のALLOCA
を`alloca.o'に設定し,C_ALLOCA
を定義します(それで,プログラムがガーベージコレクションの ため定期的に`alloca(0)'を呼び出すことが可能になります.この変数は,LIBOBJS
とは別物なので,実際にライブラリを作成しなくても複数のプロ グラムでALLOCA
の値を共有することが可能ですが,LIBOBJS
で使 用する場合もわずかにあります.このマクロは,System V R3 のlibPWやSystem V R4のlibucbの
alloca
の使用を試みません.なぜなら,それらのライブラリには互換性 がない関数があり問題が生じるためです.alloca
を含まないものやバグ だらけのバージョンもあります.それでも,そのalloca
を使用したい場 合,alloca.cをコンパイルする代わりに,ライブラリから alloca.oを抽出するため,ar
を使用してください.
alloca
を使用するソースファイルでは,正確に宣言するために,以下の ようなコードで始めるべきです.AIXのバージョンによっては,alloca
の宣言を,コメントとプリプロセッサディレクティブ以外の,全 ての行の前に書く必要があります.#pragma
ディレクティブは, ANSI C以前のコンパイラが停止するのではなく無視するように,字下 げを行います./* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include <alloca.h> # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif
closedir
関数が意味のある値を返さない場合,CLOSEDIR_VOID
を 定義します.それ以外では,呼び出し側で,エラーを示す戻り値を調査する必要 があります.
fnmatch
関数がPOSIX準拠の場合,HAVE_FNMATCH
を定義 します.例えば,Solaris 2.4のバグのような,一般的な実装上のバグを検出し ます.歴史的な理由のため,それ以外の
AC_FUNC
マクロとは反対に,AC_FUNC_FNMATCH
は壊れていたり見つからなかったりするfnmatch
を置換しません.以下のAC_REPLACE_FNMATCH
を参照してください.
AC_REPLACE_FNMATCH
(置換)のように動作しますが,fnmatch
がGNUの拡張をサポートするかどうかも調査します. 例えば,GNU Cライブラリ2.1のバグのような,一般的な実装上のバ グを検出します.
このマクロは,
fork
とvfork
関数を調査します.動作するfork
が見つかった場合,HAVE_WORKING_FORK
を定義します.この マクロは,fork
がスタブかどうかを実行してみることで調査します.vfork.hが見つかった場合,
HAVE_VFORK_H
を定義します.動作す るvfork
が見つかった場合,HAVE_WORKING_VFORK
を定義します. それ以外の場合,以前のバージョンのautoconfに対する下位互換のた め,vfork
をfork
と定義します.このマクロは,vfork
の 実装のいくつかの既知のエラーを調査し,そのエラーのいずれかを検出した場合, システムには動作するvfork
が無いと考えます.子プロセスは,シグナル ハンドラを変えることがめったにないので,子プロセスのsignal
の呼び 出しが,親プロセスのシグナルハンドラを変更する場合,実装エラーだとは考え られません.このマクロは,以前のバージョンのautoconfへの下位互換性のためだ けに
vfork
を定義するので,コード内で独自に定義することを推奨します.#if !HAVE_WORKING_VFORK # define vfork fork #endif
fseeko
関数が利用可能な場合,HAVE_FSEEKO
を定義します.必要 があれば,プロトタイプがいくつかのシステム上で(例えばglibc 2.2)見て分か るように,_LARGEFILE_SOURCE
を定義します.それ以外では,AC_SYS_LARGEFILE
を用いてコンパイルするとき,off_t
がデフォ ルトで64bitになっていないラージファイルに問題があるシステム上で,リンク の問題が発生する可能性があります.
getgroups
関数が利用可能で,(`getgroups (0, 0)'が常に失敗する Ultrix 4.3と異なり)動作する場合,HAVE_GETGROUPS
を定義します.GETGROUPS_LIBS
をその関数の使用に必要な全てのライブラリに定義しま す.このマクロは,AC_TYPE_GETGROUPS
を実行します.
システムのロードアベレージを取得する方法を調査します.適切に調査を実行す るため,このマクロはファイルgetloadavg.cが必要です.このため,適 切な置換ディレクトリを
AC_LIBOBJ
で確実に設定してください (Generic Functionsと,AC_CONFIG_LIBOBJ_DIR
を参照してくださ い).システムに
getloadavg
関数がある場合,HAVE_GETLOADAVG
を定義 し,その関数の使用に必要な全てのライブラリをGETLOADAVG_LIBS
に設定 します.また,GETLOADAVG_LIBS
をLIBS
に加えます.それ以外の 場合,AC_LIBOBJ
で`getloadavg'をdir/getloadavg.c のソースコードで置換することを要求し,おそらく以下のようないくつかのCプ リプロセッサのマクロと出力変数を定義します.
C_GETLOADAVG
を定義します.- システムが,
SVR4
,DGUX
,UMAX
,またはUMAX4_3
の場合,それを定義します.- nlist.hが見つかる場合,
HAVE_NLIST_H
を定義します.- `struct nlist'が`n_un'メンバーを持つ場合,
HAVE_STRUCT_NLIST_N_UN_N_NAME
を定義します.時代遅れのシンボルNLIST_NAME_UNION
も定義しますが,それに依存しないようにしてくださ い.- プログラムによっては,
getloadavg
が動作するために,setgid(または setuid)がインストールされていることを必要とするかもしれません.この場合,GETLOADAVG_PRIVILEGED
を定義し,出力変数NEED_SETGID
を `true'に(それ以外では`false'に)設定し,そしてKMEM_GROUP
をインストールされているプログラムを所有するグループの名前に設定します.
irix 4,PTXと,Unixwareに対し,sun,seq,そして gen のライブラリ内の
getmntent
をそれぞれ調査します.getmntent
が利用可能な場合,HAVE_GETMNTENT
を定義します.
getpgrp
に0を渡すとエラーになる場合,GETPGRP_VOID
を定義しま す.これはPOSIXの動作です.古いBSDシステムでは,それ は引数をとりPOSIXのgetpgid
のように動作するので,getpgrp
に0を渡す必要があります.#if GETPGRP_VOID pid = getpgrp (); #else pid = getpgrp (0); #endifこのマクロは
getpgrp
が存在するかどうかを全く調査しません.そのよう な状況で動作する必要がある場合,getpgrp
に対して最初にAC_CHECK_FUNC
を呼び出してください.
linkがシンボリックリンクの場合,
lstat
はlink/を link/.と同じものとして扱います.しかし,多くの古いlstat
の 実装では,後置されているスラッシュを間違って無視します.
lstat
が後置されているスラッシュを間違って無視する場合,それ以外のunlink
のようなsymbolic-link-aware関数も後置されているスラッシュを 間違って無視すると仮定した方が確実です.
lstat
が正しく動作する場合,LSTAT_FOLLOWS_SLASHED_SYMLINK
を定義し,それ以外の場合は,AC_LIBOBJ
をlstat
で置換するよう 要求します.
malloc
関数がGNU Cライブラリのmalloc
と互換性があ る場合,(すなわち`malloc (0)'が有効なポインタを返す)場合,HAVE_MALLOC
を1に定義します.それ以外では,HAVE_MALLOC
を0 に定義し,AC_LIBOBJ
で`malloc'を置換し,ネイティブのmalloc
が中心的なプロジェクトで使用されないようにmalloc
をrpl_malloc
で定義するかどうかを尋ねます.通常,ファイルmalloc.cの置換は以下のようになります(`#undef malloc'に注意してください).
#if HAVE_CONFIG_H # include <config.h> #endif #undef malloc #include <sys/types.h> void *malloc (); /* Allocate an N-byte block of memory from the heap. If N is zero, allocate a 1-byte block. */ void * rpl_malloc (size_t n) { if (n == 0) n = 1; return malloc (n); }
memcmp
関数が利用不可能,または(SunOS 4.1.3のように)8ビットデータ で動作しない,または(NeXT x86 OpenStepのように)16バイトかそれ以上で少な くとも一つのバッファが4バイト境界で始まらないものの比較時に失敗する場合,AC_LIBOBJ
で`memcmp'を置換することを要求します.
mktime
関数が利用不可能,または正しく動作しない場合,AC_LIBOBJ
で`mktime'を置換することを要求します.このテストの 目的に対して,mktime
はPOSIXに準拠すべきで,localtime
の反対になっているべきです.
realloc
関数がGNU Cライブラリのrealloc
と互換性が ある場合,(すなわち`realloc (0, 0)'が有効なポインタを返す)場合,HAVE_REALLOC
を1に定義します.それ以外では,HAVE_REALLOC
を 0に定義し,AC_LIBOBJ
で`realloc'を置換し,ネイティブのrealloc
が中心的なプロジェクトで使用されないようにrealloc
をrpl_realloc
で定義するかどうかを尋ねます.詳細はAC_FUNC_MALLOC
を参照してください.
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バージョンの)場合,SETPGRP_VOID
を定義します.それ以外では,BSDバージョンで, 二つのプロセスIDを引数とします.このマクロはsetpgrp
の存在を全く調 査しません.その状況で動作する必要がある場合,setpgrp
に対して最初 にAC_CHECK_FUNC
を呼び出してください.
stat
やlstat
に,長さが0のファイル名を引数で与えたときに成功 するというバグがあるかどうかを決定します.SunOS 4.1.4とHurd(1998-11-01) のstat
とlstat
ではこうなります.その場合,
HAVE_STAT_EMPTY_STRING_BUG
(またはHAVE_LSTAT_EMPTY_STRING_BUG
)を定義し,AC_LIBOBJ
でそれを置 換することを要求します.
setvbuf
が他とは異なり,第二引数でバッファの型,第三引数でバッファ ポインタをとる場合,SETVBUF_REVERSED
を定義します.
strcoll
関数が存在して,正しく動作する場合,HAVE_STRCOLL
を 定義します.使用すべきではないstrcoll
の間違った定義を持つシステム もあるので,`AC_CHECK_FUNCS(strcoll)'より多少ましです.
strtod
関数が存在していない,または正しく動作しない場合,AC_LIBOBJ
で`strtod'を置換するよう要求します.この場合, strtod.cは`pow'を必要とすることもあり得るので,出力変数POW_LIB
を必要な外部ライブラリに設定します.
strerror_r
が利用可能な場合はHAVE_STRERROR_R
を定義し,それ が宣言されている場合,HAVE_DECL_STRERROR_R
を定義します.それがchar *
のメッセージを返す場合,STRERROR_R_CHAR_P
を定義しま す.それ以外ではint
のエラーナンバーを返します.POSIXで はstrerror_r
がint
を返すように要求していますが,多くのシス テムのスレッドセーフな関数のオプション(例えばGNU Cライブラリの バージョン2.2.4を含む)は,バッファ引数に等しい必要が無いchar *
の 値を返します.
intlライブラリ内で,SCO unixに対する
strftime
を調査し ます.strftime
が利用可能な場合,HAVE_STRFTIME
を定義します.
vprintf
が見つかった場合,HAVE_VPRINTF
を定義します.それ以 外で,_doprnt
が見つかった場合,HAVE_DOPRNT
を定義します. (vprintf
が利用可能な場合,vfprintf
とvsprintf
も利用 可能だと仮定できるでしょう.)
fnmatch
関数がPOSIX準拠でない場合(AC_FUNC_FNMATCH
を参照してください),それをAC_LIBOBJ
で置換するかどうかを尋ねます.
AC_LIBOBJ
の置換用ディレクトリのファイルfnmatch.c, fnmatch_loop.c,そしてfnmatch_.hが,GNUfnmatch
のソースコードをのコピーを含んでいると想定されます.必要な 場合,このソースコードはAC_LIBOBJ
での置換物としてコンパイルされ, システムの<fnmatch.h>
でインクルードできるように, fnmatch_.hがfnmatch.hにリンクされます.