Makefile をみると変数への値の代入で := と = の二種類が使い分けられていることがあります.
簡単に言うと
-
:=は即時評価 -
=は遅延評価
です.
具体的に
例として ls コマンドを実行する Makefile を作ります.
$(CMDLINE) に ls コマンドを実行するためのコマンドラインを格納し,all ターゲットで実行します.
$(LSOPT) に ls コマンドへのコマンドラインオプションを入れます.
本例では $(LSOPT) は $(CMDLINE) の定義後に定義します.これにより即時評価と遅延評価の差をわかりやすくします.
:= の場合
$(CMDLINE) には $(LSOPT) の内容は反映されておらず,単純な ls が実行されます.
Makefile_colon
CMDLINE := ls $(LSOPT)
LSOPT = -al
all:
$(CMDLINE)
% make -f Makefile_colon
ls
Makefile_colon Makefile_equal
= の場合
$(LSOPT) が $(CMDLINE) の後に定義されているにもかかわらず,$(CMDLINE) は ls -al となっており $(LSOPT) が反映されています.
Makefile_equal
CMDLINE = ls $(LSOPT)
LSOPT = -al
all:
$(CMDLINE)
% make -f Makefile_equal
ls -al
合計 16
drwxr-xr-x 2 sae sae 4096 8月 21 17:00 .
drwxr-xr-x 11 sae sae 4096 8月 21 16:47 ..
-rw-r--r-- 1 sae sae 53 8月 21 16:59 Makefile_colon
-rw-r--r-- 1 sae sae 52 8月 21 16:58 Makefile_equal