ジャンル不定の日記です。

Makefile自分で書いてみた

Orange Piを使ってGPIOを制御するプログラムを作る予定だが、C++はBuildroot標準でコンパイラがないようなので言語はCにする方向になった。
コンパイラを直接使ってOrange Piで動く"Hello World"はできたが、実際にはソースファイルが複数になってコンパイラの引数が多くなってわからなくなるのでmake使ってみることにした。

makeは同じディレクトリのMakefileに従ってコンパイルするマクロ的なもんだが、
ターゲット名:依存ファイル1 依存ファイル2
     コマンド
のような感じで、
:の左側にターゲット名、右側にスペース区切りで依存ファイルを書く。(依存ファイルは1つでもいいし多数でも。)
次の行に先頭からタブを空けてコマンドを書く。(コマンドは複数行書けると思う。)
参考にしたサイトだとどこも:の後にスペースがあったが必要ないみたい。
コマンド行のタブは必須。
単に
$ make
とした場合は最初に記載されたターゲットが処理されるらしい。

まあとりあえず、
CC=gcc

hello:main.o
    $(CC) -o $@ $^

.c.o:
    $(CC) -c $<

clean:
    $(RM) hello main.o
こんな感じで"Hello World"をmakeできるようにしてみた。

CCは変数みたいなものだがマクロと言うらしい。
gccを定義してあるが、ここ変えればクロスコンパイルできる。
定義の際はそのまま書いて使うときは$をつけるが、マクロ名が2文字以上の場合は$(CC)の様に()で囲む必要があるみたい。
$@ $^$<は内部マクロで、
$@=ターゲット名
$^=依存ファイルすべて
$<=依存ファイルの先頭1個
$(RM)は定義済みマクロで rm -f と同じ。

.c.oはサフィックスルールというもので、拡張子を2つ続けて書く感じでワイルドカード的に使える。

今回はソースファイルが main.c 1つなんで main.o は作る必要ないが今後のためにも main.o を作ってから hello コマンドを作る感じにした。
先頭のターゲットがhelloなんでmakeしたらhelloを作ろうとするが main.o がなければサフィックスルールに基づきmain.cからmain.oが作られ、main.oからhelloが作られる。
って感じかな。