Makefileでオブジェクトファイルなどの中間ファイルをソースと別のディレクトリに押し込めたい派なんだけど、その際に出力先のディレクトリを生成するためのターゲットの書き方をメモ。
旧手法
今まではオブジェクトファイルを生成するルールにmkdir -p objと書いて目的ディレクトリを作成するようにしていたんだけど、これだとオブジェクトのコンパイルの度にmkdirが試みられることになり、無駄といえば無駄:
SRC_DIR:=src # ソースファイル格納ディレクトリ |
うまくいかない方法
オブジェクトファイルの依存関係に足せばできるかと書いてみる:
OBJS:=... |
一見普通に動くんだけど再度makeをするとobjディレクトリが更新されたと判定されてしまい、すべて再ビルドになってしまう。
新手法
mkdir -p方式で特に困ってはなかったんだけど、下記のように書けることを知った:
# これを書き換え |
|と書くと「順序依存」指定となって、ディレクトリ内部やそのもののタイムスタンプが新しくなってもオブジェクトファイルは更新対象にはならず、再ビルドを防ぐことができる。
リンク
- Prerequisite Types (GNU make) マニュアルに本内容ずばりそのものが書かれていた…
- “Order-only prerequisites”