makefile
変数
サーチ…
変数の参照
変数に格納されている値を使用するには、ドル記号の後ろに括弧または中括弧で囲まれた変数名を使用します。
x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same
変数の名前が1文字だけの場合、カッコ/カッコを省略することができます( $x
)。このプラクティスは自動変数(下記参照)に使用されますが、汎用変数には推奨されません。
単純に拡張された変数
単純に拡張された変数は、従来のプログラミング言語の変数のように動作します。右側の式が評価され、その結果が変数に格納されます。右側に変数参照が含まれる場合、その変数は割り当てが行われる前に展開されます。
x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"
別の形式では、二重コロンの代入を使用します。
x ::= hello
シングルとコロンの代入は同等です。 POSIXのmake標準では::=
という形式しか記述されていないため、厳密な標準準拠の実装ではシングルコロン版がサポートされない可能性があります。
再帰的に展開される変数
再帰的に展開された変数を定義するとき、右側の内容はそのまま保存されます。変数参照が存在する場合、参照自体が格納されます(変数の値ではありません)。 Makeは変数が実際に使用されるまで変数参照を展開するのを待ちます。
x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"
この例では、 y
の定義は再帰的です。 $(y)
が展開されるまで、 $(x)
への参照は展開されません。これは、 x
の値が変化するたびに、 y
の値も変化することを意味します。
再帰的に拡張された変数は、強力ではあるが誤解されやすいツールです。それらは、テンプレートや関数に似た構造を作成するために、あるいはmakefileの一部を自動的に生成するためにも使用できます。また、デバッグの難しい問題の原因となることもあります。必要に応じて、再帰的に展開された変数のみを使用するように注意してください。
自動変数
個々のルールの文脈の中で、Makeはいくつかの特殊変数を自動的に定義します。これらの変数は、メークファイル内の各ルールに対して異なる値を持つことができ、書き込みルールを簡単にするように設計されています。これらの変数は、ルールのレシピ部分でのみ使用できます。
変数 | 説明 |
---|---|
$@ | ルールのターゲットのファイル名 |
$% | ルールのターゲットがアーカイブの場合、ターゲットメンバーの名前 |
$< | 最初の前提条件のファイル名 |
$^ | すべての前提条件のリスト |
$? | ターゲットより新しいすべての前提条件のリスト |
$* | 暗黙またはパターンルールの「ステム」 |
次の例では、自動変数を使用して汎用ルールを生成しています。これは、同じ名前の.cファイルから.oファイルを構築する方法を指示します。影響を受けるファイルの特定の名前がわからないので、出力ファイルの名前のプレースホルダーとして$@
を使用し、前提条件リスト(この場合は入力ファイルのリスト)のプレースホルダーとして$^
を使用します。
%.o: %.c
cc -Wall $^ -c $@
条件付き変数割り当て
?=
演算子は、変数がまだ設定されていない場合にのみ代入が発生する点を除いて、 =
ように動作する拡張です。
x = hello
x ?= world
# $(x) will yield "hello"
既存の変数へのテキストの追加
+=
演算子は、指定された内容を変数の末尾にスペースで区切って追加する共通の拡張です。
x = hello
x += world
元の変数が単純展開された変数として定義されている場合にのみ、右側の変数参照が展開されます。