ターゲットとそれを構成するソースの並びはコロン(:)又はダブルコロン(::)で区切り
ます。 ただしコロン(:)の場合は、同じターゲットが複数出現することを禁止している
のに対し、ダブルコロン(::) はそれを許します。
$ cat makefile
a: a.txt
@echo "New a.txt"
a: b.txt
@echo "New a.txt"
touch a
b:: a.txt
@echo "New a.txt"
touch b
b:: a.txt
@echo "New b.txt"
touch b
$ touch b.txt
$ make a
Multiple rules lines for `a' # ターゲット重複エラー
Too many command lines for `a'
New a.txt
touch a # make は指定されたターゲット以外でも、
$ touch a.txt # ソースが変更されていると、そのターゲットについて、
$ make b # アクションを実行する
Multiple rules lines for `a'
New a.txt
touch b
New b.txt
touch b
これはライブラリの作成など複数の構成要素をもつターゲットに対し有効です。
prog: prog.o mylib.a
ranlib mylib.a
cc prog.o mylib.a -o prog
mylib.a :: x.o
ar ra mylib.a x.o
mylib.a :: y.o
ar r mylib.a y.o
mylib.a :: z.o
ar r mylib.a z.o
x.o y.o: defs
x.o : defsx
cc -c -O x.c
$ make
cc -c -O x.c
ranlib mylib.a
cc prog.o mylib.a -o prog