自动生成依赖性
应用场景:头文件更新了 如何让源文件也自动更新
目录结构
直接编译的话 会报错 找不到头文件
所以这里通过 -I指定头文件路径 或者 在#include “head/head.h”
gcc *.c -I./head
TGT = a.out
SRCS = main.c test.c foo.c
#CROSS_COMPILE = arm-linux-genuabihf-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -I$(HEAD_PATH)
CUR_PATH = $(shell pwd)
HEAD_PATH = $(CUR_PATH)/head
$(TGT): $(SRCS:.c=.o)
$(CC) $^ $(CFLAGS) -o $@
%.o: %.c
$(CC) -c $<
%.d: %.c
$(CC) -MM $< > $@
sinclude $(SRCS:.c=.d)
clean:
rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d)
分析:
把文件所需的依赖,全部写在Makefile中,如果某个依赖更新了,那么对应的目标肯定也会更新。
命令 $(CC) -MM $< > $@ 会将当前路径下的所有.c的依赖输出到文件%.d中去,然后sinclude把所有的.d文件的内容加载进来,
%.d: %.c
$(CC) -MM $< > $@
main.o: main.c head/head.h
test.o: test.c
foo.o: foo.c
所以,当依赖比目标更新的时候,自然就引发目标的重新编译了
输出结果:
zys@ubuntu:~/linux/application/makefile/p5$ make
gcc -MM foo.c > foo.d
gcc -MM test.c > test.d
gcc -MM main.c > main.d
gcc -c main.c
gcc -c test.c
gcc -c foo.c
gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out
思考
可以看到输出结果是先输出.d 再输出.o。
如果把$(CC) -c $< 和 $(CC) -MM $< > $@交换下位置 会不会先输出.o呢
TGT = a.out
SRCS = main.c test.c foo.c
#CROSS_COMPILE = arm-linux-genuabihf-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -I$(HEAD_PATH)
CUR_PATH = $(shell pwd)
HEAD_PATH = $(CUR_PATH)/head
$(TGT): $(SRCS:.c=.o)
$(CC) $^ $(CFLAGS) -o $@
%.d: %.c
$(CC) -MM $< > $@
sinclude $(SRCS:.c=.d)
%.o: %.c
$(CC) -c $<
clean:
rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d)
.PHONY: clean
输出结果:
gcc -MM foo.c > foo.d
gcc -MM test.c > test.d
gcc -MM main.c > main.d
gcc -c main.c
gcc -c test.c
gcc -c foo.c
gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out
疑问:
执行过程:1-2-3
.d为啥为生成呢 什么时候生成
伪目标
不是一个真正的目标,仅仅是为了执行其所在的规则下面的命令,不应该让make来判断它是否存在,或者是否应该被生成。
.PHONY clean