Show page source of MakingMakefile #52417

= makefileの作り方メモ =

== .SUFFIXESとパターンルール ==
 パターンルールさえあれば、そのルールで使用している拡張子を{{{.SUFFIXES}}}に追加しなくても大丈夫のようです。
 (GNU Make 3.81の動作より)

 たとえば、NOODLYBOXでは{{{%.v : %.xaw}}}というルールを{{{etc/makerule}}}で定義しているが、{{{.SUFFIXES}}}に{{{.v}}}と{{{.xaw}}}を入れていないのにちゃんと{{{MAINDCM.v}}}が出来上がります。

== ディレクトリを作って、そこにターゲットを放り込みたい場合 ==
 {{{make}}}を行う時点では存在しないディレクトリ、たとえば{{{objdir}}}ディレクトリにコンパイル結果のオブジェクトを放り込みたい場合、下記のようにすると不都合が起きます。
{{{
objdir :
        mkdir -p objdir

objdir/%.o : %.c objdir
}}}
 ディレクトリの更新時刻は、その中のファイルが更新されるたびに一緒に更新されます。そのため、再度{{{make}}}を実行したときに本来は必要ないのに{{{objdir/%.o}}}の更新を行ってしまいます。

 下記のように、{{{touch}}}を使って0バイトのファイルを作り、それに依存するように書けば解決します。
{{{
objdir/mark :
        mkdir -p $(@D)
        touch $@

objdir/%.o : %.c objdir/mark
}}}

 空の{{{objdir}}}ディレクトリをバージョン管理システムに入れることができるならば、上記のような書き方はせずに済みます。それができない場合に役に立つと思います。

== DOS形式のパスをCygwin形式に直したい場合 ==
 たとえば環境変数XILINXは、{{{D:\installed\ise11\ISE}}}のような形式になっています。このパス形式をCygwinでビルドされたプログラムに渡すとうまく扱えないので、以下のような変換を行って{{{/cygdrive/D/installed/ise11/ISE}}}に直してから使います。
{{{
XILINXDIR:=$(shell echo /cygdrive/$$XILINX | sed -e s,'\\',/,g -e s,:,,)
}}}