Windows生まれ、Windows育ち。
VisualStudioはだいたい友達。
そんなUnixに触れる機会が少ないまま育った私は、makeをしてこなかったんです。
そんなわけで、改めてmakeです。
makeの最低限の書き方
基本的なmakeの目的は、
- 複数ファイルの依存関係があるビルドを(簡単に)する
- 更新があるファイルに限定してコンパイル・ビルドする
と思っています。現状。
ですので、以下では複数ファイルmain.cpp, Hoge.cpp, Hoge.h
がある状況を考えていきます。
main.cppにmain関数があり、そこからHoge.*に宣言・定義されたHogeクラスを利用するという形。
これをビルドする最低限の書き方のMakefileは以下です。
main: Hoge.o main.o
これが最低限の書き方です。
これでmakeを実行すればmainという実行ファイルができます。
makeの本来の構文
上で書いた形は、makeの暗黙のルールが適用されることで動いています。
そもそもhoge.oやmain.oなどというファイルは存在しないのに、そういった記述でビルドが成功しました。
本来のmakeの構文は以下です。
ターゲット: 依存ファイル1 依存ファイル2 ...
コマンド1
コマンド2
注意としては、コマンドの前はスペースではなくタブを記述する必要があります。
上で適用された暗黙のルールとは、
- コマンドを暗黙(デフォルト)のものを使用
- .oを出力するファイルは.cppであるものとして処理
というもの。
コマンドや、.cppと.oの依存関係をきちんと省略せずに書いたMakefileが以下です。
main: Hoge.o main.o
g++ -o main Hoge.o main.o
Hoge.o: Hoge.cpp
g++ -c Hoge.cpp
main.o: main.cpp
g++ -c main.cpp
これを実行しても同じ結果が得られます。
makeの慣習
makeコマンドでは以下の様なオプションが慣例的に使われます。
all : ビルド
clean : ビルドで生成したファイルの削除
install : インストール
つまり
make clean
とすればファイルが削除されるというものです。
これを実現するにはmakeファイルに続けて以下を記述すればよいです。
clean:
rm -f *.o main
つまり、オプションでターゲット名を指定すればそのターゲットのコマンドが実行されるんですね。
allがビルドですが、通常はオプション無しでもallと同じくビルドが走って欲しいです。
オプション無しで走るのは最初に記述してあるコマンドになるので、以下のように記述するのが通例です。
all: main
main: Hoge.o main.o
g++ -o main Hoge.o main.o
Hoge.o: Hoge.cpp
g++ -c Hoge.cpp
main.o: main.cpp
g++ -c main.cpp
clean:
rm -f *.o main
makeのマクロ変数
Makefileでは、任意のマクロと呼ぶ変数を定義できます。
PROJ_DIR=/proj/path
など。
またデフォルトで設定済みのマクロもあります。
代表的なものとしては以下となります。
CXX : C++コンパイルコマンドの指定
CXXFLAGS : C++コンパイルオプション
例えば以下のようにCXXを指定して、Hoge.oは暗黙のルールを適用させると
CXX = gcc
all: main
main: Hoge.o main.o
g++ -o main Hoge.o main.o
Hoge.o: Hoge.cpp
main.o: main.cpp
g++ -c main.cpp
出力は以下となります。
% make all
gcc -c -o Hoge.o Hoge.cpp
g++ -c main.cpp
g++ -o main Hoge.o main.o
Hogeは暗黙のルールでCXXのマクロのコマンドが使われています。
しかし、これgccだとコケるかと思ったんですが、通りました。macなので中身はclangだからかもしれません。
以上簡単にmakeのテストとまとめでした。
参考サイト
http://yut.hatenablog.com/entry/20120702/1341185909
http://www.atmarkit.co.jp/ait/articles/1106/10/news115.html
コメント