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

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

Automake


From: Masatake YAMATO
Subject: Automake
Date: Tue, 19 Jun 2001 05:54:03 +0900

大和です.

おもしろいプログラムを書いた(つもりな)のでここに報告します.
# 適切な投稿先はここしか思いつきませんでした.

Automakeの入力であるMakefile.amにはプロジェクトに関する極めて有用な情
報が記載されています.たとえばそのプロジェクトから参照するライブラリの名
前(foo_LDADD)やプロジェクトを構成するディレクトリ(SUBDIRS),ソースファ
イル名の一覧などです.これらの情報は例えば(開発環境である)emacsの中から
利用できれば非常に面白いemacs lispを書くことができるでしょう.

このことに私はかなり前から気付いていました.しかし残念ながらautomake
はMakefile.amに記載された情報を手に入れるためのターゲットを生成して
くれません.automakeを改造して情報を取り出すターゲットを追加した
Makefile.inを生成する方法も挑戦してみたのですが,

- (automakeの記述言語である)perlのscript理解不能
- script自体がそのような拡張を想定していなさそうだった
- そんなものを作ってもautomake本家で採用になるとは思えなかった.
  => automakeのpatchとして配布することになりそうだった.

などの理由でやめました.しかし今回かなりましな方法でMakefile.amの中の
情報を取り出すコードを書けることに気づきました.今まで
なんらかの方法で(Makefile.amに由来する)Makefileに特別なターゲットを追加して,
それによって(Makefile.amの情報を継承した)Makefileから情報を取り出そう
としてあがいていました.今回は自分の書いた特別なターゲットだけから構成された
Makefileのスクリプト(autox.mak)から (Makefile.amの情報を継承した)Makefile
をincludeして 

make -f autox.mak special-target

とします.

長くなりましたが,作ってコードを解説してみます.

作成したコードを用いるとあるプロジェクトのプログラムの構築時にgccに渡
す -I includedir オプション全てを 集めてlisp形式でまとめて出力します.
lisp形式なのでこの出力はemacsから直接利用することができます.

末尾につけたファイルをautox.makとしてプロジェクトのトップレベルにディレク
トリに保存します.言いかえるとconfigure.inがあるであろうディレクトリに保存
します.automake;aclocal; autoconf; ./configureします.
そしてそのディレクトリで

make -s -f autox.mak  echo-includes

とやると結果を得ることができます.
例えばgtk+-1.2.9のトップディレクトリで実行した結果は

(includes :subdir po  ".." "../intl" :subdir gdk  
  ".." "/usr/include/glib-1.2" "/usr/lib/glib/include" 
  "/usr/X11R6/include" :subdir gtk  ".." "/usr/include/glib-1.2" 
"/usr/lib/glib/include" "/usr/X11R6/include" :subdir docs  )

となります.(改行を入れています.)

### Author: Masatake YAMATO
### Use this program under the term of GNU GPL.

include Makefile

# Install myself recursively
install-wrapper:
        @if test "x$(SUBDIRS)" != x ; then \
                for x in $(SUBDIRS); do \
                        cp ${top_srcdir}/autox.mak $$x/wrapper.mak; \
                        (cd $$x;  make -f wrapper.mak install-wrapper);\
                done; \
        fi

# Getting project directories
echo-subdirs: install-wrapper
        @echo -n "(subdirs "
        @for x in $(SUBDIRS); do \
                echo -n "\"`pwd`/$$x\" "; \
                (cd $$x; make -f wrapper.mak echo-subdirs0); \
        done
        @echo -n \)

echo-subdirs0: 
        @for x in $(SUBDIRS); do \
                echo -n "\"`pwd`/$$x\" "; \
                (cd $$x; make -f wrapper.mak echo-subdirs0); \
        done

# Geting -I dirs
echo-includes: install-wrapper
        @echo -n "(includes "
        @for x in $(INCLUDES); do \
                x=`echo $$x | grep -e -I`;\
                if test x$$x != x ; then \
                         echo -n \"`echo $$x | sed s/-I//`\"; \
                         echo -n " "; \
                fi ; \
        done ;
        @for x in $(SUBDIRS); do \
                echo -n :subdir $$x " "; \
                (cd $$x; make -f wrapper.mak echo-includes0); \
        done
        @echo -n \)

echo-includes0:
        @for x in $(INCLUDES); do \
                x=`echo $$x | grep -e -I`;\
                if test x$$x != x ; then \
                         echo -n \"`echo $$x | sed s/-I//`\"; \
                         echo -n " "; \
                fi ; \
        done



reply via email to

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