Makefileの基本テクニック

Makefileを記述する際に知っておくと便利なテクニックを挙げ、それぞれについて説明を行ないます。

■ ディレクトリパス取得
ディレクトリに移動し、その中でカレントディレクトリパスを新しく更新します。

- ./Makefile

curdir = $(shell pwd)

all:
echo $(curdir)
(cd hoge; make;)


- ./hoge/Makefile

curdir = $(shell pwd)

all:
echo $(curdir)


shell関数を使用して$(shell pwd)のように記述すると、Unixのシェルコマンドの実行結果が変数展開されます。また、ディレクトリ移動の箇所を括弧"()"で囲むと、ディレクトリ移動先の処理が終了後に自動的にカレントディレクトリに戻ってきます。

■ 引数からターゲットを決める
引数でmakeにディレクトリリストを渡し、それをターゲットにしてコマンドを実行する例です。カレントディレクトリに複数のディレクトリが存在し、特定のディレクトリに対してのみ処理を行なう場合に使用します。


hoge*::
(cd $@; make;)


"make hoge*"という風に使用します。フォニーターゲットを二重コロンルールで記述し、ファイルターゲットで更新されないようにします。コマンドには自動変数"$@"を使用し、複数のターゲットの内現在使用されているターゲットが展開されます。

■ ターゲットディレクトリ生成
ターゲットに対応したディレクトリが無い場合には上記のテクニックは使用できません。そこで、ディレクトリの存在しない場合とする場合で、二つターゲットを用意しておくと問題が解決可能です。


hoge%:
mkdir $@

hoge*::
(cd $@; ls > tmp.txt;)


hoge*が無い場合には最初のターゲットに沿ってディレクトリが作成され、hoge*が存在する場合には2番目のターゲットが実行されます。

■ if文
Makefileを使用する場合、文法はBourne shellと変わりませんが、一行に書く必要がありますので、いくつかコツが必要です。


all:
if [ ! -d hoge ]; \
then mkdir hoge; \
fi


Bourne shellで改行する必要がある箇所は、"; \"に置き換えてSyntaxエラーを回避します。これはhogeというディレクトリが存在しない場合に新しくディレクトリを作り、そうで無い場合には何もしないMakefileです。

■ for文
Makefileを使用する場合、文法はBourne shellと変わりませんが、一行に書く必要がありますので、いくつかコツが必要です。


all:
for i in hoge*; \
do (cd $$i; make;); \
done


Bourne shellで改行する必要がある箇所は、"; \"に置き換えてSyntaxエラーを回避します。また、MakefileとBourne shellの変数展開のルールが2重で適用されますので、for文の変数を"$$i"と記述します。

for文のリストの部分はカレントディレクトリのファイルリストにも適用可能です。この例の場合はカレントディレクトリにhoge1, hoge2, ・・・といったファイルもしくはディレクトリが必要となります。

■ 条件分岐
Makefileの構文による条件分岐の例を以下に示します。


MODE = write

all:
ifeq ($(MODE), write)
echo write
else
echo read
endif


変数MODEの値がwriteならばifeq以下のコマンドが実行され、そうでなければelse以下のコマンドが実行されます。

テーマ : Linux
ジャンル : コンピュータ

2007-07-20 : Work-Linux-Makefile/Sh/Csh : コメント : 0 : トラックバック : 0
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

プロフィール

zive

Author:zive
大阪在住、男

ブログ検索

月別アーカイブ

FC2カウンター