LoginSignup
57
35

More than 5 years have passed since last update.

Makefile における := と = の違い

Posted at

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

参考 URL

GNU Make manual - 3.7 How make Reads a Makefile

57
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
35