【Make】「=」記号関連の効果の違い

目次

「=」

イメージとしては参照先に代入されるので、=で代入している変数を使用している場合、=の前に使用されている変数も全て代入した値で書き換えられます。

  • 処理

    1
    2
    3
    4
    5
    6
    7
    8
    DATA1 = a
    DATA2 = $(DATA1) b
    DATA1 = c

    .PHONY: TEST
    TEST:
    echo $(DATA1)
    echo $(DATA2)
  • 結果

    • 結果の通り=を使用して値を変数に代入すると、変数を値が書き換えるよりも前に参照していたとしても、書き換わるということになります。
      1
      2
      3
      4
      5
      $ make TEST
      echo c
      c
      echo c b
      c b

「:=」

プログラム言語的な代入です。上から下へ処理をしていき、:=で値を変更すればその後に使用する変数から値が変更されます。

  • 処理

    1
    2
    3
    4
    5
    6
    7
    8
    DATA1 := a
    DATA2 := $(DATA1) b
    DATA1 := c

    .PHONY: TEST
    TEST:
    echo $(DATA1)
    echo $(DATA2)
  • 結果

    • 結果の通り:=を使用して値を変数に代入すると、変数を値が書き換えるよりも前に参照していた場合、その値はそのまま使用され、書き換えたあとに処理する内容から変数内の値が書き換わるということになります。
      1
      2
      3
      4
      5
      $ make TEST
      echo c
      c
      echo a b
      a b

「?=」

代入先の変数にまだ値が代入されていない場合に値を代入します。C#のイベントの呼び出しに似ていますevent?.Invoke()な感じです。

  • 処理

    1
    2
    3
    4
    5
    6
    7
    8
    DATA1 ?= a
    DATA2 ?= $(DATA1) b
    DATA1 ?= c

    .PHONY: TEST
    TEST:
    echo $(DATA1)
    echo $(DATA2)
  • 結果

    • 結果の通り?=を使用して値を変数に代入すると、最後に代入している値は代入されず、値を設定していない場合のみ値が代入されるようになります。
      1
      2
      3
      4
      5
      $ make TEST
      echo a
      a
      echo a b
      a b
Author

Daiki Iijima

Posted on

2021-10-28

Updated on

2024-04-17

Licensed under