ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

Makefile の変数は大文字を使う? 小文字を使う?

Makefile の変数って、大文字のスネークケース(Screaming snake case)が使われているのをよく見ます。
しかし、公式ドキュメントを読んでいると小文字のスネークケース(Snake case)のパターンもあり、
果たしてどちらを使うべきかわからないでいました。

例えばここのドキュメント では、
foo, bar, include_dirs は小文字で、 CFLAGS や最後の方に出てくる FOO は大文字です。

その答えはちゃんとドキュメントにありました。

答え

https://www.gnu.org/software/make/manual/html_node/Using-Variables.html より引用

It is traditional to use upper case letters in variable names, but we recommend using lower case letters for variable names that serve internal purposes in the makefile, and reserving upper case for parameters that control implicit rules or for parameters that the user should override with command options (see Overriding Variables).

簡単に訳すと、

『伝統的には大文字の変数名が使われてきましたが、
Makefile 内で内部的に使用される変数には小文字の変数名を使い 、また、
Implict Rules を操作するパラメーターや、ユーザーが上書きすべきパラメーターには大文字を予約すること を推奨します』

ということが書いてあります。

Implict Rules (暗黙のルール)についてはここのドキュメントに書かれています。
CFLAGS や LDFLAGS などの、組み込みの変数があたりますね。

あとはユーザーが make 実行時に上書きすることを想定する変数は大文字、
そうでない変数は小文字、ということを意識すれば良さそうです。

例えば以下のような使い分けですね。

FILE_NAME := test_001.txt

kernel_info := $(shell uname -a)

.PHONY: dump clean

dump:
   @echo '$(kernel_info)' > $(FILE_NAME)

clean:
  rm $(FILE_NAME)

FILE_NAME はユーザーが実行時に

make dump FILE_NAME=info.txt

などと、好きな値で上書きすることを想定しているとします。

kernel_info はユーザーが実行時に上書きしない想定です。

おわりに

以上、Makefile の変数名の規則でした。
たぶん、すべて大文字で書いている人も多いと思うので、
そういう人を見かけたら、「公式ドキュメントでこう書いてあるので」と案内してあげると、
統一した書き方が社会に広がっていってみんながハッピーだと思います!

(ちなみにこの前も Makefile の変数の話題を書きました。合わせてどうぞ! ↓)

nekonenene.hatenablog.com