tom__bo’s Blog

MySQL!! MySQL!! @tom__bo

GNU makeメモ

テキストファイMakefileに必要なファイルと各ファイルのコンパイルのコマンド、ファイル間の依存関係を書いておくことで、自動的に一括でコンパイルしてくれる。
依存関係に基づいて、更新されたファイルのみをコンパイルしてくれるので、コンパイル時間が短くて済む

ファイルターゲット

make (作成するファイル名)

で指定したコマンドからファイルを作成する
すでにファイルが存在する場合は実行されない

filename: 
    command
    [command]

(例)

hoge.txt:
    touch hoge.txt
    echo fuga >> hoge.txt

タスクターゲット

make taskname

でタスク実行。

[.PHONY: taskname]
taskname:
    command
    [command]

(例)

.PHONY clean
clean:
    rm *.txt
    rm *.o

.PHONYの行は省略できるが、ファイル作成とタスクを区別するためにつけたほうがいいらしい
ターゲットを指定せずmakeのみで実行した場合は先頭のタスクが実行される

ターゲットの依存関係

ターゲット名の:の後に依存するターゲットを記述することで依存するターゲットを実行してから目的のターゲットを実行できる
指定されたターゲットは依存ターゲットより更新日時が古かった場合

[.PHONY: taskname]
tasknake: task1 [task2] [...]
    command
    [command]

依存タスクのみを実行する場合はセミコロンをつける。
依存タスクとコマンドのセパレータを意味する。
(例)

taskname : task1 task2;

変数

スペースを含む文字列を変数に代入できる。$(variable)または${variable}で参照
定義済みの変数、自動変数は以下を参照
http://www.wiki.os-project.jp/?Makefile#v25ce834

マクロ

  • 置き換え参照

変数に指定した文字列の部分文字列の書換
\%はワイルドカードを意味する
(例)

source = hoge.c fuga.c
object1 = $(source:%.c=%.o)
object2 = $(source:%=lib/%.c)

include

include makefile

\-includeでmakefileが存在しなかった場合にエラーを無視する

  • 文字列の追加

オプション

\-n : 実行されるコマンドを表示
\-s : サイレントモード。コマンドの表示を行わない

@ : コマンドの先頭に付けてエコーバックを避ける
ex)

all:
    @c++ test.cpp