[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のマクロは、パッケージが必要な、あるいは使いたい特定のOSの機能を 調べます。以下のマクロに定義されていない機能の有無をチェックしたい場合、 基本テストマクロ(primitive test macro)に適切な引数を渡してチェックを 実現することになります(see section 5. Writing Tests参照)。
以下のテストは、どの機能をチェックしているか、なにがわかったかを
知らせるメッセージを出力します。チェック結果はconfigure
を
再度実行したときのためにキャッシュされます(see section 6.3 Caching Results参照)。
マクロには出力変数を設定するものがあります。出力変数の値を 参照するやりかたについてはSee section 3.3 Substitutions in Makefilesを参照してください。 以下で、「nameを定義します」という文は、 「Cプリプロセッサシンボルnameを1に定義します」という意味です。 定義された値をプログラム中で参照するやりかたについてはSee section 6.1 Defining C Preprocessor Symbols を参照してください。
4.1 Alternative Programs | Selecting between alternative programs. | |
4.2 Library Files | Library archives that might be missing. | |
4.3 Library Functions | C library functions that might be missing. | |
4.4 Header Files | Header files that might be missing. | |
4.5 Structures | Structures or members that might be missing. | |
4.6 Typedefs | typedef s that might be missing. | |
4.7 C Compiler Characteristics | ||
4.8 Fortran 77 Compiler Characteristics | ||
4.9 System Services | Operating system services. | |
4.10 UNIX Variants | Special kludges for specific UNIX variants. |
以下のマクロは特定のプログラムの有無、またはふるまいをチェックします。 マクロは、いくつかの候補となるプログラムからどれかひとつを選んだり、 選んだものをどう利用するかを定めるために使われます。 パッケージで使うプログラム専用のマクロが定義されておらず、 そのプログラムに関する特殊なチェックが必要ない場合、 汎用のマクロのうちいずれかを利用することができます。
4.1.1 Particular Program Checks | Special handling to find certain programs. | |
4.1.2 Generic Program and File Checks | How to find other programs. |
以下のマクロは特定のプログラムをチェックします--- プログラムが存在するかどうか、およびいくつかのプログラムについては プログラム特有の機能をチェックします。
yytext
の型が`char []'でなく
`char *'だった場合、
YYTEXT_POINTER
を定義します。
また、lex
の出力ファイル名を
出力変数LEX_OUTPUT_ROOT
に
定義します。通常は`lex.yy'ですが
他の値のこともあります。これらの結果は
lex
とflex
のどちらが
利用されているかによって変わります。
mawk
、gawk
、nawk
、
awk
があるかどうかをこの順序で
調べ、出力変数AWK
の値を
最初にみつけたプログラムの
名前に設定します。mawk
を最初に
調べるのは、これが一番高速動作する
実装だと言われているからです。
CC
が設定されて
いなかったら、gcc
があるか
どうか調べ、なければcc
を
使います。出力変数CC
を
みつけたコンパイラの名前に設定します。
このマクロは、GNU Cコンパイラを使う場合
shell変数GCC
を`yes'に、
そうでない場合空に設定します。
もし出力変数CFLAGS
がまだ
設定されていなかったら、
GNU Cコンパイラの場合には
`-g -O2'に設定します
(GCCが`-g'を受け付けない場合
`-O2'に、他のコンパイラの場合
`-g'に設定します)。
現在利用することになっている
Cコンパイラが、configure
が
実行されているシステム以外のための
バイナリを生成する場合、
shell変数cross_compiling
を
`yes'に設定します。
そうでない場合`no'に設定します。
言い替えれば、このテストは
build対象のシステムが
ホストシステムタイプ(訳註:
コンパイルを行うシステムのタイプ)と
異なるかどうかを調べます
(「ターゲットシステムタイプ」は
このマクロとは無関係です)。
クロスコンパイルのサポートに
ついてはSee section 8. Manual Configurationを
参照してください。
NO_MINUS_C_MINUS_O
を定義します。
CPP
に、Cプリプロセッサを
実行するためのコマンド名を定義します。
`$CC -E'が動かない場合、
`/lib/cpp'が使われます。
CPP
を`.c'ファイル以外に
用いるのは移植性がありません。
移植性のために、CPP
に通すのは
拡張子が`.c'のファイルだけにしましょう。
現在選択されている言語がCの場合
(see section 5.8 Language Choice参照)、
一部のテストマクロは出力変数CPP
の
値を間接的に利用しています。
「間接的に」というのは、テストマクロ内部でマクロ
AC_TRY_CPP
、AC_CHECK_HEADER
、
AC_EGREP_HEADER
、AC_EGREP_CPP
を
呼び出しているからです。
CXX
またはCCC
が
定義されていないか(CXX
を先に)
調べます;
もし定義されていたら、定義されている値を
出力変数CXX
にセットします。
さもなくば、C++コンパイラらしい名前の
プログラムを探します
(c++
, g++
, gcc
, CC
,
cxx
, それからcc++
)。
もし以上のチェックが全て失敗したら、
最後の手段としてCXX
をgcc
にセットします。
GNU C++コンパイラを利用する場合、
shell変数GXX
を`yes'に、
さもなくば空にセットします。
出力変数CXXFLAGS
がまだ定義されて
いない場合、CXXFLAGS
を定義します。
GNU C++コンパイラを
利用するなら`-g -O2'(GNU C++が
`-g'を受け付けない場合`-O2')に、
他のコンパイラの場合は`-g'になります。
現在利用することになっている
C++コンパイラが、configure
が
実行されているシステム以外のための
バイナリを生成する場合、
shell変数cross_compiling
を
`yes'に設定します。
そうでない場合`no'に設定します。
言い替えれば、このテストは
build対象のシステムが
ホストシステムタイプ(訳註:
コンパイルを行うシステムのタイプ)と
異なるかどうかを調べます
(「ターゲットシステムタイプ」は
このマクロとは無関係です)。
クロスコンパイルのサポートに
ついてはSee section 8. Manual Configurationを
参照してください。
CXXCPP
に、C++プリプロセッサを
実行するためのコマンド名を定義します。
`$CXX -E'が動かない場合、
`/lib/cpp'が使われます。
CXXCPP
を`.c'、`.C'
または`.cc'以外のファイルに
用いるのは移植性がありません。
移植性のために、CPP
に通すのは
上記に挙げた拡張子をもつファイルだけにしましょう。
現在選択されている言語がC++の場合
(see section 5.8 Language Choice参照)、
一部のテストマクロは出力変数CXXCPP
の
値を間接的に利用しています。
「間接的に」というのは、テストマクロ内部でマクロ
AC_TRY_CPP
、AC_CHECK_HEADER
、
AC_EGREP_HEADER
、AC_EGREP_CPP
を
呼び出しているからです。
F77
が設定されて
いなかったら、g77
、f77
そして f2c
を
この順番で調べます。出力変数F77
をみつけたコンパイラの名前に設定し
ます。
g77
(GNU Fortran 77コンパイラ)を使う場合AC_PROG_F77
はshell
変数G77
を`yes'に、そうでない場合空に設定します。もし出力変数
FFLAGS
がその環境でまだ設定されていなかったら、g77
の場合に
は`-g -02'を(g77
が`-g'を受け付けない場合`-O2'に設
定します)、他のコンパイラの場合`-g'にFFLAGS
を設定します
F77_NO_MINUS_C_MINUS_O
を
定義します。
ioctl
がうまく動かない場合、
出力変数CC
に`-traditional'を
付け加えます。
通常、これはGNU Cコンパイラ用に修正された
ヘッダファイルがインストールされていない
古いシステムで起こります。
GNU Cコンパイラの最近のバージョンでは、
インストール時にヘッダファイルを修正するので、
この問題は起きなくなってきました。
PATH
上にBSD互換の
install
プログラムがあった場合、
出力変数INSTALL
をその名前にセットします。
さもなくば、`dir/instal-sh -c'を
セットします。
後者の場合、AC_CONFIG_AUX_DIR
に
指定されたディレクトリ(またはデフォルトの
ディレクトリ)を使ってdirを決定します
(see section 3.2 Creating Output Files)。
さらに、INSTALL_PROGRAM
とINSTALL_SCRIPT
を`${INSTALL}'に、
INSTALL_DATA
を`${INSTALL} -m 644'にセットします。
このマクロは、うまく動作しない
install
プログラムを無視します。
プログラムを探す際には、速度のためにスクリプトよりは
Cで書かれたプログラムの方を優先します。
`install-sh'以外に、`install.sh'を
使うこともできますが、`install.sh'という
ファイル名はobsoleteなので使わない方がいいでしょう(訳註: 意訳)。
これは、
一部のmake
が、`Makefile'がないときに
`install.sh'から`install'を生成する
ルールをもっているためです。
パッケージに含める(訳註: 意訳)
`install-sh'としては、
Autoconfと一緒に配布されている`install-sh'を
利用することができます。
AC_PROG_INSTALL
を利用した場合、
`install-sh'または`install.sh'を
配布に含める必要があります。
含めなかった場合、configure
は
ファイルがみつからなかった旨
エラーメッセージを出力します。
エラーメッセージは正しく動作する
install
がある場合にも出力されます。
このチェックは、install-sh
を
パッケージに含め忘れないための安全策です。
含め忘れた場合、あなたのパッケージを
BSD互換のinstall
プログラムのない
システムでインストールできなくなってしまいます。
標準的なinstall
プログラムにない機能が
必要で独自のインストールプログラムを利用したい
場合には、AC_PROG_INSTALL
を利用する
必要はありません; 御自分のインストールプログラムへの
パス名を`Makefile.in'に単に含めればいいのです。
flex
があったら、出力変数LEX
を
`flex'に、(もし`libfl.a'が
標準的な場所にあったら)LEXLIB
を
`-lfl'に設定します。
もしflex
がなかったら、
LEX
を`lex'に、
LEXLIB
を`-ll'に設定します。
LN_S
を`ln -s'に設定します。
動かなかったら、`ln'に設定します。
カレントディレクトリ以外のパス名をリンク先として
指定した場合、`ln'と`ln -s'では
意味が異なってきます。
`$(LN_S)'を使って安全にリンクを作成するためには、
makefile中でどちらが使われているか調べて動作を変えるか、
ln
コマンドをリンクが置かれるディレクトリで
呼び出すかのいずれかを行わねばなりません。
言い替えれば、以下はうまく動きません:
$(LN_S) foo /x/bar |
ので、かわりにこうしましょう:
(cd /x && $(LN_S) foo bar) |
ranlib
がみつかったら、出力変数
RANLIB
を`ranlib'に設定します。
さもなくば、:
(なにもしない)に設定します。
bison
がみつかったら、出力変数
YACC
を`bison -y'に設定します。
かわりにbyacc
がみつかったら、出力変数
YACC
を`byacc'に設定します。
さもなくば、yacc
に設定します。
以下のマクロは、プログラムをみつけるための専用マクロが特に
定義されていないプログラムをみつけるために使われます。
プログラムの存在だけでなくプログラムの挙動を調べたい場合、
自分でテストスクリプトを記述する必要があります(see section 5. Writing Tests)。
デフォルトでは、マクロは環境変数PATH
を使います。
ユーザのPATH
にないようなプログラムをチェックする場合、
以下のように自分でサーチパスを変更してマクロに渡すことができます:
AC_PATH_PROG(INETD, inetd, /usr/libexec/inetd, $PATH:/usr/libexec:/usr/sbin:/usr/etc:etc) |
AC_CHECK_FILE
をfilesに列挙したそれぞれのファイルごとに一度
ずつ実行します。さらに見つけたファイルそれぞれに対して
`HAVE_file'を1に定義します。
PATH
中に
あるかどうかを調べます。もし発見された場合variableを
value-if-foundに設定します。発見されなかった場合
(value-if-not-foundが指定されていた場合は)
value-if-not-foundに設定します。
このマクロは、reject (絶対パスのファイル名)を
サーチパス上で発見してもそれは無視します。
この場合、variableはパス上でみつかった
prog-to-check-forで、rejectではない
ファイルの絶対パス名になります。
variableが既に設定されていた場合、なにもしません。
variableのために、AC_SUBST
を呼び出します。
PATH
上に
あるかどうかを調べます。もしあった場合、
そのプログラム名をvariableに設定します。
さもなくば、次のプログラム名を探します。
もし、指定された全てのプログラムがなかった場合、
value-if-not-foundの値をvariableに設定します。
もしvalue-if-not-foundが指定されていなかったら、
variableの値は変更されません。
variableのために、AC_SUBST
を呼び出します。
AC_CHECK_PROG
と同様ですが、prog-to-check-forの
先頭にAC_CANONICAL_HOST
で判定されたホストタイプを
つけたものを最初に探します(see section 8.2 Getting the Canonical System Type参照)。
例えば、ユーザが`configure --host=i386-gnu'を
実行し、その中で
AC_CHECK_TOOL(RANLIB, ranlib, :) |
RANLIB
に設定します。
プログラムがなければRANLIB
は`:'にされます。
AC_CHECK_PROG
と同様ですが、
プログラムが発見された場合variableを
prog-to-check-forの絶対パスに設定します。
AC_CHECK_PROGS
と同様ですが、
progs-to-check-forの中のいずれかが
見付かったら、プログラムの絶対パスを
variableに設定します。
以下のマクロは指定されたC、C++、Fortran 77ライブラリファイル(および中身)が 存在するかどうかを調べます。
action-if-foundには、リンクが成功した場合に
呼び出されるshellコマンド列を指定します。
action-if-not-foundには、リンクが失敗したときに
呼び出されるshellコマンド列を指定します。
action-if-foundが
指定されなかった場合、デフォルトの動作になります。
デフォルトの動作はLIB
に`-llibrary'を追加し、
`HAVE_LIBlibrary'を(全部大文字)定義するように
なっています。
もしlibraryだけとリンクするのでは未解決のシンボルが 出てしまい、他のライブラリをリンクしないといけない場合には、 それらのライブラリ名をスペースで区切ってother-librariesに 指定してください: `-lXt -lX11'のように。 指定しなかった場合、マクロはlibraryが存在することを 検出できません。なぜなら、未解決シンボルのせいでリンクが 常に失敗するからです。
AC_CHECK_LIB
を、引数functionを
main
にして呼び出すのと同じです。引数libraryは
`foo'でも`-lfoo'でも、あるいは`libfoo.a'
とでも指定できます。これらの全ての場合に、コンパイラには
引数`-lfoo'が渡ります。
libraryにshell変数を渡すことはできません。
libraryは文字列リテラルである必要があります。
このマクロはobsoleteです。
AC_TRY_LINK_FUNC
を最初にラ
イブラリなしで、それからsearch-libsに列挙されたライブラリをそれぞ
れ指定して呼び出すのと同じです。
関数が見つかればaction-if-foundを実行します。そうでなければ action-if-not-foundを実行します。
もし、libraryのリンクがシンボル未解決という結果になり、追加のライ ブラリとともにリンクすることによってそれが解決するようならば、そのような ライブラリをother-libraries引数に空白区切りで`-lXt -lX11'のよ うに与えてください。そうでなければ、テストプログラムのリンクがいつもシン ボル未解決で失敗するので、このマクロはfunctionが存在することを発見 するのに失敗するでしょう。
AC_TRY_LINK_FUNC
の一回の呼び出しと同じです。特定のfunction
が見つかった最初のライブラリに対し、`-llibrary'をLIBS
に追加し、action-if-foundを実行します。それ以外の場合は
action-if-not-foundを実行します。
以下のマクロは、Cのライブラリ関数があるかどうかを調べます。 もし、あるマクロをチェックする特別の関数が定義されておらず、 特殊なチェックが必要でない場合には、汎用の関数チェックマクロを 用いることができます。
4.3.1 Particular Function Checks | Special handling to find certain functions. | |
4.3.2 Generic Function Checks | How to find other functions. |
以下のマクロは、特定のCライブラリ関数をチェックします --- 関数が存在するかどうか、および特定の引数を与えられたときの 挙動がチェックされます。
alloca
の有無をチェックします。
このチェックでは、なるべくコンパイラ組み込みの
alloca
を探そうとします。
このために、`alloca.h'があるかどうかおよび
Cプリプロセッサマクロ__GNUC__
と
_AIX
があらかじめ定義されているかを調べます。
もし`alloca.h'がみつかったら、
HAVE_ALLOCA_H
が定義されます。
上記のチェックが失敗したら、標準Cライブラリに
関数があるかどうかを探します。
ここまでのチェックのいずれかが成功した場合、
HAVE_ALLOCA
を定義します。
全てが失敗した場合、出力変数ALLOCA
を
`alloca.o'に定義し、C_ALLOCA
を定義します
(C_ALLOCA
は、プログラムがGCのために
定期的に`alloca(0)'を呼び出すことが
できるようにするため定義されます)。
ALLOCA
はLIBOBJS
とは独立に定義されます。
これは複数のプログラムをコンパイルするとき、
alloca
を実際使うものが少なかった場合に
いちいち`alloca.o'をコンパイルしなくて済むようにするためです
(訳註: 超意訳。自信なし。原文は「
This variable is separate from LIBOBJS
so multiple programs can
share the value of ALLOCA
without needing to create an actual
library, in case only some of them use the code in LIBOBJS
.」)。
このマクロはSystem V R3の`libPW'や
System V R4の`libucb'に含まれる
alloca
を探すことはしません。
なぜなら、これらのライブラリには
場合によってはalloca
が
含まれていなかったり、
含まれていてもalloca
バグがあったり、
あるいは互換性に問題のあるalloca
以外の
関数が含まれていたりするためです。
どうしてもこれらのライブラリに含まれる
alloca
を利用したい場合には、
(`alloca.c'をコンパイルするのではなく)
ar
を使って`alloca.o'を取り出してください。
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
を
定義します。
定義されなかった場合には、
closedir
を呼んだ場合
返り値を用いてエラーチェックを行うべきです。
fnmatch
が存在し、かつ動作するなら、
HAVE_FNMATCH
を定義します
(ちなみに、SunOS 5.4付属のものは動きません)。
getloadavg
が利用できるなら、
HAVE_GETLOADAVG
を定義し、
LIBS
に必要なライブラリファイルを追加します。
もしgetloadavg
が利用できないなら、
`getloadavg.o'を出力変数LIBOBJS
に追加し、
必要ならいくつかのCプリプロセッサマクロや出力変数を定義します:
SVR4
、DGUX
、UMAX
または
UMAX4_3
のうちであてはまるものを定義します。
NLIST_STRUCT
を定義します。
NLIST_NAME_UNION
を定義します。
LDAV_PRIVILEGED
が定義された場合、
getloadavg
が正しく動作するには、
プログラムは(setuid bitをたてるなどして)
root権限で動作するようにインストールされる必要があります。
この場合、GETLOADAVG_PRIVILEGED
が定義されます。
NEED_SETGID
が定義されます。
インストールする際にsetgid bitをたてる必要がある場合には
値は`true'に、さもなくば値は`false'になります。
NEED_SETGID
が`true'である場合には、
プログラムファイルの所属すべき
gidがKMEM_GROUP
に定義されます。
getmntent
がライブラリファイル
`sun'、`seq'および`gen'の
いずれかに含まれているかどうか調べます
(順に、Irix 4、PTX、Unixwareの場合の
ライブラリファイルです)。
getmntent
が存在した場合、
HAVE_GETMNTENT
を定義します。
getpgrp
が引数をとらない場合
(つまりPOSIX.1準拠の場合)、
GETPGRP_VOID
を定義します。
定義されなかった場合、getpgrp
はBSDでのように
プロセスIDを引数にとります。
このマクロはgetpgrp
があるかどうかは
全く調べません; getpgrp
がない場合に
対処するには、先にAC_CHECK_FUNC
を使って
getpgrp
があるかどうか調べてください。
memcmp
がないか、
または(SunOS 4.1.3のように)8bitデータに対して
使えない場合、`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
を定義します。
定義されなかった場合、setpgrp
はBSDでのように
プロセスIDを引数にとります。
このマクロはsetpgrp
があるかどうかは
全く調べません; setpgrp
がない場合に
対処するには、先にAC_CHECK_FUNC
を使って
setpgrp
があるかどうか調べてください。
setvbuf
の第2引数がバッファリングの形式で、
第3引数がバッファへのポインタの場合、
SETVBUF_REVERSED
を定義します。
SETVBUF_REVERSED
が定義されるのは、
release 3以前のSystem Vの場合です。
strcoll
が存在して正常動作する場合、
HAVE_STRCOLL
を定義します。
このマクロはstrcoll
があるかどうかを
AC_CHECK_FUNC
より詳しく調べます。
一部のシステムでは、strcoll
の
定義が誤っているためこの関数を使うべきではないからです。
strftime
が`intl'ライブラリにあるかどうかを調べます
(これはSCO UNIXのためです)。
もしあった場合、HAVE_STRFTIME
を定義します。
HAVE_UTIME_NULL
を定義します。
HAVE_VFORK_H
を定義します。
正常動作動作するvfork
が発見されなかった場合、
vfork
をfork
に#define
します。
このマクロは、いくつかのシステムでのvfork
の
バグをチェックし、バグつきの場合にはvfork
が
みつからなかったかのように振舞います。
ただし、子プロセスでsignal
を呼んでも
親プロセスのシグナルハンドラが変更されない場合には
これはバグつきとはみなされません。
子プロセスでシグナルハンドラを変更することは
めったにないからです。
vprintf
が存在する場合、
HAVE_VPRINTF
を定義します。
ない場合に_doprnt
が存在したら、
HAVE_DOPRNT
を定義します。
ちなみに、vprintf
が存在したら、
vfprintf
とvsprintf
も
存在すると仮定して構いません。
wait3
が存在し、呼び出し時に第3引数
(`struct rusage *')の指し先の内容がきちんと
設定される場合、
HAVE_WAIT3
を定義します。
ちなみに、HP-UXでは第3引数の差し先はきちんと設定されません。
以下のマクロは、チェックのための特別のマクロがないライブラリ関数について
調べるために用意されています。
ライブラリ関数がデフォルトのCライブラリに入っていない
可能性がある場合には、AC_CHECK_LIB
を用いて
そのライブラリファイルがあるかどうか調べてください。
ライブラリ関数があるかどうかだけでなく、その振舞いも調べる
必要がある場合には、自前でテストを記述する必要があるでしょう
(see section 5. Writing Tests)。
AC_CHECK_FUNCS
を使ったほうがいいでしょう。
このマクロはAC_LANG_CPLUSPLUS
が呼ばれているいないに関わらず
C linkageで関数を探します。
C++ではCよりもライブラリ関数がきちんと標準化されているので、
AC_CHECK_FUNC
を使う機会は少なそうだからです
(環境を調べる対象の言語を選ぶやりかたについては、
see section 5.8 Language Choiceを参照)。
HAVE_function
(全部大文字)を定義します。
action-if-foundには、
各々の関数がみつかったときに実行したいshellスクリプトを記述します。
action-if-foundを`break'にすると、
最初に関数が見つかったところでループを抜けることができます。
action-if-not-foundには、
各関数がみつからなかったときに実行されるshellスクリプトを記述します。
LIBOBJS
に`function.o'を追加します。
この動作は、
AC_CHECK_FUNCS
で
action-if-not-foundに
「出力変数LIBOBJS
に`function.o'を追加する」
と記述した場合と似ています。
ライブラリの置き換え用の関数を定義するときには、
プロトタイプ宣言を`#ifndef HAVE_function'で
くくっておいた方がいいでしょう。
システムにfunctionがある場合、
システム定義のincludeファイルのどこかにプロトタイプ宣言があるはずです。
定義が矛盾するかもしれないから、システムにfunctionが
あるときには再定義を避けるべきです。
以下のマクロはCヘッダファイルがあるかないか調べます。 あなたのチェックしたいヘッダファイルについて 特定ヘッダファイル向けのマクロがなくて、 しかも特殊なことを調べる必要がなければ、 汎用のヘッダファイル検査マクロを使うとよいでしょう。
4.4.1 Particular Header Checks | Special handling to find certain headers. | |
4.4.2 Generic Header Checks | How to find other headers. |
以下のマクロは特定のシステムヘッダファイルを検査します。 ファイルがあるかどうか、それから必要なときには なにを定義しているかを検査します。
sys_siglist
が`signal.h'または`unistd.h'で定義されているなら、
SYS_SIGLIST_DECLARED
を定義します。
AC_HEADER_DIRENT
とAC_FUNC_CLOSEDIR_VOID
を呼ぶのと似ていますが、
定義するCプリプロセッサマクロが違います。
AC_DIR_HEADER
は
どのヘッダファイルがみつかったのかを表すCプリプロセッサマクロを定義します。
AC_DIR_HEADER
、およびこれにより定義されるCプリプロセッサマクロは
obsoleteです。
定義されるCプリプロセッサマクロは以下のとおり:
DIRENT
SYSNDIR
SYSDIR
NDIR
さらに、関数closedir
の返り値に意味がない場合には
VOID_CLOSEDIR
を定義します。
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 direct
でなく)
struct dirent
型として定義します。
ディレクトリエントリ名をとるためにはNAMLEN
マクロに
struct dirent
へのポインタを渡します。
このマクロはSCO Xenixの`dir'と`x'ライブラリも検査します。
major
、minor
、それから
makedev
が定義されておらず、
`sys/mkdev.h'で定義されている場合、
MAJOR_IN_MKDEV
を定義します。
`sys/sysmacros.h'で定義されている場合、
MAJOR_IN_SYSMACROS
を定義します。
STDC_HEADERS
を定義します。
具体的には、`stdlib.h'、`stdarg.h'、`string.h'、
それから`float.h'をチェックします。
これらのヘッダがあれば、多分他のANSI Cヘッダファイルもあるでしょう。
このマクロは、`string.h'でmemchr
が定義されているかどうか
調べます(もしmemchr
があればほかのmem
系関数もあるでしょう)。
それから、`stdlib.h'でfree
が定義されているかどうか
調べます(もしokならmalloc
や他の関連関数もあるでしょう)。
さらに、`ctype.h'で定義されるマクロがANSI Cの定義どおり、
`2^7'のビットが立っていても動くかどうか調べます。
ANSI互換のヘッダファイル(とCライブラリ関数)があるかどうか決めるには、
__STDC__
でないしにSTDC_HEADERS
を使いましょう。
GCCがインストールされているシステムの多くには
ANSI Cヘッダファイルがないからです(訳註: つまり、__STDC__
が
あってもANSI Cヘッダファイルがあるとは限らない、ということ)。
ANSI Cヘッダのないシステムでは、どのヘッダでなにを定義しているかは 全くばらばらです。 ですから、どのヘッダファイルに定義があるか探すよりも、 自分で使う関数を自分で定義した方が簡単です。 あるシステムではANSIとBSDの関数が混在しています。 あるシステムはほぼANSI互換なのに`memmove'がありません。 あるシステムはBSD由来の関数を`string.h'や`strings.h'註の マクロとして定義しています。 あるシステムではBSD由来の関数しかなく、`string.h'がありません。 メモリ関係の関数は`memory.h'で定義されていたり、`string.h'で 定義されていたりします。 他にもいろいろ変種があります。 とりあえず、ANSIで定義されている関数が 文字列関係関数をひとつ、 メモリ関係関数を検査すれば多分こと足りるでしょう。 検査が成功すれば、多分他の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 |
もしプログラム中でmemchr
、memset
、strtok
、
strspn
など、BSD系OSに代用になる関数がないような関数を使う場合、
この定義だけでは足りません。
各関数について配布キット中にプログラムコードを添付しなければなりません。
添付したプログラムを必要なときにだけ使うにはどうすればいいでしょう?
(システムのCライブラリに入っている関数の方が最適化されていて
速いかもしれないので)
例えば関数memchr
の場合、
`memchr.c'というファイルを置いて、
`AC_REPLACE_FUNCS(memchr)'を使えば大丈夫です。
HAVE_SYS_WAIT_H
を定義します。
`sys/wait.h'がない場合、exit statusを保持するのにint
でなしに
古いBSDのようにunion wait
を使っている場合にはPOSIX.1非互換です。
`sys/wait.h'がPOSIX.1互換でない場合には、
ヘッダファイルをincludeせず、
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 |
memcpy
やmemcmp
などが`string.h'で定義されておらず、
`memory.h'が存在する場合、NEED_MEMORY_H
を定義します。
このマクロはobsoleteです。
かわりにAC_CHECK_HEADERS(memory.h)
を使ってください。
AC_HEADER_STDC
の例参照。
HAVE_UNISTD_H
を定義します。
このマクロはobsoleteです。
かわりに`AC_CHECK_HEADERS(unistd.h)'を使ってください。
POSIX.1互換かどうか調べるには以下のようにします:
#if HAVE_UNISTD_H # include <sys/types.h> # include <unistd.h> #endif #ifdef _POSIX_VERSION /* Code for POSIX.1 systems. */ #endif |
_POSIX_VERSION
は、POSIX.1互換のシステムで`unistd.h'をinclude
すると定義されます。
`unistd.h'がないシステムは間違いなくPOSIX.1非互換です。
でも、一部のPOSIX.1非互換のシステムには`unistd.h'があります。
rindex
やbzero
がないシステムなら
USG
を定義します。
このマクロは
`string.h'、strrchr
、memset
等が存在すると仮定しています。
USG
はobsoleteです。
このマクロでなしに、AC_HEADER_STDC
の例題をみてください。
以下のマクロは、特定のヘッダファイル用マクロが定義されていない ヘッダファイルを検査するためのものです。 ヘッダファイルがあるかないかだけでなく、中身もチェックしたい場合、 自力で検査マクロを記述しないといけません(see section 5. Writing Tests参照)。
AC_CHECK_HEADERS
を使った方がいいでしょう。
HAVE_header-file
(全部大文字)を定義します。
action-if-foundには、
各々のヘッダファイルがみつかったときに実行したいshellスクリプトを記述します。
action-if-foundを`break'にすると、
最初にヘッダファイルが見つかったところでループを抜けることができます。
action-if-not-foundには、
各ヘッダファイルがみつからなかったときに実行されるshellスクリプトを記述します。
以下のマクロは特定の構造体や構造体のメンバを検査します。
ここにない構造体を検査したい場合、
AC_EGREP_CPP
(see section 5.1 Examining Declarations)やAC_TRY_COMPILE
(see section 5.2 Examining Syntax)を使ってください。
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'をincludeしていて、
しかも`time.h'に複数回includeされた場合に対する対処がないことがあります。
この場合、両方のヘッダファイルを明示的にincludeしてはいけません。
このマクロは、例えば、struct timeval
やstruct timezone
と、
struct tm
を同時に使うプログラムに有効です。
HAVE_SYS_TIME_H
とあわせて使うのがよいでしょう。
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
を定義します。
TM_IN_SYS_TIME
は、struct tm
の定義が欲しければ
`sys/time.h'をincludeせよ、という意味です(訳註: 意訳)。
struct tm
にメンバtm_zone
が定義されているなら、
HAVE_TM_ZONE
を定義します。
グローバル変数tzname
が定義されていたら、HAVE_TZNAME
を定義します。
以下のマクロはCのtypedefを検査します。 検査したいtypedef用に特定のマクロがなくて、 しかも特殊な検査をしたいわけでないのなら、 汎用のtypedef検査マクロが使えます。
4.6.1 Particular Typedef Checks | Special handling to find certain types. | |
4.6.2 Generic Typedef Checks | How to find other types. |
以下のマクロは、`sys/types.h'と`stdlib.h'の中のC typedefを 検査します(もしファイルがあれば、ですが)。
GETGROUPS_T
を、
getgroups
の引数の型(配列の基底型)にあわせて、
gid_t
またはint
に定義します。
mode_t
が定義されていない場合、
Cプリプロセッサマクロmode_t
をint
に#define
します。
off_t
が定義されていない場合、Cプリプロセッサマクロoff_t
を
long
に#define
します。
pid_t
が定義されていない場合、Cプリプロセッサマクロpid_t
を
int
に#define
します。
signal
が
「返り値がvoid
の関数へのポインタ(つまり、(void (*)())
」を
返す場合、RETSIGTYPE
をvoid
に定義します。
さもなくば、RETSIGTYPE
をint
に定義します。
シグナルハンドラ関数を定義するときには、
返り値をRETSIGTYPE
にしましょう:
RETSIGTYPE hup_handler () { ... } |
size_t
が定義されていなければ、Cプリプロセッサマクロsize_t
を
unsigned
と定義します。
uid_t
が定義されていなければ、
Cプリプロセッサマクロuid_t
をint
に、
gid_t
をint
に定義します。
このマクロは、 特定のtypedef検査マクロが提供されていないtypedefについて調べるときに 使います。
#define
します。
もしヘッダファイルが存在するなら、
`stdlib.h'や`stddef.h'についても調べます。
以下のマクロはCコンパイラやマシンアーキテクチャの特性を調べます。
以下にない性質を調べたい場合、
AC_TRY_COMPILE
(see section 5.2 Examining Syntax) か AC_TRY_RUN
(see section 5.4 Checking Run Time Behavior)を使ってください。
WORDS_BIGENDIAN
を定義します。
例えばMotorolaやSPARCなどのCPUがこれにあたります。
IntelやVAXは違います。
const
を完全にサポートしていなければ、
const
を空に#define
します。
世の中にはconst
をサポートしているのに__STDC__
を定義していない
Cコンパイラや、
逆にconst
を完全にはサポートしていないのに__STDC__
を定義している
Cコンパイラがあります。
AC_C_CONST
を使えば、プログラム中では必ずCコンパイラがconst
を
サポートしているつもりで、const
を書けば大丈夫です。
Cコンパイラがconst
をサポートしていなければ、
const
は`Makefile'またはconfiguration header fileで空にされます。
inline
をサポートしていればなにもしません。
inline
がサポートされておらず、__inline__
あるいは
__inline
がサポートされていれば、
inline
を__inline__
か__inline
に#define
します。
どちらもサポートされていなければ空にします。
char
が符号なし(unsigned)だったら、
__CHAR_UNSIGNED__
を定義します。
ただし、Cコンパイラが既に__CHAR_UNSIGNED__
を
定義していたらなにもしません。
long double
型をサポートしていたら、
HAVE_LONG_DOUBLE
を定義します。
世の中には
__STDC__
を定義していないのに
long double
をサポートしているCコンパイラや、
__STDC__
を定義しているのに
long double
をサポートしていないCコンパイラがあります。
HAVE_STRINGIZE
を定義します。文字列化演算子は`#' で、以下のよ
うなマクロ定義の中で見出せます。
#define x(y) #y |
SIZEOF_uctype
をC(またはC++の)基底型typeの
バイトサイズにします。
typeは例えば`int'とか`char *'とかです。
コンパイラが`type'を知らない場合、SIZEOF_uctype
は
0になります。
uctypeは、typeの小文字を大文字に、スペースを下線`_'に、
アスタリスク(`*')を`P'にしたものです。
クロスコンパイルをしている場合、
cross-sizeを指定していればそれが使われます。
クロスコンパイルをしている場合に
cross-sizeが指定されていないと、
configure
はエラーメッセージを出して終了します。
例えば、DEC Alpha AXPで
AC_CHECK_SIZEOF(int *) |
SIZEOF_INT_P
は8になります。
int
が16ビットの場合、INT_16_BITS
を定義します。
このマクロはobsoleteです。
かわりにより汎用的な`AC_CHECK_SIZEOF(int)'を使ってください。
long int
が64ビットの場合、LONG_64_BITS
を定義します。
このマクロはobsoleteです。
かわりにより汎用的な`AC_CHECK_SIZEOF(long)'を使ってください。
以下のマクロはFortran 77コンパイラの特性を検査します。ここに列挙されてい
ない特性を検査するには、AC_TRY_COMPILE
(see section 5.2 Examining Syntax)
や AC_TRY_RUN
(see section 5.4 Checking Run Time Behavior) を使います。まず現在選択されてい
る言語がFortran 77 AC_LANG_FORTRAN77
に設定されていることを確かめ
てください(see section 5.8 Language Choice)。
FLIBS
はこれらのフラグに設定されます。
このマクロは例えば、1つのプログラムや共有ライブラリでC++とFortran 77ソー スコードを混合する必要がある場合に使われることを意図されています。 (see section `Mixing Fortran 77 With C and C++' in GNU Automake)。
例えば、もしC++とFortran 77コンパイラからのオブジェクトファイルが一緒に リンクされなければならないなら、C++コンパイラ/リンカはリンクのために使わ れなければなりません(C++特有のものは、リンク時にグローバルコンストラクタ、 インスタンステンプレート、例外処理等を呼び出す必要が生じるためです)。
しかし、Fortran 77イントリンシックとランタイムライブラリも同様にリンクす
る必要がありますが、C++コンパイラ/リンカは、デフォルトでFortran 77ライブ
ラリを加える方法を知りません。そのため、マクロ
AC_F77_LIBRARY_LDFLAGS
は、これらのFortran 77ライブラリを決定する
ため作られました。
The following macros check for operating system services or capabilities.
CYGWIN
を`yes'に設定します。もしそうでないならCYGWIN
を空文字列に設定します。
EXEEXT
を定義します。典型的にはUNIXなら空文字列に、
Win32やOS/2なら`.exe'に設定します。
OBJEXT
を定義します。典型的にはUNIXなら`o' に、Win32なら
`obj'に設定します。
MINGW32
を`yes'に設定します。そうでないなら
MINGW32
を空文字列に設定します。
configure
の呼び出し時に、ユーザが
`--x-includes=dir'や`--x-libraries=dir'を
指定していたら、指定されたディレクトリを使います。
片方または両方とも指定されていなかったら、
決まっていない値を、
簡単な`Imakefile'をxmkmf
に食わせ、
生成された`Makefile'を調べることで定めます。
もしこれが(xmkmf
がないとかの理由で)失敗したら、
一般的にX Window Systemが置かれるディレクトリを探します。
いずれかの方法で値が決まったら、
shell変数x_includes
とx_libraries
に結果を格納します。
ただし、ディレクトリがコンパイラのデフォルトサーチパスに入っている場合には
値は設定されません。
上記の方法でもディレクトリがわからなかった場合や、
ユーザが`--without-x'を指定していた場合、
no_x
を`yes'に設定します。
no_x
は`yes'でなければ空になります。
AC_PATH_X
の拡張版です。
X_CFLAGS
にXが必要とするCコンパイラのフラグを、
X_LIBS
にリンカのフラグを設定します。
Xがない場合にはX_CFLAGS
に`-DX_DISPLAY_MISSING'を追加します。
このマクロは、
Xを使うプログラムをコンパイルするときに特別なライブラリが必要なら、
それもチェックしてX_EXTRA_LIBS
に追加します。
X11R6特有のライブラリのうち`-lX11'より前に指定しないといけない
ものがあったら、
それをX_PRE_LIBS
に追加します。
configure.in
の中に記述するshellスクリプトの中で、
shell変数interpval
を使えます。
このshell変数の値はシステムが`#!'をサポートしていれば`yes'、
していなければ`no'になります。
HAVE_LONG_FILE_NAMES
を定義します。
HAVE_RESTARTABLE_SYSCALLS
を定義します。
以下のマクロは、ヘッダファイルやライブラリに癖があるなどの理由で、 特別な取扱が必要なOSについてチェックします。 これらのマクロは無理矢理作った逃げ道です (訳註: wartだから「目の上のたんこぶ」とか言ってもいいのだけれど、 それでは意味が通じない)。 本来はよりシステマチックに、ライブラリやヘッダファイルの内容および機能や、 OSで提供される環境について調べるべきです。
_ALL_SOURCE
を定義します。
BSDの機能の一部が使えます。
Cコンパイラを実行するマクロより前に使わないといけません。
LIBS
に追加します。
このマクロはobsoleteです。
かわりにAC_FUNC_GETMNTENT
を使いましょう。
LIBS
に追加します。
このマクロはobsoleteです。
getmntent
を使いたいためにこのマクロを使っていたのなら、
AC_FUNC_GETMNTENT
を使いましょう。
NISサポート入りのパスワード/gid系関数を使いたければ、
`AC_CHECK_LIB(sun, getpwnam)'を使いましょう。
_POSIX_SOURCE
を定義し、`-posix'(GNU Cコンパイラ用)
または`-Xp'(他のCコンパイラ用)をCC
に追加します。
AC_PROG_CC
より後で、しかもCコンパイラを呼び出す他のマクロより先に
呼び出さねばなりません。
_MINIX
と_POSIX_SOURCE
を定義し、
_POSIX_1_SOURCE
を2に定義します。
こうするとPOSIXの機能が使えます。
Cコンパイラを実行するマクロより前に使わないといけません。
LIBS
に追加します。
このマクロはobsoleteです。
かわりにAC_FUNC_STRFTIME
を使いましょう。
LIBS
に追加します。
また、`dirent.h'が使われていたら、`-ldir'を出力変数LIBS
に
追加します。
このマクロはobsoleteです。
AC_HEADER_DIRENT
を使いましょう。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |