make のマクロ置換は、メークファイル内でパラメータをコマンド行に渡す際に便利です。cc -O オプションを使用して、program という最適化されたプログラムを、コンパイルする場合を例に挙げます。メークファイルに以下の例のようなマクロ参照を functions のターゲットに追加して、パラメータをコマンド行に渡すことができます。
functions: functions.c cc $(CFLAGS) -o functions functions.c
マクロ参照は、メークファイル内あるいは make コマンドの引数でユーザーが定義した値に対応する可変部分として機能します。make で CFLAGS マクロの値を定義すると、make はマクロ参照を指定された値に置換します。
$ rm functions $ make functions "CFLAGS= -O" cc -O -o functions functions.c
CFLAGS マクロへの参照は、.c と .c.o の両方の暗黙の規則に含まれています。
コマンド行で指定できる引数は 1 つだけです。この例では、二重引用符で囲んである部分が引数定義を示しています。
マクロが未定義の場合は、make はマクロの参照先を空白の文字列とみなします。
メークファイル中にマクロを定義することもできます。デフォルトで最適化されたオブジェクトコードを make が生成するように、CFLAGS を -O に設定するなどの用途があります。
CFLAGS= -O functions: functions.c cc $(CFLAGS) -o functions functions.c
make のコマンド行の引数として指定されたマクロ定義は、条件付きマクロ定義を除き、メークファイル内の他の定義よりも優先されます。
たとえば、dbx または dbxtool を使用してデバッグするために functions をコンパイルするには、コマンド行で CFLAGS の値を -g として定義します。
$ rm functions $ make CFLAGS=-g cc -g -o functions functions.c
gprof を使用してプロファイル用に functions をコンパイルするには、-O および -pg の両方を CFLAGS の値として指定します。
マクロ参照は、マクロ名が 2 文字以上の長さの場合は、括弧で囲む必要があります。マクロ名が 1 文字だけの場合は、括弧を省略できます。括弧の代わりに中括弧 { と } を使用することもできます。たとえば、'$X'、'$(X)'、'${X}' はすべて同じ意味です。