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/_dir :
mkdir -p $(@D)
touch $@
objdir/%.o : %.c objdir/_dir
空の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,:,,)