変数をソースに取り込む
GNUコーディング規約によると,--version,--helpは必須オプションである.一方,configure.inのマクロではAM_INIT_AUTOMAKEでパッケージ名とバージョンを指定する.指定したのなら,ソースでその値を参照したい.この頁ではそれをやってみる.
configure.inで指定するマクロAM_INIT_AUTOMAKEによって生成される変数の値をソースに自動で組み込んむことを目標にしてみる.より具体的にはバージョン情報,パッケージ名をマクロによって定義される値から引っ張って--versionオプション指定によってそれらの値を出力する.
今回作成するパッケージの構成は,前頁と同じである.
$ ls -R .: src ./src: hello.c hello_sub.chello.cのmain関数から,hello_sub.cの関数を呼び出すプログラムである.この場合,configure.inは以下のようになる.
# Process this file with autoconf to produce a configure script. AC_INIT(src/hello.c) AM_INIT_AUTOMAKE(hello, 1.20) # Checks for programs. AC_PROG_CC AC_PROG_INSTALL # Checks for libraries. # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile src/Makefile)こちらも(バージョン以外)前頁と同様である.今回はこの中のマクロAM_INIT_AUTOMAKEによって設定されるVERSIONをソースファイルで使用してみる.configureスクリプトを実行すると,以下のようになる.
$ grep "VERSION" src/Makefile VERSION = 1.20 DEFS = -DPACKAGE=\"hello\" -DVERSION=\"1.20\" -DSTDC_HEADERS=1 -DHAVE_STDLIB_H=1 -I. -I$(srcdir) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) $ grep "DEFS" src/Makefile DEFS = -DPACKAGE=\"hello\" -DVERSION=\"1.20\" -DSTDC_HEADERS=1 -DHAVE_STDLIB_H=1 -I. -I$(srcdir) COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)すなわちソースでVERSION,PACKAGEが使用できる.
前節で要点は終ったのだが,私自身の練習のため,ソースを書いてみる.--version指定によりVERSIONの値を出力する.VERSIONの参照部分だけ以下に示す(最終的に出来上がるtar玉は末尾).
fprintf(stdout, "%s : version %s", argv[0], VERSION);続く.
前節の作業で,hello.cは激しく修正された.以下に要点を示す.
- getopt.hをインクルードし引数の解析にgetopt_longを使用.
- getopt_longを使用するにあたりmallocを使用
options = malloc ((OPTION_NUM + 1) * sizeof(struct option));
$ autoscan configure.in: warning: missing AC_FUNC_MALLOC wanted by: src/hello.c:22 configure.in: warning: missing AC_PROG_AWK wanted by: Makefile.in:155 configure.in: warning: missing AC_PROG_LN_S wanted by: Makefile.in:233hello.cでmallocを使用しているので,ビルド環境にmalloc関数があるかをチェックするため,configure.inにAC_FUNC_MALLOCを指定した方がいいらしい.また,Makefile.inでawk,lnを使用するので,それらのコマンドをチェックするためAC_PROG_AWK,AC_PROG_LN_Sもconfigure.inに記述したほうがよいらしい.記述してみた.
# Process this file with autoconf to produce a configure script. AC_INIT(src/hello.c) AM_INIT_AUTOMAKE(hello, 1.20) # Checks for programs. AC_PROG_CC AC_PROG_INSTALL AC_FUNC_MALLOC AC_PROG_AWK AC_PROG_LN_S # Checks for libraries. # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile src/Makefile)もう一度autoscan
$ autoscan問題ないらしい.で,autoconf.
$ autoconf autoconf: Undefined macros: configure.in:8:AC_FUNC_MALLOC嫌な雰囲気だ.AutomakeのinfoによるとそれっぽいものとしてAC_FUNC_ALLOCAがあるようだ.で,それをAC_FUNC_MALLOCのかわりに記述.
$ ./configure ...省略... checking for alloca... yes checking for mawk... mawk checking whether ln -s works... yes ...省略...うん,チェックしてくれてるようだ.最後に今回作成したtar玉を置いておく.これ.

