如何编写Makefile

一、书写规则
1、make执行步骤
GNU 的 make 工作时的执行步骤入下:(想来其它的 make 也是类似)
读入所有的 Makefile。
读入被 include 的其它 Makefile。
初始化文件中的变量。
推导隐晦规则,并分析所有规则。
为所有的目标文件创建依赖关系链。
根据依赖关系,决定哪些目标要重新生成。
执行生成命令。
2、环境变量MAKEFILES
如果你的当前环境中定义了环境变量 MAKEFILES,那么,make 会把这个变量中的值做一个类似于 include 的动作。这个变量中的值是其它的 Makefile,用空格分隔。只是,它和 include不同的是,从这个环境变中引入的 Makefile 的“目标”不会起作用,如果环境变量中定义的文件发现错误,make 也会不理。
3、VPATH 指定路径
VPATH = src:…/headers 指定两个目录,“src”和“…/headers”,make 会按照这个顺序进行搜索。目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方)
4、vpath
另一个设置文件搜索路径的方法是使用 make 的“vpath”关键字(注意,它是全小写
的),这不是变量,这是一个 make 的关键字,这和上面提到的那个 VPATH 变量很类似,但是它更为灵活。它可以指定不同的文件在不同的搜索目录中。这是一个很灵活的功能。它的使用方法有三种:
①、vpath 为符合模式的文件指定搜索目录。
②、vpath 清除符合模式的文件的搜索目录
③、vpath 清除所有已被设置好了的文件搜索目录
例:vpath %.h …/headers 要求 make 在“…/headers”目录下搜索所有以“.h”结尾的文件
5、多目标
Makefile 的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是我们就能把其合并起来

<targets ...>: <target-pattern>: <prereq-patterns ...> 
<commands>

targets 定义了一系列的目标文件,可以有通配符。是目标的一个集合。
target-parrtern 是指明了 targets 的模式,也就是的目标集模式。
prereq-parrterns 是目标的依赖模式,它对 target-parrtern 形成的模式再进行一次依赖
目标的定义。
如果将定义成“%.o”,意思是我们的集合中都是以“.o”结尾的, 而如果我们的定义成“%.c”,意思是对所形成的目标
集进行二次定义,其计算方法是,取模式中的“%”(也就是去掉了[.o]
这个结尾),并为其加上[.c]这个结尾,形成的新集合。

objects = foo.o bar.o 
all: $(objects) 
$(objects): %.o: %.c 
$(CC) -c $(CFLAGS) $< -o $@

6、自动生成依赖性 -MM
大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系。需要提醒一句的是,如果你使用 GNU 的 C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
gcc -MM main.c 输出为: main.o : main.c defs.h
GNU 组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每 一个“name.c”的文件都生成一个“name.d”的 Makefile 文件,[.d]文件中就存放对应[.c] 文件的依赖关系。于是,我们可以写出[.c]文件和[.d]文件的依赖关系,并让 make 自 动更新或自成[.d]文件,并把其包含在我们的主 Makefile 中,这样,我们就可以自动 化地生成每个文件的依赖关系了。 这里,我们给出了一个模式规则来产生[.d]文件:

%.d: %.c 
@set -e; rm -f $@; \ 
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ 
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ 
rm -f $@.$$$$ 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值