#基本ルール
(ターゲット):(依存ファイル)
コマンド
※コマンドの前のインデントはSPACEではなくTABじゃないとダメ。
例) main.cppをコンパイルしてtestという実行ファイルを作りたい場合
test:
g++ -o test main.cpp
コンパイルするときはmake ターゲット
で実行する。
$ make test
なお、ターゲットのファイルが生成済みの場合はコマンドは実行されない。
$ make test
make: 'test' は更新済みです.
####複数ターゲット
Makefile内に複数のターゲットを記載可能である。
test:
g++ -o test main.cpp
test2:
g++ -o test2 main2.cpp
make test
と打てばg++ -o test main.cpp
が実行されて、make test2
と打てばg++ -o test2 main2.cpp
が実行される。
ただ単にmake
だけ打った場合、最初のターゲットのコマンド(この場合g++ -o test main.cpp
)が実行される。
####依存ファイル
依存ファイルが指定してあると、ターゲットのファイルがない
もしくはターゲットの更新日時が依存ファイルの更新日時より古かった場合
にコマンドを実行する。
-rw-rw-r-- 1 root root 77 2月 22 12:30 Makefile
-rw-rw-r-- 1 root root 93 2月 22 13:00 main.cpp
-rwxrwxr-x 1 root root 8920 2月 22 13:05 test
test:main.cpp
g++ -o test main.cpp
上記の例だとtestの更新日時 > main.cppの更新日時
なのでこの状態でmake
を実行すると
$ make test
make: 'test' は更新済みです.
のようになってコマンドは実行されない。
main.cppファイルを更新するか、testファイルを削除すればコマンドが実行される。
####依存ファイルに他のターゲットを指定できる
test: main.o
g++ -o test main.o
main.o: main.cpp
g++ -c main.cpp
make test
を打つと、先にg++ -c main.cpp
で.oを生成してからg++ -o test main.o
が実行される。
$ make test
g++ -c main.cpp
g++ -o test main.o
####疑似ターゲット
test: main.cpp
g++ -o test main.cpp
clean:
rm -f test
上記Makefileの場合、cleanというファイルもしくはディレクトリが存在していた場合make
コマンドを打っても更新済みになってコマンドが実行されなくなってしまう。
それを防ぐために擬似ターゲットというものがある。
ターゲットを擬似ターゲットにするには**.PHONY**で宣言する必要がある。
test: main.cpp
g++ -o test main.cpp
.PHONY: clean
clean:
rm -f test
これだと名前がcleanのファイル(ディレクトリ)が存在していてもmake clean
のコマンドが実行される。
####コマンドなしターゲット
コマンドなしのターゲットも書くことができる。
複数のターゲットをまとめて行いたい場合に使用する。
test: main.cpp
g++ -o test main.cpp
.PHONY: clean
clean:
rm -f test
rebuild: clean test