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