红联Linux门户
Linux帮助

makefile推荐写法

发布时间:2016-08-29 15:15:30来源:linux网站作者:猫步旅人
之前学习makefile,依赖的.o文件简单的就是自己写出来,或者通过生成.depend文件,通过include .depend文件的方法,获得依赖规则,下面介绍一种推荐写法,同样是将:
gcc -MM main.c
 
这样获得的依赖规则写入文件,然后通过include文件的方法获取依赖规则,具体如下。假如当前路径下有mycp.h,mycp.c,main.c,编译生成可执行文件mycp,能够进行文件之间的拷贝:
TARGET = mycp
OBJECTS = main.o mycp.o
CFLAGS += -I.  -g
CC = gcc
$(TARGET):$(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
$(RM) $(TARGET) $(OBJECTS) core*
sources = $(shell ls *.c)
sinclude $(sources:.c=.d)
%.d:%.c
set -e; rm -rf $@; \
$(CC) $(CFLAGS) -MM $< > $@.$$$$; \
sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $@.$$$$ > $@; \
rm -rf $@.$$$$
 
解释一下最后几句语句,sources变量的值是当前路径下的所有 .c 格式的文件,首先sinclude 会加载 .d 格式的文件,第一次编译时,是没有生成这些文件的,所以会显示没有这些文件。
最后一段语句就是生成 .d 文件的过程,同时也是依赖规则, 最后的反斜杠表示换行,这句话一共有五个动作:
第一个动作是设置模式,然后删除当前目录中的该目标的 .d 文件,通过gcc -MM 获取依赖规则并重定向到 $@.$$$$中,在makefile中$$表示一个$, 四个就表示两个 $$,而在shell 中$$ 表示当前进程的pid。
sed 语句的作用就是替换,比如main.d.7833中的内容是:
main.o: main.c mycp.h
使用sed语句后,将内容重定向到 main.d 文件中为:
main.o main.d : main.c mycp.h
最后一个动作就是将生成的中间的文件删除,只保留 .d 文件。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/23717.html