-------------------------------------------
文件:
bin main.d Makefile test.c test.h tm.c tm.o
main.c main.o Makefile~ test.d test.o tm.d
-------------------------------------------
SRC := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(SRC))all: bin
%d : %c
set -e; rm -f $@; \
$(CC) -MM $< > $@.$$$$; echo $@; \
sed 's,\($*\)o[:]*,\1o $@ :,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
sinclude $(SRC:.c=.d)
bin : $(OBJS)
echo $^
$(CC) -o bin $^
clean:
rm -f *.o bin *.d *.d.*
-------------------------------------------------
展开为:
SRC := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(SRC))
all: bin
%d : %c
set -e; rm -f $@; \
$(CC) -MM $< > $@.$$$$; echo $@; \
sed 's,\($*\)o[:]*,\1o $@ :,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
test.o test.d : test.c test.h
bin : $(OBJS)
echo $^
$(CC) -o bin $^
clean:
rm -f *.o bin *.d *.d.*
#########################################
sed 's,\($*\)o[:]*,\1o $@ :,g' < $@.$$$$ > $@; \
解析:
sample:
前:test.o: test.c test.h
后:test.o test.d : test.c test.h
$@ 表示 main.d test.d tm.d 中的main.d或 test.d, 或 tm.d, 每次只能成为一个。 %d:%c中的目标 %d的值。
$^ 表示集合 main.o test.o tm.o
$<表示依赖 %c的值, main.c或test.c或tm.c
-------------------------------------
test.o test.d : test.c test.h
表明test.o编译会关系到test.d, 而test.d又关联到test.c和test.h,所以只要test.c所引用到的头文件有所修改,都会重新编译test.o和test.d
-------------------------------------
执行结果:
set -e; rm -f tm.d; \
cc -MM tm.c > tm.d.$$; echo tm.d; \
sed 's,\(tm.\)o[:]*,\1o tm.d :,g' < tm.d.$$ > tm.d; \
rm -f tm.d.$$
tm.d
set -e; rm -f test.d; \
cc -MM test.c > test.d.$$; echo test.d; \
sed 's,\(test.\)o[:]*,\1o test.d :,g' < test.d.$$ > test.d; \
rm -f test.d.$$
test.d
set -e; rm -f main.d; \
cc -MM main.c > main.d.$$; echo main.d; \
sed 's,\(main.\)o[:]*,\1o main.d :,g' < main.d.$$ > main.d; \
rm -f main.d.$$
main.d
cc -c -o main.o main.c
cc -c -o test.o test.c
cc -c -o tm.o tm.c
echo main.o test.o tm.o
main.o test.o tm.o
cc -o bin main.o test.o tm.o
root@commander-LIFEBOOK-LH531:/home/samba/proj# cat test.d
test.o test.d : test.c test.h