Makefileには、条件分岐の機能が用意されている。汎用的なプログラミング言語のように強力なものではないが、Makefileの中で必要になる最低限の分岐処理は可能になっている。この機能を使うことで「LinuxとMac」「LinuxとWindows」といった異なるプラットフォーム上で共用できるMakefileを作成することができる。今回は、この条件分岐機能について説明しよう。

条件ディレクティブ

GNU makeには条件分岐に使うことができるディレクティブが用意されている。構文は主要なプログラミング言語のif制御構文と似ており、次のように条件が「真」だったときの処理と「偽」だったときの処理を分けることができる。

条件ディレクティブ
真の場合の処理
else
偽の場合の処理
endif

GNU makeの条件ディレクティブは、連続して使用可能だ。例えば、上記の記述の「else」の後に条件ディレクティブを続けて記述することができる。書き方をまとめると、次のようになる。

条件ディレクティブ1
上が真の場合の処理
else 条件ディレクティブ2
上が真の場合の処理
else 条件ディレクティブ3
上が真の場合の処理
...
else
偽の場合の処理
endif

条件ディレクティブは変数定義の段階でも使えるし、レシピ部分に挟んで使うこともできる。この処理は入れ過ぎると混乱のもとになるので、使うときは必要最小限で済むように工夫した方がよい。

ifeq条件ディレクティブ

今回は、この条件ディレクティブの一つである「ifeq」を取り上げる。これは引数を2つ取る条件ディレクティブで、引数1と引数2が等しかった場合に「真」、そうでなかった場合に「偽」の処理を行う。書き方は1つではなく、次のように5種類の書き方ができる。

◆ifeqディレクティブの書き方サンプル1

ifeq (引数1,引数2)

◆ifeqディレクティブの書き方サンプル2

feq '引数1' '引数2'

◆ifeqディレクティブの書き方サンプル3

feq "引数1" "引数2"

◆ifeqディレクティブの書き方サンプル4

feq "引数1" '引数2'

◆ifeqディレクティブの書き方サンプル5

ifeq '引数1' "引数2"

Makefileの条件ディレクティブは、異なるプラットフォームで同じMakefileを使おうとした場合に必要になることが多い。今は必要なくても、そのうちLinux、Mac、Windowsで同じMakefileを使うことになるかもしれない。そんなときに、この機能を使うことになるだろう。