これらのマクロは — その存在にかかわらず — 特定の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にリンクされます.