当".c"文件以这样的方式使用时,将自动加入到依赖关系中;由是在省略命令的前提下,可以将".c"文件从依赖关系中省略 。以下是简化过的makefile:
--------------------------------------------------------------------------------
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
-rm edit $(objects)
---------------------------------------------------------------------------------
1.7 另一种风格
如果makefile 中的目标都是以隐含规则生成,可以将规则按照依赖关系分组:
----------------------------------------------------------------------------
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
----------------------------------------------------------------------------
这里"defs.h"作为所有目标文件的依赖 。这种风格是好是坏取决于个人喜好,它非常紧凑,但是将每个目标的依赖信息放在一起看起来更清楚一些 。
1.8 清理
编写规则不至于编译程序 。Makefile 通常描述如何做其它事情:比如删除目录中的目标文件和可执行文件来清理目录 。例子中是这样写的:
clean:
rm edit $(objects)
实际情况是,我们需要处理一些意外事件:存在一个叫做"clean"的文件;如果rm 出错,并不希望make 过程停止下来,修改过的版本如下:
.PHONY : clean
clean :
rm edit $(objects)
这样的规则当然不能放在makefile 的开始,因为这并不是我们缺省要做的工作 。由于"clean"并不是"edit"的依赖,在运行make 时没有参数时,这条规则不会执行;要执行这个规则,必须运行"make clean" 。
Makefile
Makefile 中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释 。
显式规则描述如何生成规则的目标,它列出了目标依赖的文件,指定了产生或更新目标的命令
隐式规则描述如何生成基于文件名的一类文件,说明目标可能依赖于和其文件名类似的文件,指定了相应的命令 。
指令类似与编译器的伪指令,包含:指示make 读入另一个makefile;决定是否忽略makefile 中的一部分;定义一个变量;一行中‘#"开始是注释,直到行末,除非遇到续行符号 。在"define"和命令中不能有注释,其它情况下注释可出现在任何地方 。
2.1 makefile 名字
缺省情况下,make 以下列名字查找makefile:"GNUmakefile","makefile" 和 "Makefile"(注意大小写) 。通常你的makefile 应叫做"makefile"或"Makefile" 。"GNUmakefile"不推荐,除非你的makefile 是为GNU 的make 定制的,其它的make 不认为该名字是一个makefile 的名字 。如果你使用非标准命名的makefile,必须用命令开关"-f" 或 "-file" 。参数 "-f NAME" 或 "--file NAME"告诉make 读入NAME 作为makefile 。如果使用多个该开关,所有的文件将按顺序连接起来 。如果使用该选项,标准的makefile 名字不会自动检测 。
2.2 包含
"include"指令告诉make 暂停处理余下的内容,读入其它makefile 。语法如下:
include FILENAMES
这一行起始可以有空格,但TAB 字符不允许 。如果文件名包含变量或函数,这些将被扩展 。
2.3‘MAKEFILE"变量
如果环境变量"MAKEFILE"已定义,make 认为它的值是一系列空格隔开的文件名,这些文件在处理其它makefile 前被make 程序读入 。这类似于include 指令;这些文件中的目标不会影响缺省目标,而且如果文件未找到的话,make 并不认为是错误 。这个变量的主要用途是递归引用make 程序时通讯 。
推荐阅读
- q点是什么 简介q点是什么
- 布朗族主要分布在哪里 布朗族简介
- 白居易字什么晚年号是什么 白居易的简介晚年号
- gawk的使用方法
- vi 简介
- 关于gcc、gdb 和gmake 的资料
- Makefile工具的使用
- 佛教八大菩萨简介
- 白鹿原简介
- FreeBSD中/etc下的文件简介