前の日 / 次の日 / 2009-09
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2009-09-20 Sun

autoconf 学び直し その2

autoconfの学び直し、その2回目。

以前いじくった時は特に難しいことを必要としなかったので、キチンとメモを残しておかなかったので、ちゃんと残す。

環境によって挙動を変えるように設定したい。

前回はさんざんやってみて、一旦ひな形を作ってmakeするとこまでできた。
次は、m4マクロを勉強する。

前回の参考文献


- Automakeでmakeする
-- http://www.02.246.ne.jp/~torutk/cxx/automake/automake.html
- Autotoolsの入力ファイルと出力ファイル
-- http://www.fireproject.jp/feature/automake/
- automake
-- http://www.geocities.jp/fut_nis/html/automake-ja/Public-macros.html
- MODULE.JP - SpiderMonkeyをGNU Autotools対応する
-- http://module.jp/blog/autotoolize_spidermonkey.html
- COPYING(GPLの規約が書いてある)が勝手に作られる
-- http://d.hatena.ne.jp/ultraist/20070707
- autoconf & automake
-- http://www.jaist.ac.jp/~kiyoshiy/memo/autoconf.html

復習


$ cp ../../autoconf_practice/trunk/practice.c .
$ ls
practice.c
$ echo 'SUBDIRS = src' > Makefile.am
$ mkdir src; mv practice.c ./src
$ cp ../../autoconf_practice/trunk/src/practice2.c ./src
$ emacs ./src/Makefile.am
bin_PROGRAMS = practice
practice_SOURCES = practice.c practice2.c

$ ls
Makefile.am autoscan.log configure.scan src/
$ mv configure.scan configure.ac
$ ls
Makefile.am autoscan.log configure.ac src/
$ emacs configure.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

FULL-PACKAGE-NAME=huffman
VERSION=0.0.1_01
BUG-REPORT-ADDRESS=overlasting<at>gmail<dot>com
AUTOMAKE_VERSION=1.4-p6

AC_PREREQ(2.61)
AC_INIT(huffman, 0.0.1_01, overlasting<at>gmail<dot>com)
# AC_INIT_AUTOMAKE(huffman, 0.0.1_01)
AM_INIT_AUTOMAKE([foreign 1.4-p6])

AC_CONFIG_AUX_DIR(config)
AC_CONFIG_SRCDIR([src/practice.c])
AM_CONFIG_HEADER(config.h)

$ touch NEWS AUTHORS ChangeLog README
$ mkdir config
$ autoheader
$ automake --add-missing
$ autoconf
$ ./configure
$ make
$ ./src/practice -> practice動いた

今回の参考文献


- Super Technique 講座〜m4 チュートリアル
-- http://www.nurs.or.jp/~sug/soft/super/m4.htm

今回


- m4とは?
-- 汎用的なマイクロプロセッサなのだそうだ
- 特徴
-- マクロに改行を含むことができるそうだ
--- Cのマクロのように1行じゃなくても大丈夫ということ
-- 任意の文字セットをトークンとして再定義できるらしい。
-- 有用な組み込み関数をもっているらしい
-- 組み込み関数の挙動に制限を加えられるらしい
-- 再帰定義を活用してループを実現するのだそう
- m4はさまざまな便利ツールのなかで使われている
-- 例、autoconf
--- configure.acやinではm4マクロ使い倒してる
--- 凝ったconfigure.acを書くにはm4の挙動を知る必要がある
- m4はテキストの入力を受け付けるツール

m4のバージョンを見てみた実行してみた。
今のdebian etchに入ってるのはver 1.4.8だった。
m4は多分枯れてるだろうし平気かな。
$ m4 --version
GNU M4 1.4.8
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Written by Rene' Seindal.


- m4の組み込み関数は「ディレクティブ」と呼ばれる。
- ディレクティブは日本語の文字コードにまともに対応していない
-- 日本語を含んだファイルをm4に食わせる場合には気をつけるのだ

