Next: , Previous: Function Portability, Up: Library Functions


5.5.2 特定の関数の調査

これらのマクロは — その存在にかかわらず — 特定のC関数を調査し,場合 によっては,特定の引数が与えられたときの反応を調査します.

— Macro: AC_FUNC_ALLOCA

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のlibucballocaの使用を試みません.なぜなら,それらのライブラリには互換性 がない関数があり問題が生じるためです.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
— Macro: AC_FUNC_CHOWN

chown関数が利用可能で動作する場合(特に,uidgid に 対する-1を受け入れるべきです),HAVE_CHOWNを定義します.

— Macro: AC_FUNC_CLOSEDIR_VOID

closedir関数が意味のある値を返さない場合,CLOSEDIR_VOID を 定義します.それ以外では,呼び出し側で,エラーを示す戻り値を調査する必要 があります.

— Macro: AC_FUNC_ERROR_AT_LINE

error_at_line関数が見つからない場合,AC_LIBOBJが ‘error’で置換されることを要求します.

— Macro: AC_FUNC_FNMATCH

fnmatch関数がPOSIX準拠の場合,HAVE_FNMATCHを定義 します.例えば,Solaris 2.4のバグのような,一般的な実装上のバグを検出し ます.

歴史的な理由のため,それ以外のAC_FUNCマクロとは反対に, AC_FUNC_FNMATCHは壊れていたり見つからなかったりするfnmatch を置換しません.以下のAC_REPLACE_FNMATCHを参照してください.

— Macro: AC_FUNC_FNMATCH_GNU

AC_REPLACE_FNMATCH(置換)のように動作しますが, fnmatchGNUの拡張をサポートするかどうかも調査します. 例えば,GNU Cライブラリ2.1のバグのような,一般的な実装上のバ グを検出します.

— Macro: AC_FUNC_FORK

このマクロは,forkvfork関数を調査します.動作する forkが見つかった場合,HAVE_WORKING_FORKを定義します.この マクロは,forkがスタブかどうかを実行してみることで調査します.

vfork.hが見つかった場合,HAVE_VFORK_Hを定義します.動作す るvforkが見つかった場合,HAVE_WORKING_VFORKを定義します. それ以外の場合,以前のバージョンのautoconfに対する下位互換のた め,vforkforkと定義します.このマクロは,vforkの 実装のいくつかの既知のエラーを調査し,そのエラーのいずれかを検出した場合, システムには動作するvforkが無いと考えます.子プロセスは,シグナル ハンドラを変えることがめったにないので,子プロセスのsignalの呼び 出しが,親プロセスのシグナルハンドラを変更する場合,実装エラーだとは考え られません.

このマクロは,以前のバージョンのautoconfへの下位互換性のためだ けにvforkを定義するので,コード内で独自に定義することを推奨します.

          #if !HAVE_WORKING_VFORK
          # define vfork fork
          #endif
— Macro: AC_FUNC_FSEEKO

fseeko関数が利用可能な場合,HAVE_FSEEKOを定義します.必要 があれば,プロトタイプがいくつかのシステム上で(例えばglibc 2.2)見て分か るように,_LARGEFILE_SOURCEを定義します.それ以外では, AC_SYS_LARGEFILEを用いてコンパイルするとき,off_tがデフォ ルトで64bitになっていないラージファイルに問題があるシステム上で,リンク の問題が発生する可能性があります.

— Macro: AC_FUNC_GETGROUPS

getgroups関数が利用可能で,(‘getgroups (0, 0)’が常に失敗する Ultrix 4.3と異なり)動作する場合,HAVE_GETGROUPSを定義します. GETGROUPS_LIBSをその関数の使用に必要な全てのライブラリに定義しま す.このマクロは,AC_TYPE_GETGROUPSを実行します.

— Macro: AC_FUNC_GETLOADAVG

システムのロードアベレージを取得する方法を調査します.適切に調査を実行す るため,このマクロはファイルgetloadavg.cが必要です.このため,適 切な置換ディレクトリをAC_LIBOBJで確実に設定してください (Generic Functionsと,AC_CONFIG_LIBOBJ_DIRを参照してくださ い).

