[Top][All Lists]
[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
- Automake,
Masatake YAMATO <=