- define() : マクロ定義に関するディレクティブ
-- cのdefineみたいなもの
- 例、XXX を YYY に置き換えたいとする
-- m4のdefineでの書き方
--- define(`XXX', `YYY')
-- cのdefineの書き方
--- #define XXX YYY
-- one two three : XXX. を変換すると
--- m4の場合
define(`XXX', `YYY')
one two three : XXX.



one two three : YYY.


--- cの場合の例
#define XXX YYY
one two three : XXX.


# 1 ""

one two three : YYY .


- m4と比較して、cのdefineは「行番号の追加」と「変換後の余分な空白の追加」という副作用がある。
-- m4はマクロ定義が空行になる。cではマクロ定義が行番号表示+改行になる。

- トークンの区切りは空白か改行
- m4はトークンを変換してできた tokens がさらに変換できる場合には変換する
- ディレクティブの連続は空行の連続ではなく、1つの空行に変換される
define(`XXX', `YYY YY')
define(`YYY', `ZZZ')
one two three : XXX.



one two three : ZZZ YY.


- m4のトークンの表記はC言語の変数の表記とルールが同じ
-- 大文字と小文字は当然区別される

- indir() : 強制的に置換
define(`XXX', `YYY YY')
define(`YYY', `ZZZ')
define(`x', `X')
one two three : indeir(`x')XX.



one two three : ZZZ YY.

に変換される。

- マクロは改行を含んでいてもOK。m4は執念深く「'」を探す
define(`XXX', `YYY
YY')
define(`YYY', `ZZZ')
define(`x', `X')
one two three : indeir(`x')XX.



one two three : ZZZ
YY.

に変換される。

- クォート「`'」は文字列をトークンで無くす
- m4はマクロへの変換が終了したら、1重だけ「`文字列'」を「文字列」に変換する
define(`XXX', `YYY')
define(XXX, `ZZZ')
one two three : XXX YYY.



one two three : ZZZ ZZZ.


になる。

なんでこうなるのか、と言うと
- define(XXX, `ZZZ')がdefine(YYY, `ZZZ')に変換される
- そのためdefine(`XXX', `YYY')の実行結果はdefine(`XXX', `ZZZ')と同じになる
-- 結果的にdefine(`XXX', `ZZZ')とdefine(`YYY', `ZZZ')が定義された状態になる

- マクロに変換した文字列がトークンになって欲しくない場合は、マクロ定義で文字列を2重クォートすれば良い。
-- トークンが置換された時に、マクロにクォートが残るので変換後の文字列がトークン扱いされない。かつ終了時に1重のクォートが消える。

define(`XXX', ``YYY'')
define(XXX, `ZZZ')
one two three : XXX YYY.



one two three : YYY ZZZ.

となる。

- テキスト側にクォートを仕込む事ができる。
-- 1重のクォートでマクロ置換を拒む事ができる
-- クォート自体を残したければ2重でクォートすれば良い

define(`XXX', `YYY')
define(XXX, `ZZZ')
one two three : `XXX' ``YYY''.



one two three : XXX `YYY'.


- m4はCと同じく引数付きマクロが定義できる
-- 引数に$0, $1, ...のような名前がつく
--- $0 : マクロの名前
--- $# : 引数の個数
--- $* or $@ : すべての引数を「,」で結合したもの
--- $*は結合時に引数のクォートを1重だけ外す
--- $@は結合時にクォートを外さない

define(`keyval',`$1 => $2')
keyval(`1',`one')
keyval(`2',`two')
keyval(`3',`three')



1 => one
2 => two
3 => three

になる

- m4の引数付きマクロは、引数の過不足に警告を出さない
-- 多すぎる場合は無視をする。少ない場合には空文字列になる。

define(`echo1',`$*')
define(`echo2',`$@')
define(This,That)
echo1(`This',`is',`a',`pen')
echo1(``This'',`is',`a',`pen')
echo2(`This',`is',`a',`pen')
echo2(``This'',`is',`a',`pen')



That,is,a,pen
This,is,a,pen
This,is,a,pen
`This',is,a,pen

になる。



つかれた。続きは後日。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |