gnu-devels-jp
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Automake


From: Masatake YAMATO
Subject: Re: Automake
Date: Fri, 22 Jun 2001 15:53:26 +0900

大和です.

> そのおもしろさ加減を説明していただけるとありがたいです。私のちっぽけな
> 想像力ではいまいちピンと来ないものでして。

おくじさんに御理解頂けないようであれば,よっぽどひどい説明だったようです.
すいません.(本質的におもしろくない可能性もあるけど...)
もう一度書いてみました.従来の方式との比較を書いています.最後の方で
力尽きました.

おもしろい部分はプログラム自体よりもその背景にある考えです.その考えを
用いれば簡単にMakefile.amの中に記載された情報をひっぱり出してmake以
外のプログラムからも,それらの情報を利用することができます.

あるパッケージのMakefile.amおよびMakefile.amから生成されるMakefileには
パッケージに関する様々な情報が記載されていますこれらの情報はemacsなど
の開発環境から利用できれば有用です. 例えばMakefile中で定義される
INCLUDESという変数にはそのパッケージを構築するときに参照するヘッダファ
イルが置かれたディレクトリが列挙されています.emacsからこのINCLUDESの
値を参照することができればヘッダファイル名の補完やヘッダファイル中のシ
ンボル名の補完といった開発支援を行なうことができます.現状のemacsに付
随するライブラリではINCLUDESの値を参照して,パッケージ毎に適切なディレ
クトリから(補完のテーブルを作成するのに必要な)情報を獲得するということ
は行なわれていません.ヘッダファイル名の補完を行なうcomplete.elでは

(defcustom PC-include-file-path '("/usr/include" "/usr/local/include")..

というようにディレクトリを決め打ちしています.これらのディレクトリ以外
にあるヘッダファイル名を補完するためには,PC-include-file-pathに別のディ
レクトリを追加する必要があります.

私は,Makefile.am中の情報をMakefileの外側で使うにためには,なんらかの
方法でMakefile中の情報をechoするターゲット(echoターゲット)をMakefileに
追加すれば良いと考えてきました.追加してしまえばechoターゲットからMakefile
中の全ての情報を参照することができるからです.具体的な3つの方法を思いつきま
したが,それぞれ問題がありました.

1. automakeを改造する.
        MakefileからMakefile.inを生成するautomakeを改造して,echoターゲット
        をMakefile.inに自動的に追加されるようにする.
        -- 問題点
        (Automakeの記述言語である)perlのスクリプトの解読と記述が必要になる.
        広く使ってもらるにはautomakeに対するパッチとして配布するかautomake
        に取り込んでもらうかの必要がある.前者はアホっぽい,後者は努力がいる.
        特にautomakeに取り込んでもらうにはechoターゲットの出力形式をかなり
        真剣に考える必要がある.(e.g. S式で良いのかとか)

2. Makefileにechoターゲットを,スクリプトで付け足す.
        echoターゲットを記載したファイルをecho.makとします.
        以下の作業を行なうスクリプトを用意します.

        cat Makefile echo.mak > tmp.mak
        mv tmp.mak Makefile
        
        この方法ではperlの読み書きが必要なくなります.automakeのパッチ
        として配る必要もなくなります.echo.makと(スクリプトで追加するなら)
        追加作業を自動でやってくれるスクリプトを配れば良いです.
        -- 問題点
        Makefileはconfigureの呼出しにより上書きされてしまいます.
        echo.makがMakefileにcatされているかどうかを管理する必要があります.
        これはちょっと面倒です.

        さらにパッケージがネストした複数のディレクトリから構成される場合
        すなわちMakefile.am中にSUBDIRS変数が定義されている場合には,
        SUBDIRSを参照して,各ディレクトリ毎に再帰的にスクリプトを適用
        する必要があります.Makefileの情報を参照できるようにするための
        プログラムがMakefile中のSUBDIRS変数という情報を参照するのは
        アホっぽいです.

3. echoターゲットを記載したファイルをMakefileからincludeする.

        Makefile.am中に
        include echo.mak
        とするとautomakeは,生成するMakefileにecho.makをインライン展開
        してくれます.

        -- 問題点
        2.と同じでinclude echo.makの一行をを(複数のディレクトリにある)全ての
        Makefile.amに追加する必要があります.SUBDIRSを参照しないとこれは
        できません.

僕が新たに考えた方法はについて書きます.

4. echo.makから include Makefileする.
        include Makefile
        とecho.makに書いておき,
        パッケージのトップディレクトリにecho.makを置く.
        echoターゲットを利用するときだけ
        gmake -f echo.mak target

        パッケージが複数のディレクトリを持つ場合には,
        echo.makが自分自身をサブディレクトリに再帰的にコピー
        するターゲットを記載しておきます.このときecho.makはSUBDIRS
        を参照することができるので自分のコピー先となるサブディレクトリを
        知ることができます.

        これでecho.makからMakefileの全ての
        変数を参照することができます.さらに
        この方式では1, 2, 3の問題を克服しています.
        1. automakeを改造する必要はない.
           echo.makを変更すれば出力形式を変えることができる.
        2. configureの呼出しがあっても上書きされるのはMakefileだけなので
           echo.makは被害を受けない.
           SUBDIRSを容易に参照できるのでネストしたディレクトリに対する
          再帰適用は簡単である.
        3. に同じ.

> ちゃんと使い途を説明できるの
> なら、本家でも受け入れられるんじゃないかと思います。Tom Tromyは話せる
> 相手ですよ。

使い方を示すには,echo.mak(前回はautox.makと書いていました)だけでなく,
echoターゲットの出力の利用方法を示すプログラムも書く必要がありますね.
ものになるかどうか試してから報告しようと思います.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]