システムにgetloadavg関数がある場合,HAVE_GETLOADAVGを定義 し,その関数の使用に必要な全てのライブラリをGETLOADAVG_LIBSに設定 します.また,GETLOADAVG_LIBSLIBSに加えます.それ以外の 場合,AC_LIBOBJで‘getloadavg’をdir/getloadavg.c のソースコードで置換することを要求し,おそらく以下のようないくつかのCプ リプロセッサのマクロと出力変数を定義します.

  1. C_GETLOADAVGを定義します.
  2. システムが,SVR4DGUXUMAX,またはUMAX4_3 の場合,それを定義します.
  3. nlist.hが見つかる場合,HAVE_NLIST_Hを定義します.
  4. struct nlist’が‘n_un’メンバーを持つ場合, HAVE_STRUCT_NLIST_N_UN_N_NAMEを定義します.時代遅れのシンボル NLIST_NAME_UNIONも定義しますが,それに依存しないようにしてくださ い.
  5. プログラムによっては,getloadavgが動作するために,setgid(または setuid)がインストールされていることを必要とするかもしれません.この場合, GETLOADAVG_PRIVILEGEDを定義し,出力変数NEED_SETGIDを ‘true’に(それ以外では‘false’に)設定し,そしてKMEM_GROUP をインストールされているプログラムを所有するグループの名前に設定します.

— Macro: AC_FUNC_GETMNTENT

irix 4,PTXと,Unixwareに対し,sunseq,そして gen のライブラリ内のgetmntentをそれぞれ調査します. getmntentが利用可能な場合,HAVE_GETMNTENTを定義します.

— Macro: AC_FUNC_GETPGRP

getpgrpに0を渡すとエラーになる場合,GETPGRP_VOIDを定義しま す.これはPOSIXの動作です.古いBSDシステムでは,それ は引数をとりPOSIXgetpgidのように動作するので, getpgrpに0を渡す必要があります.

          #if GETPGRP_VOID
            pid = getpgrp ();
          #else
            pid = getpgrp (0);
          #endif

このマクロはgetpgrpが存在するかどうかを全く調査しません.そのよう な状況で動作する必要がある場合,getpgrpに対して最初に AC_CHECK_FUNCを呼び出してください.

— Macro: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK

linkがシンボリックリンクの場合,lstatlink/link/.と同じものとして扱います.しかし,多くの古いlstat の 実装では,後置されているスラッシュを間違って無視します.

lstatが後置されているスラッシュを間違って無視する場合,それ以外の unlinkのようなsymbolic-link-aware関数も後置されているスラッシュを 間違って無視すると仮定した方が確実です.

lstatが正しく動作する場合,LSTAT_FOLLOWS_SLASHED_SYMLINK を定義し,それ以外の場合は,AC_LIBOBJlstatで置換するよう 要求します.

— Macro: AC_FUNC_MALLOC

malloc関数がGNU Cライブラリのmallocと互換性があ る場合,(すなわち‘malloc (0)’が有効なポインタを返す)場合, HAVE_MALLOCを1に定義します.それ以外では,HAVE_MALLOCを0 に定義し,AC_LIBOBJで‘malloc’を置換し,ネイティブの mallocが中心的なプロジェクトで使用されないようにmallocrpl_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);
     }

— Macro: AC_FUNC_MEMCMP

memcmp関数が利用不可能,または(SunOS 4.1.3のように)8ビットデータ で動作しない,または(NeXT x86 OpenStepのように)16バイトかそれ以上で少な くとも一つのバッファが4バイト境界で始まらないものの比較時に失敗する場合, AC_LIBOBJで‘memcmp’を置換することを要求します.

— Macro: AC_FUNC_MBRTOWC

関数mbrtowcと型mbstate_tが正しく宣言されている場合, HAVE_MBRTOWCを1に設定します.

— Macro: AC_FUNC_MKTIME

mktime関数が利用不可能,または正しく動作しない場合, AC_LIBOBJで‘mktime’を置換することを要求します.このテストの 目的に対して,mktimePOSIXに準拠すべきで, localtimeの反対になっているべきです.

— Macro: AC_FUNC_MMAP

mmap関数が存在して正しく動作する場合,HAVE_MMAPを定義しま す.すでにマップされたメモリの,プライベートな固定したマッピングのみ調査 します.

— Macro: AC_FUNC_OBSTACK

obstackが見つかった場合,HAVE_OBSTACKを定義し,そうでない場合は AC_LIBOBJで‘obstack’を置換することを要求します.

— Macro: AC_FUNC_REALLOC

realloc関数がGNU Cライブラリのreallocと互換性が ある場合,(すなわち‘realloc (0, 0)’が有効なポインタを返す)場合, HAVE_REALLOCを1に定義します.それ以外では,HAVE_REALLOC を 0に定義し,AC_LIBOBJで‘realloc’を置換し,ネイティブの reallocが中心的なプロジェクトで使用されないようにreallocrpl_reallocで定義するかどうかを尋ねます.詳細は AC_FUNC_MALLOCを参照してください.

