Previous: Test Functions, Up: Writing Test Programs


6.2.3 ソースの生成

Autoconfは,テストソースファイルを生成するために使用することが可能なマク ロの組みを提供しています.それらは,一般的な言語で書かれていて,すなわち, それらは実際に現在の言語(see Language Choice)に依存して適切な出力 “フォーマット”になっています.

— Macro: AC_LANG_CONFTEST (source)

現在のテストソースファイルにsourceのテキストを保存します. conftest.extensionextensionは現在の言語に依存します.

通常のAutoconfマクロ引数のように,sourceは一度だけ評価され,そのた め,(i)マクロ呼び出しに渡してもかまわず,(ii)そうでなければ,必要があれ ば二重に引用符で囲む必要があることに注意してください.

— Macro: AC_LANG_SOURCE (source)

すべてのAC_DEFINEで実行されるこれまでの定義を用いて,source に展開します.

例えば,以下を実行します(二重の引用符を守ってください!).

     AC_INIT(Autoconf Documentation, 2.59, bug-autoconf@gnu.org)
     AC_DEFINE([HELLO_WORLD], ["Hello, World\n"])
     AC_LANG_CONFTEST(
        [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])])
     gcc -E -dD conftest.c -o -

結果は以下のようになります.

     # 1 "conftest.c"
     # 1169 "configure"
     
     # 1 "confdefs.h" 1
     
     #define PACKAGE_NAME "Autoconf Documentation"
     #define PACKAGE_TARNAME "autoconf-documentation"
     #define PACKAGE_VERSION "2.59"
     #define PACKAGE_STRING "Autoconf Documentation 2.59"
     #define PACKAGE_BUGREPORT "bug-autoconf@gnu.org"
     #define HELLO_WORLD "Hello, World\n"
     # 1170 "configure" 2
     
     const char hw[] = "Hello, World\n";
— Macro: AC_LANG_PROGRAM (prologue, body)

prologueの内容と,bodyをmain関数(例えばCのmain)として ソースファイルに展開します.それはAC_LANG_SOURCEを使用するので, 後者の機能は利用可能です.

例えば以下のようにします.

     AC_INIT(Autoconf Documentation, 2.59, bug-autoconf@gnu.org)
     AC_DEFINE([HELLO_WORLD], ["Hello, World\n"])
     AC_LANG_CONFTEST(
     [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
                      [[fputs (hw, stdout);]])])
     gcc -E -dD conftest.c -o -

結果は以下のようになります.

     # 1 "conftest.c"
     # 1169 "configure"
     
     # 1 "confdefs.h" 1
     
     #define PACKAGE_NAME "Autoconf Documentation"
     #define PACKAGE_TARNAME "autoconf-documentation"
     #define PACKAGE_VERSION "2.59"
     #define PACKAGE_STRING "Autoconf Documentation 2.59"
     #define PACKAGE_BUGREPORT "bug-autoconf@gnu.org"
     #define HELLO_WORLD "Hello, World\n"
     # 1170 "configure" 2
     
     const char hw[] = "Hello, World\n";
     int
     main ()
     {
     fputs (hw, stdout);
       ;
       return 0;
     }
— Macro: AC_LANG_CALL (prologue, function)

prologueの内容と,functionの呼び出しをmain関数(例えばCの main)の本体としてソースファイルに展開します.それは AC_LANG_SOURCEを使用するので,後者の機能は利用可能です.

この関数は,おそらく将来の引数指定が利用可能なバージョンで置換されます. このマクロは特定のシステムをひどく侵害するので,その使用は推奨しません.

— Macro: AC_LANG_FUNC_LINK_TRY (function)

main関数(例えばCではmain)の本体として,偽のfunctionを使用し ている内容をソースファイルに展開します.単純な(関数ポインタの)割当です. それはAC_LANG_SOURCEを使用するので,後者の機能は利用可能です.

AC_LANG_CALLがあるので,このマクロは,補完の意味で説明しています. ひどく壊れていて,(適切な型の引数を用いた)実際の関数の呼び出しに将来は変 更しようと考えています.