LoginSignup
7
7

More than 3 years have passed since last update.

Makefileの基礎

Last updated at Posted at 2020-02-22

基本ルール

Makefile書式
(ターゲット):(依存ファイル)
    コマンド

※コマンドの前のインデントはSPACEではなくTABじゃないとダメ。

例) main.cppをコンパイルしてtestという実行ファイルを作りたい場合

Makefile
test:
    g++ -o test main.cpp

コンパイルするときはmake ターゲットで実行する。

$ make test

なお、ターゲットのファイルが生成済みの場合はコマンドは実行されない。

$ make test
make: 'test' は更新済みです.

複数ターゲット

Makefile内に複数のターゲットを記載可能である。

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
Makefile
test:main.cpp
    g++ -o test main.cpp

上記の例だとtestの更新日時 > main.cppの更新日時なのでこの状態でmakeを実行すると

$ make test
make: 'test' は更新済みです.

のようになってコマンドは実行されない。
main.cppファイルを更新するか、testファイルを削除すればコマンドが実行される。

依存ファイルに他のターゲットを指定できる

Makefile
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

疑似ターゲット

Makefile
test: main.cpp
    g++ -o test main.cpp

clean:
    rm -f test

上記Makefileの場合、cleanというファイルもしくはディレクトリが存在していた場合makeコマンドを打っても更新済みになってコマンドが実行されなくなってしまう。
それを防ぐために擬似ターゲットというものがある。
ターゲットを擬似ターゲットにするには.PHONYで宣言する必要がある。

Makefile
test: main.cpp
    g++ -o test main.cpp

.PHONY: clean
clean:
    rm -f test

これだと名前がcleanのファイル(ディレクトリ)が存在していてもmake cleanのコマンドが実行される。

コマンドなしターゲット

コマンドなしのターゲットも書くことができる。
複数のターゲットをまとめて行いたい場合に使用する。

Makefile
test: main.cpp
    g++ -o test main.cpp

.PHONY: clean
clean:
    rm -f test

rebuild: clean test
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7