— Macro: AC_FUNC_SELECT_ARGTYPES

select関数の引数それぞれに渡される正しい型を決定し,それらの型を SELECT_TYPE_ARG1SELECT_TYPE_ARG234,そして SELECT_TYPE_ARG5にそれぞれ定義します.SELECT_TYPE_ARG1のデ フォルトは‘int’で,SELECT_TYPE_ARG234のデフォルトは‘int *’で,そしてSELECT_TYPE_ARG5のデフォルトは‘struct timeval *’ です.

— Macro: AC_FUNC_SETPGRP

setpgrpが引数を持たない(POSIXバージョンの)場合, SETPGRP_VOIDを定義します.それ以外では,BSDバージョンで, 二つのプロセスIDを引数とします.このマクロはsetpgrpの存在を全く調 査しません.その状況で動作する必要がある場合,setpgrpに対して最初 にAC_CHECK_FUNCを呼び出してください.

— Macro: AC_FUNC_STAT
— Macro: AC_FUNC_LSTAT

statlstatに,長さが0のファイル名を引数で与えたときに成功 するというバグがあるかどうかを決定します.SunOS 4.1.4とHurd(1998-11-01) のstatlstatではこうなります.

その場合,HAVE_STAT_EMPTY_STRING_BUG(または HAVE_LSTAT_EMPTY_STRING_BUG)を定義し,AC_LIBOBJでそれを置 換することを要求します.

— Macro: AC_FUNC_SETVBUF_REVERSED

setvbufが他とは異なり,第二引数でバッファの型,第三引数でバッファ ポインタをとる場合,SETVBUF_REVERSEDを定義します.

— Macro: AC_FUNC_STRCOLL

strcoll関数が存在して,正しく動作する場合,HAVE_STRCOLL を 定義します.使用すべきではないstrcollの間違った定義を持つシステム もあるので,‘AC_CHECK_FUNCS(strcoll)’より多少ましです.

— Macro: AC_FUNC_STRTOD

strtod関数が存在していない,または正しく動作しない場合, AC_LIBOBJで‘strtod’を置換するよう要求します.この場合, strtod.cは‘pow’を必要とすることもあり得るので,出力変数 POW_LIBを必要な外部ライブラリに設定します.

— Macro: AC_FUNC_STRERROR_R

strerror_rが利用可能な場合はHAVE_STRERROR_Rを定義し,それ が宣言されている場合,HAVE_DECL_STRERROR_Rを定義します.それが char *のメッセージを返す場合,STRERROR_R_CHAR_Pを定義しま す.それ以外ではintのエラーナンバーを返します.POSIXで はstrerror_rintを返すように要求していますが,多くのシス テムのスレッドセーフな関数のオプション(例えばGNU Cライブラリの バージョン2.2.4を含む)は,バッファ引数に等しい必要が無いchar * の 値を返します.

— Macro: AC_FUNC_STRFTIME

intlライブラリ内で,SCO unixに対するstrftimeを調査し ます.strftimeが利用可能な場合,HAVE_STRFTIMEを定義します.

— Macro: AC_FUNC_STRNLEN

strnlenが利用不可能な場合や(AIX 4.3のように)バグが多い 場合,AC_LIBOBJで置換することを要求します.

— Macro: AC_FUNC_UTIME_NULL

utime(file, NULL)’がfileのタイムスタンプを現在のものに 設定する場合,HAVE_UTIME_NULLを定義します.

— Macro: AC_FUNC_VPRINTF

vprintfが見つかった場合,HAVE_VPRINTFを定義します.それ以 外で,_doprntが見つかった場合,HAVE_DOPRNTを定義します. (vprintfが利用可能な場合,vfprintfvsprintfも利用 可能だと仮定できるでしょう.)

— Macro: AC_REPLACE_FNMATCH

fnmatch関数がPOSIX準拠でない場合(AC_FUNC_FNMATCH を参照してください),それをAC_LIBOBJで置換するかどうかを尋ねます.

AC_LIBOBJの置換用ディレクトリのファイルfnmatch.cfnmatch_loop.c,そしてfnmatch_.hが,GNU fnmatchのソースコードをのコピーを含んでいると想定されます.必要な 場合,このソースコードはAC_LIBOBJでの置換物としてコンパイルされ, システムの<fnmatch.h>でインクルードできるように, fnmatch_.hfnmatch.hにリンクされます.