📖

苦手意識があるMakefileをざっくり理解する。

2022/02/19に公開

背景

苦手意識があった、makefileを少し調べてみたのでざっくりまとめてみます。

説明

基本的に makeコマンドは依存関係を持って順番にコマンドを実行させる事ができる というだけの仕組みだった。

例えばAというファイルを作る場合に、Bというファイルが必要である場合がある。
その時に、Aを作る前にBの作り方を見つけて、Bを作る感じ。

基本

基本は超単純で下記です。

makefile
{作りたいモノ}:{材料}
	{作り方}

C言語とかで説明すると、
{作りたいモノ}=コンパイル結果ファイル
{材料}=*.c*.h*.oのファイル類
{作り方}=gcc -o xxx -c *.cみたいなビルドコマンド

これを呼び出す場合のコマンドは、下記のようなイメージです

make {作りたいモノ}

実行イメージ

makeコマンドでは、下記のようなイメージで実行します

  1. {作りたいモノ}を探します
  2. {作りたいモノ}の必要な{材料}を確認します。
  3. {材料}{作りたいモノ}にしている行を探します。
  4. (全ての依存する材料を探しきるまで繰り返します)
  5. 全ての作成方法がわかったら、最も後で見つかったものの順番にコマンドを実行していきます。

下記のようなmakefileを実行すると、このような結果になります。

makefile
a:b c
        echo "this is a"
b:
        echo "this is b"
c:
        echo "this is c"
make a
>echo "this is b"
>this is b
>echo "this is c"
>this is c
>echo "this is a"
>this is a

bcが先に実行され、aが最後に実行されていることがわかると思います。

ルール

path

基本的に、makeコマンドは実行フォルダ内のmakefileというファイルを探して、その内容を実行します。
-fオプションを利用する事により、実行するmakefileを選択することもできるようです。

https://linuxjm.osdn.jp/html/GNU_make/man1/make.1.html

作りたいものを指定しない場合

通常はmake {作りたいモノ}で対象を指定しますが、{作りたいモノ}を省略すると最も上に書かれているものを作成しようとします。
例えば、下記のコードの場合はxを作成しようとします。

makefile
x:
        echo "this is x"
a:b c
        echo "this is a"
b:
        echo "this is b"
c:
        echo "this is c"
make
>echo "this is x"
>this is x

変数の使用

makefile内では変数を定義して、使い回すことができます
よく使われるのがCCでコンパイラを指定したりがよく見られるパターンだと思います。

makefile
CC=gcc
x:
        echo "this is x $(CC)"
make x
>echo "this is x gcc"
>this is x gcc

材料のファイルの更新時間

材料とするファイルが生成後のファイルよりも新しくなっている場合、makeではこれを検知してファイルを作り直します。

Discussion