ファイヤープロジェクト
変数をソースに取り込む
2003-09-10T07:40+09:00   matsu
GNUコーディング規約によると,--version,--helpは必須オプションである.一方,configure.inのマクロではAM_INIT_AUTOMAKEでパッケージ名とバージョンを指定する.指定したのなら,ソースでその値を参照したい.この頁ではそれをやってみる.
configure.inで指定するマクロAM_INIT_AUTOMAKEによって生成される変数の値をソースに自動で組み込んむことを目標にしてみる.より具体的にはバージョン情報,パッケージ名をマクロによって定義される値から引っ張って--versionオプション指定によってそれらの値を出力する.
今回作成するパッケージの構成は,前頁と同じである.
$ ls -R
.:
src

./src:
hello.c  hello_sub.c
hello.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してみる.
$ 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:233
hello.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玉を置いておく.これ.
matsu(C)
Since 2002
Mail to matsu