GNU Make で未定義を設定2013年09月22日 14時05分18秒

GNU Make で意図的に未定義を定義するのは若干骨が折れる。そもそも、未定義とは定義されていない事なのに、わざわざそれを代入しなければいけないのだから本末転倒なぐらいだ。

しかし、他人の権限下に問題があって、手が出せないこともある。VAR ?= on で未設定の時に自動で代入し、しかもその条件式が、未定義以外の時に有効になるようにされていたらもう他に手段が無い。変数に未定義だと代入しておく必要がある。

まず、よく一番やってしまう例がこれ。


% cat var.mk
VAR=''

ifdef VAR
var :
        echo "$(VAR)"x
endif

エラーが判りやすいように、ifdef で囲んである。

gmake -f var.mk
echo "''"x
''x

カンマが二つ出力されてしまう。

合格はこちら。


% cat var.mk
VAR=

ifdef VAR
var :
        echo "$(VAR)"x
endif

定義されていないので、ターゲットが見付からない。なお、Make の仕様で = の後の空白やタブは無視されるので、それらが入っていても問題はない。

gmake -f var.mk
gmake: *** No targets.  Stop.

しかし、お薦めはこちら。


% cat var.mk
VAR=#

ifdef VAR
var :
        echo "$(VAR)"x
endif

# を入れることで、その後ろはコメントとして無視される。もちろん出力はターゲットが見付からないと出る。

gmake -f var.mk
gmake: *** No targets.  Stop.

何故この形かというと、理由は二つある。何も目に見えるものだけが、真実とは限らないのだ。エディタでは非表示の文字を入れた者がいて、未定義のはずなのにとの混乱があったからだ。もう一つは、grep などで、探すときに一致させやすいのも利点になる。