記述ファイルでのマクロの使用

マクロを記述ファイルの中で定義した後で、 記述ファイル・コマンドでマクロを使用するには、$ (ドル記号) をマクロの名前の前に付けます。

マクロ名が 1 文字より長い場合は、( ) (小括弧) または { } (中括弧) で囲みます。 次に、マクロの使用例を示します。

$(CFLAGS)
$2
$(xy)
$Z
$(Z)

上記のリストで、最後の 2 つの例は同じ効果があります。

次のフラグメントは、いくつかのマクロの定義と使用方法を示しています。

# OBJECTS is the 3 files x.o, y.o and
# z.o (previously compiled)
OBJECTS = x.o y.o z.o
# LIBES is the standard library
LIBES = -lc
# prog depends on x.o y.o and z.o
prog:  $(OBJECTS)
# Link and load the 3 files with
# the standard library to make prog
      cc $(OBJECTS) $(LIBES) -o prog

この記述ファイルを使用する make コマンドは、 libc.a ライブラリーを持つ 3 つのオブジェクト・ファイル (x.oy.o、および z.o) をリンクしてロードします。

コマンド・ラインで入力されたマクロ定義は、記述ファイルに重複マクロ定義があると、 それらを指定変更します。 したがって、以下のコマンドは lex を使用してファイルをロードします。 (-11)ライブラリー:

make "LIBES= -ll"

注: 中にブランクのあるマクロをコマンド・ラインに入力するときは、 そのマクロを " " (二重引用符) で囲みます。 二重引用符がない場合、 シェルはそのブランクをパラメーター・セパレーター (マクロの一部ではない) と解釈します。

make コマンドは、 最高 10 レベルまでのネストされたマクロ式を扱うことができます。 以下の例の定義に基づいて、式は以下のようになります。$($(macro2))評価結果:value1:

macro1=value1
macro2=macro1

マクロの評価は、マクロが参照されるたびに行われます。 定義時に評価されるわけではありません。 マクロが定義されただけで一度も使用されないと、 一度も評価されないことになります。 これは、マクロにシェルによって解釈される値が割り当てられた場合、 特にその値が変更される場合は、非常に重要です。 次のような変数宣言があるとします。

OBJS = 'ls *.o'

これは、オブジェクト・ファイルの作成または除去の処理中に参照すると、 そのたびに値が変化している可能性があります。 また、OBJS マクロが定義されたときの ls コマンドの値を保持しません。