1.make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。
- makefile规则
target ... : prerequisite ...
command
target : 目标文件
prerequisite: 依赖文件
command:任意shell 命令
-
makefile 内容都有啥
-
显式规则
规则说明了如何生成一个或多个目标文件 -
隐晦规则
由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较简略地书写 Makefile,这是由make所支持的 -
变量定义
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像你C语言中的 宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置 -
文件指示:
在一个文件中引用另外一个文件 -
注释
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用 # 字符
-
-
引用其它的makefile
include <filename>
filename 可以是当前操作系统Shell的文件模式(可以包含路径和通配符)
在 include 前面可以有一些空字符,但是绝不能是 Tab 键开始。 include 和 <filename> 可以用一个或多个空格隔开。举个例子,你有这样几个Makefile: a.mk 、 b.mk 、 c.mk ,还有一个文件叫 foo.make ,以及一个变量 $(bar) ,其包含 了 e.mk 和 f.mk ,那么,下面的语句:
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
- 通配符例子
objects = *.o
上面这个例子,表示了通配符同样可以用在变量中。并不是说 *.o 会展开,不!objects的值就是 *.o 。Makefile中的变量其实就是C/C++中的宏。如果你要让通配符在变量中展开,也就是 让objects的值是所有 .o 的文件名的集合,那么,你可以这样:
objects := $(wildcard *.o)
- i另给一个变量使用通配符的例子:
objects := $(wildcard *.c)
- ii. 列出(i)中所有文件对应的 .o 文件,在(iii)中我们可以看到它是由make自动编译出的
$(patsubst %.c,%.o,$(wildcard *.c))
- iii. 由(i)(ii)两步,可写出编译并链接所有 .c 和 .o 文件
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
- 文件搜索
在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。 所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告 诉make,让make在自动去找。
Makefile文件中的特殊变量 VPATH 就是完成这个功能的,如果没有指明这个变量,make只会在当前 的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当前目录找不到的情况下 ,到所指定的目录中去找寻文件了。
VPATH = src:../headers
上面的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。目录由“冒号”分隔 。(当然,当前目录永远是最高优先搜索的地方)
另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是 一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不 同的搜索目录中。这是一个很灵活的功能。它的使用方法有三种:
1. vpath <pattern> <directories>
为符合模式<pattern>的文件指定搜索目录<directories>
2. vpath <pattern>
清除符合模式<pattern>的文件的搜索目录。
3. vpath
清除所有已被设置好了的文件搜索目录。
vapth使用方法中的<pattern>需要包含 % 字符。 % 的意思是匹配零或若干字符,(需引用 % ,使用 \ )例如, %.h 表示所有以 .h 结尾的文件。<pattern>指定了要搜索 的文件集,而<directories>则指定了< pattern>的文件集的搜索的目录。
我们可以连续地使用vpath语句,以指定不同搜索策略。如果连续的vpath语句中出现了相同的<pattern> ,或是被重复了的<pattern>,那么,make会按照vpath语句的先后顺序来执行搜索。
vpath %.h ../headers
vpath % blish
- 伪目标
.PHONE 声明目标并没有文件对应,
- 多目标
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
上述规则等价于:
bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > littleoutput
其中, -$(subst output,,$@) 中的 $ 表示执行一个Makefile的函数,函数名为subst, 后面的为参数。关于函数,将在后面讲述。这里的这个函数是替换字符串的意思, $@ 表示目标的 集合,就像一个数组, $@ 依次取出目标,并执于命令。
- 静态模式
<targets ...> : <target-pattern> : <prereq-patterns ...>
<commands>
...
网友评论