[Profile] [Emacs] [Software] [Webware] [Home]
[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13. 各種ツールのコンパイル

GNU ソフトウェアのほとんどが configure スクリプト方式を使っていて、 configure スクリプトを実行することにより OS の違い、ライブラリやヘッダの違 いを判断し、適切な Makefile が作成される。

Cygwin ではこの「configure が正常に行なえること」を開発目標のひとつとして いるほどで、ほとんどのものが問題なく実行可能である。

ただし、configure が成功しからと言って make がエラーなく終わるわけではない し、make が成功したからと言って期待通りに実行可能であると言うわけではない のだが。

GNU ソフトウェアの標準的なコンパイル方法を示そう。

  1. tar zxvf foo.tar.gz でソースファイルを展開する。
  2. README、INSTALLを読む。
  3. configure を実行する。
  4. make を実行する。
  5. make installを実行する。

もしうまくいかなかった場合には Cygwin 用のパッチを誰かが作っているかもしれ ないので Internet で検索してみよう。運が良ければ見つかるでしょう、いや、た いてい見つかるはずである。

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.1 install.exe のコンパイル

多くのGNUツールはインストールを行なう場合に make install で

install foo /usr/local/bin

を起動する。しかし、Windows での実行ファイルのファイル名には `.exe' という拡張子が付いているためたいていの場合これではインストールに失敗してし まう。

そこで、install foo /usr/local/bin で foo がない場合には foo.exe を扱うよ うにしたパッチがあるのでそれを使う。前述の方法にパッチをあてるという手順が 増えるだけだ。

  1. ソースを展開する。

    GNU のミラーサイトから fileutils-3.16.tar.gz を入手、Cygwin 環境用のパッチは cygwin develop メーリングリストで流れた ginstall.zip 中に含まれる install.diff を使う。(http://www.cygnus.com/ml/gnu-win32/1998-Mar/0116.html 今月の LibCD Vol.xx には両者を収録している。

    tar zxf fileutils-3.16.tar.gz で展開し、ginstall.zip は zip 形式を展開できるツールで展開する。

    % tar zxf fileutils-3.16.tar.gz
    % unzip -x ginstall.zip 
    Archive:  ginstall.zip
      inflating: install.diff            
      inflating: install.exe             
    %
    

  2. README、INSTALLを読む。

    READMEにはfileutilsにどんなコマンドが含まれるのかとその概要が書かれていて る。INSTALLにはインストール方法が書かれているので一読しよう。

  3. パッチをあてる。

    ソースディレクトリに移動して patch コマンドを実行してパッチをあてる。

    % cd fileutils-3.16/src/
    % patch -b --verbose -p1 < ../../install.diff
    Hmm...  Looks like a unified diff to me...
    The text leading up to this was:
    --------------------------
    |--- org/install.c	Fri Feb 13 00:48:37 1998
    |+++ new/install.c	Mon Mar 02 20:16:19 1998
    --------------------------
    Patching file `install.c' using Plan A...
    Hunk #1 succeeded at 78.
    Hunk #2 succeeded at 311.
    Hunk #3 succeeded at 336.
    Hunk #4 succeeded at 367.
    Hunk #5 succeeded at 381.
    Hmm...  Ignoring the trailing garbage.
    done
    % 
    

    これでオリジナルのものが `install.c.orig' というファイル名になり、パッ チをあてた `install.c' ができあがる。

  4. configure の実行

    fileutils-3.16 ディレクトリで以下のように実行する。

    % ./configure
    loading cache ./config.cache
    checking for a BSD compatible install... /CYGNUS/CYGWIN~1/H-I586~1/BIN/install -c
    checking whether build environment is sane... yes
    checking whether make sets ${MAKE}... yes
    checking whether to enable maintainer-specific portions of Makefiles... no
    checking for ln... /CYGNUS/CYGWIN~1/H-I586~1/BIN/ln
    checking for mv... /CYGNUS/CYGWIN~1/H-I586~1/BIN/mv
    checking for rm... /CYGNUS/CYGWIN~1/H-I586~1/BIN/rm
    checking for perl... /usr/local/BIN/perl
    checking for gcc... gcc
             :
    updating cache ./config.cache
    creating ./config.status
    creating Makefile
    creating doc/Makefile
    creating intl/Makefile
    creating lib/Makefile
    creating man/Makefile
    creating m4/Makefile
    creating po/Makefile.in
    creating src/Makefile
    creating config.h
    linking ./intl/libgettext.h to intl/libintl.h
    %
    

  5. make を実行する。

    % make
    make all-recursive
    Making all in lib
    gcc -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../intl  -g -O2 -c getdate.c
    gcc -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../intl  -g -O2 -c posixtm.c
    gcc -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../intl  -g -O2 -c getopt.c
        :
        :
    gcc -DLOCALEDIR=\"/usr/local/share/locale\" -DSHAREDIR=\"/usr/local/share\" -DHAVE_CONFIG_H -I.. -I. -I../lib -I../intl  -g -O2 -c df.c
    gcc  -o df  df.o ../intl/libintl.a ../lib/libfu.a 
    Making all in doc
    make[2]: Nothing to be done for `all'.
    Making all in man
    make[2]: Nothing to be done for `all'.
    Making all in m4
    make[2]: Nothing to be done for `all'.
    Making all in po
    make[2]: Nothing to be done for `all'.
    %
    

  6. インストール

    ここで make installを実行するのだが、今回は fileutils 中の `install.exe' だけが欲しいのでこういう場合は手動でインストールを行なっ てもよいだろう。

    % cp -p fileutils-3.16/src/ginstall.exe /usr/local/bin/install.exe
    

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2 RCS(Revision Contorol System)

UNIX のバージョン管理システムとしてよく使われている RCS を取り上げる。

RCS はその名前が示すようにプログラム(プログラムに限らず LaTeX 文書などのテキ スト形式のファイルであればなんでも利用可能である)のバージョンを管理するツー ルでり以下のような特徴を持つ。

どちらかと言えば小規模(少人数)向け、個人利用向けのシステムであるので、入門 には最適であると考え取り上げた。なお、多人数でのバージョン管理には CVS (Concurrent Versions System)をお勧めする。

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2.1 RCS のコンパイル

これも前述の手順に従ってコンパイルする。

  1. ソースファイルを展開する。

    % cd /usr/local/src
    % tar zxf rcs-5.7.tar.gz
    % cd rcs-5.7
    

  2. ソースを修正する。

    rcs-5.7/src/rcslex.c 1115行目を以下のように修正します。

    	int fd = fdSafer(open(name, O_RDONLY
    #		if OPEN_O_BINARY
    			|  (strchr(type,'b') ? OPEN_O_BINARY : 0)
    #		endif
    

    を以下のように修正する。

    int fd = fdSafer(open(name, O_RDONLY # if OPEN_O_BINARY && !(has_mmap && large_memory) /* <-- 追加 */ | (strchr(type,'b') ? OPEN_O_BINARY : 0) # endif

  3. configureを実行する。
    % ./configure
    creating cache ./config.cache
    checking diff basename... diff
    checking for diff... /CYGNUS/CYGWIN~1/H-I586~1/BIN/diff
    checking diff success status... 0
    checking diff failure status... 1
    checking diff trouble status... 2
    checking diff options for RCS... -an
    checking diff -L... yes
    checking diff3 -m... yes
    checking for diff3... /CYGNUS/CYGWIN~1/H-I586~1/BIN/diff3
             :
    checking whether make sets ${MAKE}... yes
    updating cache ./config.cache
    creating ./config.status
    creating Makefile
    creating man/Makefile
    creating src/Makefile
    %
    

  4. makeを実行する。
    % make
    cd man && make all
    make[1]: Nothing to be done for `all'.
    cd src && make all
    rm -f a.*
    ALL_CFLAGS=' -Dhas_conf_h  -I. -I. -g -O' \
    CC='gcc' \
    COMPAT2='0' \
    DIFF3='/CYGNUS/CYGWIN~1/H-I586~1/BIN/diff3' DIFF3_BIN='1' \
    DIFF='/CYGNUS/CYGWIN~1/H-I586~1/BIN/diff' DIFFFLAGS='-an' DIFF_L='1' \
        :
    gcc  -g -O rcsdiff.o rcsutil.o rcsfnms.o rcsmap.o rcsrev.o rcssyn.o rcslex.o maketime.o partime.o rcstime.o rcskeep.o rcskeys.o version.o  -o rcsdiff 
    gcc -c  -Dhas_conf_h  -I. -I. -g -O rcsmerge.c
    gcc  -g -O rcsmerge.o merger.o rcsutil.o rcsfnms.o rcsmap.o rcsrev.o rcssyn.o rcslex.o rcskeep.o rcskeys.o maketime.o partime.o rcstime.o version.o  -o rcsmerge 
    gcc -c  -Dhas_conf_h  -I. -I. -g -O rlog.c
    gcc  -g -O rlog.o rcslex.o rcsmap.o rcssyn.o rcsrev.o rcsutil.o maketime.o partime.o rcstime.o rcsfnms.o rcskeep.o rcskeys.o version.o  -o rlog 
    % 
    

  5. インストールする。
    % make install
    cd man && make install
    ./../mkinstalldirs /usr/local/man/man1 /usr/local/man/man5
    for m in ci co ident merge rcs rcsclean rcsdiff rcsintro rcsmerge rlog; do \
    	/usr/local/BIN/install -c -m 644 ./$m.1 /usr/local/man/man1/$m.1; \
    done
    { test -f rcsfile.5 || cd .; } && \
    /usr/local/BIN/install -c -m 644 rcsfile.5 /usr/local/man/man5/rcsfile.5
    cd src && make install
    ./../mkinstalldirs /usr/local/bin
    for p in ci co ident merge rcs rcsclean rcsdiff rcsmerge rlog; do \
      /usr/local/BIN/install -c $p /usr/local/bin/$p; \
    done
    % 
    

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.2.2 MeadowからのRCSの利用

    では実際に Meadow から使ってみよう。

    ここでは `hello.c' というファイルを編集するものとする。`hello.c' のあるディレクトリの下に RCS という RCS のファイル保存用のディレクトリを作 成する。

    % ls -l
    total 1
    drwxr-xr-x   2 kose     bingo           0 Jul 11 23:06 RCS
    -rw-r--r--   1 kose     bingo          89 Jul 11 23:09 hello.c
    % 
    

    図2-8`hello.c' を編集中の画面で、まだ チェックイン前のものだ。

    ★「図2-8 hello.c チェックイン前」

    次にチェックインを行う。Meadow からの最初のチェックインは C-x v i で 行う。チェックイン後は 図2-9 のようになる。下か ら2行目の白黒反転したモードラインに RCS-1.1 という表示があり、こ の `hello.c' が RCS の管理下にあり、バージョン1.1 であること、 ロックしていない書き込み禁止ファイルであることもわかる。

    ★「図2-9 hello.c チェックイン後」

    これをロック付きでチェックアウトを行い、編集可能状態にするのは C-x C-q である。チェックアウトを行うとモードラインには RCS:1.1 とい う表示に変わりロック付きチェックアウトしてあることがわかる。 (図2-10)

    ★「図2-10 version 1.1チェックアウト」

    この状態で編集を行う。編集が終わったらチェックインを行なう。チェックインは C-x C-q である。C-x C-q を入力すると 図2-11 のようなログ入力画面となるのでバージョン1.1 から1.2への変更のログ を書きこみ、C-c C-c でチェックインを行なう。チェックイン後は再び 図2-12 のようなロックしていない書き込み禁止状態 となる。バージョンはこのように自動的に1.1、1.2、1.3‥と振られる。

    ★「図2-11 version 1.2のチェックイン」
    ★「図2-12 version 1.2」

    ここで C-x v l と押下するとさきほど入力した編集のログを読むことがで きる。(図2-13)

    ★「図2-13 編集ログ」

    任意のバージョンを参照したい場合は C-x v ~ version RET である。 C-x v ~ 1.1 RET でバージョン1.1を取り出した画面を 図2-14 に示す。このように任意のバージョンを参照し ながら編集が可能なのである。

    ★「図2-14 version1.1の参照画面」

    主なキーバインドをまとめると以下のようになる。

    C-x C-q チェックイン、チェックアウトのトグル動作
    C-x v i 最初にチェックインする。
    C-x v l RCSのログ表示
    C-x v ~ 任意のバージョンの表示
    C-x v = 最新バージョンと編集中のものの表示

    図2-15 は最後にチェックインしたものと現在編集 中のものの diff(差分)を取って、それの変更個所を色分け表示したものである。 これが

    M-x ediff-revision RET RET
    

    だけでできるのである。もう著者などはこの機能なしでは何も書けないという状態 にあるのである。Cソースや、Emacs Lisp は言うの及ばず、文書(LaTeXも含む)であっ てもこの RCS の管理下に置いているのである。

    ★「図2-15 ediffの表示画面」

    目の覚めるような能率アップにつながること受けあいである。

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.3 jgrepのコンパイル

    Meadow を使いこなしていくうちに Cygwin に含まれている grep では日本語の検 索ができないため、「日本語の検索ができたらいいのに」と思うはずである。そこ で足りないものはコンパイルしようとなるのであった。

    日本語対応 grep は vimを日本語対応にした jvim に含まれていて以下のURLから 入手可能だ。今月の LibCDVol.xx に収録。

    オリジナルの `vim-3.0.tar.gz' にパッチをあて jvim とする。

    % tar zxf jvim.1.5a.tar.gz
    % tar zxf vim-3.0.tar.gz
    % cd vim
    % patch -b --verbose -p0 < jvim.diff 
    Hmm...  Looks like a new-style context diff to me...
    The text leading up to this was:
    --------------------------
    |diff -crN ../orig/doc.j/cygwin.txt ./doc.j/cygwin.txt
    |*** ../orig/doc.j/cygwin.txt	Thu Jan 01 09:00:00 1970
    |--- ./doc.j/cygwin.txt	Sat Jan 09 01:19:58 1999
    --------------------------
    Patching file `./doc.j/cygwin.txt' using Plan A...
    Hunk #1 succeeded at 1.
    Hmm...  The next patch looks like a new-style context diff to me...
    The text leading up to this was:
    --------------------------
    |diff -crN ../orig/doc.j/differen.doc ./doc.j/differen.doc
    |*** ../orig/doc.j/differen.doc	Thu Jan 01 09:00:00 1970
    |--- ./doc.j/differen.doc	Sun Jun 16 17:13:08 1996
    --------------------------
    Patching file `./doc.j/differen.doc' using Plan A...
    Hunk #1 succeeded at 1.
    Hmm...  The next patch looks like a new-style context diff to me...
    The text leading up to this was:
    --------------------------
    |diff -crN ../orig/doc.j/fepctrl.doc ./doc.j/fepctrl.doc
          :
    |--- ./src/winjnt.c	Sun Apr 04 09:43:50 1999
    --------------------------
    Patching file `./src/winjnt.c' using Plan A...
    Hunk #1 succeeded at 1.
    Hmm...  The next patch looks like a new-style context diff to me...
    The text leading up to this was:
    --------------------------
    |diff -crN ../orig/src/xargs.c ./src/xargs.c
    |*** ../orig/src/xargs.c	Thu Jan 01 09:00:00 1970
    |--- ./src/xargs.c	Sat May 09 23:12:58 1998
    --------------------------
    Patching file `./src/xargs.c' using Plan A...
    Hunk #1 succeeded at 1.
    done
    %
    

    jvim は Cygwin に対応済みなので、makefile 中で Cygwin 用のコンパイルスイッ チを選択するだけで make することができる。それに関しては附属のドキュメント の vim/doc.j/cygwin.txt に詳細が記されているので参照のこと。

    以下のように makjunix.mak を編集する。

    # cygwin (TESTED B20.1 coolview patch)
    #
    #MACHINE = -DBSD_UNIX
    #CC=gcc -O
    #LIBS = -lncurses
    

    を以下のように変更する。

    # cygwin (TESTED B20.1 coolview patch) # MACHINE = -DBSD_UNIX CC=gcc -O LIBS = -ltermcap

    あとは以下のようにすれば

    % cd src
    % make -f makjunix.mak grep
    gcc -O -c -DBSD_UNIX -DDIGRAPHS -DTERMCAP -DSOME_BUILTIN_TCAPS -DNO_FREE_NULL -DVIM_ISSPACE -DWEBB_COMPLETE -DWEBB_KEYWORD_COMPL -DVIM_HLP=\"/usr/local/lib/vim.hlp\" -DKANJI -DTRACK -DCRMARK -DFEXRC -DUSE_GREP -DUSE_OPT  -I. grep/grep.c
    grep/grep.c: In function `getarg':
    grep/grep.c:810: warning: passing arg 1 of `bsdmemset' from incompatible pointer type
           :
    gcc -O -c -DBSD_UNIX -DDIGRAPHS -DTERMCAP -DSOME_BUILTIN_TCAPS -DNO_FREE_NULL -DVIM_ISSPACE -DWEBB_COMPLETE -DWEBB_KEYWORD_COMPL -DVIM_HLP=\"/usr/local/lib/vim.hlp\" -DKANJI -DTRACK -DCRMARK -DFEXRC -DUSE_GREP -DUSE_OPT  regsub.c
    gcc -O -o grep/grep grep.o alloc.o charset.o kanji.o regexp.o regsub.o -ltermcap 
    % 
    

    これで `src/grep' ディレクトリの下に `grep.exe' ができあがる。こ こではオリジナルの Cygwin の grep も使えるように jgrep という名前にし、 `/usr/local/bin/jgrep.exe' と置く。

    grep の使い方の詳しい説明は vim/doc.j/readme.doc にあるの で参照のこと。

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.3.1 Meadowからのjgrepの呼出し

    Meadow からは以下のように入力して使う。

    M-x grep RET 検索文字列 RET

    その時に必要になる設定を以下に示す。これを .emacs に追加する。この grep で は検索するファイルの文字コードは自動判定で、出力する文字コードは Shift JIS となっているので、特にそれの指定の必要はない。

    (setq grep-program "jgrep.exe")
    

    (if (and (= 20 emacs-major-version) (= 2 emacs-minor-version)) (if (functionp 'orig-start-process) () (fset 'orig-start-process (symbol-function 'start-process)) (defun start-process (name buffer program &rest args) (interactive) (apply 'orig-start-process name buffer program (mapcar (lambda (arg) (encode-coding-string arg file-name-coding-system)) args)))))

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.4 mmencodeのコンパイル

    part1 で述べた Nana-gnus で使う MIME(Multipurpose Internet Mail Extensions) のための base64 エンコーダ、デコーダである mmencode のコンパイルを行なう。

    mmencode のソースファイルは ftp://thumper.bellcore.com/pub/nsb/mm2.7.tar.Z に含まれている。今月のLibCDXXの収録した。 これを展開する。

    % tar zxf mm2.7.tar.Z 
    

    次に `mm2.7/src/metamail/mmencode.c' を修正する。

    #ifdef MSDOS
        if (fp == stdin) setmode(fileno(fp), O_BINARY);
    #endif /* MSDOS */
        if (which == BASE64) {
    

    を以下のような追加を行なう。これでデコードの時のファイ ルモードをバイナリにしている。

    #ifdef MSDOS
        if (fp == stdin) setmode(fileno(fp), O_BINARY);
        if(!encode) setmode(fileno(fpo), O_BINARY); /* <-- 追加 */
    #endif /* MSDOS */
        if (which == BASE64) {
    

    あとは以下のようにコンパイルを行ない、できあがった mmencode.exeは /usr/local/bin へ置く。

    % cd mm2.7/src/metamail/
    % make CC=gcc mmencode
    rm -f mmencode.o
    gcc -c  -I.. -g -I.    mmencode.c
    rm -f codes.o
    gcc -c  -I.. -g -I.    codes.c
    rm -f mmencode
    gcc -I.. -g -I.    -o mmencode  mmencode.o  codes.o 
    %
    % cp mmencode.exe /usr/local/bin
    %
    

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.4.1 Meadowからの使うための準備

    ホームディレクトリの下に以下の内容を書いた .mailcap というファイルを置く。 これで MIME 形式のメールの Content-Type: が、image/gif や image/jpeg など の画像ファイルは fiber というアプリケーションで再生するという指示を行なっ ている。

    image/*; fiber %s
    application/octet-stream; fiber %s
    

    fiber (File Inspect and Broking End Resolver) は Windows で関連付けされた アプリケーションを自動的に起動するという優れものでなのである。fiber は Meadow 同封されていて `c:/Meadow/1.00/bin/' に置いてあるのでこれをパ スの通った所へ置けば良い。

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.4.2 Meadowからの使い方(再生編)

    Nana-gnus からメールに添付された画像ファイルを表示している画面を 図2-16に示す。

    操作はいたって簡単で、

    [2 Emacs1.gif <image/gif (base64)>]

    の部分にマウスカーソルを置いて、二つボタンマウスの場合は左右のボタンを同時 に押すだけで画像を表示することができる。

    マウスを使わない場合は、同様にカーソルを上に置いて v を押す。 画像を表示するのではなくファイルに保存したい場合は e を押す。

    ★「図2-16 MIMEの再生」

    [ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

    13.4.3 Meadowからの使い方(作成編)

    グループバッファから m 押下でメールを、a 押下でニュースを、 返事を書く場合には f 押下で 図2-16 のような メッセージ作成バッファになる。カーソルの位置に画像を挿入したい場合は、 C-c C-x C-i filename RET である。 図2-16 で示すようにファイル名をミニ バッファから入力する。入力が終わると 図2-17 に示すような画面になる。

    ★「図2-16 画像ファイルの挿入」
    ★「図2-17 画像ファイルの挿入後」

    あとはそれに続いてふつうに文字を入力し(図2-18)、 C-c C-c で送信である。

    ★「図2-18 画像ファイルの挿入後」

    以下にメッセージバッファでのキーバインドを示す。 それぞれの詳細の説明は C-c C-x ? を押下してヘルプを読むか、前述の SEMI の info を参照して欲しい。

    C-c C-x ? mime-edit-help
    C-c C-x C-z mime-edit-exit
    C-c C-x p mime-edit-preview-message
    C-c C-x C-y mime-edit-insert-message
    C-c C-x C-e mime-edit-insert-external
    C-c C-x C-i mime-edit-insert-file
    C-c C-x C-t mime-edit-insert-text

    [ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]


    # # This document was generated on March, 5 2004 using texi2html 1.61.1


URL: http://www.NetLaputa.ne.jp/~kose/
PGP Fingerprint: 59 8E 1E 4D 41 7F DD 80 12 13 47 A3 FB 62 97 44
Copyright (C) 1999, 2000 kose@yk.NetLaputa.ne.jp All Rights Reserved.
XXXXX