gun_makefile中文笔记

1、makefile规则

一个简单的Makefile描述规则组成:

TARET...:PREREQUISITES....

COMMAND

...

target:规则的目标,通常是最后需要生成的文件名或者为了实现这个目地而必需的终极过程文件名。可以是.o文件,也可以是最后的可执行程序的文件名。也可以是一个make执行的动作的名称,如clean,称为伪目标。由于clean不会出现中其他任何规则的依赖列表中,在执行make时,它指定的动作不会被执行。可在shell下输入make clean。

prerequisties:规则的依赖,生成规则目标所需要的文件名列表。

command:规则的命令行,规则执行的动作。命令行必须以tab字符开始。

可以使用 \ 进行换行,反斜线之后不能有空格

  1. make如何工作

默认情况下,make执行makefile中第一个规则,此规则的第一个目标称为“最终目的”或者“终极目标”。

当在终端执行make命令之后,make会读取当前目录下的makefile文件,并执行第一个规则。对这些.o文件为目标的规则处理有三种情况:

  1. 目标.o文件不存在,使用规则创建
  2. 目标.o文件存在,规则依赖的文件中任何一个目标有更新,根据规则重新编译生成
  3. 目标.o文件存在,规则依赖的文件中没有被修改过,什么也不做。

3、指定变量

在一个规则中,有一个.o文件作为规则命令的参数列表,该.o文件出现两次,如果需要为command添加一个文件,则需要在两个地方添加,有时会忘记。可以使用一个变量去替代这些文件列表的地方。

如:objects=main.o kbd.o

使用时:$(objects)

  1. 自动推导规则

在使用make编译c文件的规则中的命令可以不明确给出,make本身存在默认的规则,自动完成对c文件的编译并生成对于的.o文件。执行“cc -c”来编译c文件,只需给出需要重建的目标文件,make会自动寻找合适的依赖文件,并使用正确的命令重建。

如:

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. 清除工作目录过程文件

如:

clean:

rm edit$(objects)

实际应用:

.PHONY:clean

clean:

-rm edit $(objects)

通过.PHONY特殊目标将“clean”目标声明为伪目标。避免当磁盘上存在一个名为“clean”文件时,目标“clean”所在规则的命令无法执行, 在命令行之前使用“-”,意思是忽略命令“rm”的执行错误。

  1. makefile内容

一个完整的makefile包含5个东西:显式规则,隐式规则、变量定义、指示符和注释。

显式规则:描述中何种情况下如何更新一个或多个被称为目标的文件。

隐含规则:是make根据一类目标文件(典型的是根据文件名的后缀)而自动推导出来的规则。根据目标文件的名,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。

变量定义:使用一个字符或字符串代表一段文本串,当定义力一个变量后,makefile后续中需要使用此文本的地方,通过引用这个变量实现对文本的使用。

指示符:指明在make程序读取makefile文件过程中所要执行的一个动作。其中包括:

读取一个文件,读取给定文件名的文件,将其内容作为makefile文件的一部分

决定(通常根据一个变量的得值)处理或忽略makefile中的某一特定部分

定义一个多行变量:“\”

注释:“#”

注:在使用指示符“define”定义一个多行的变量或者命令包时,其定义体(“define”和“endef”之间的内容)会被完整的展开到 Makefile 中引用此变量的地方(包含定义体中的注释行);make 在引用此变量的地方对所有的定义体进行处理,决定是注释还是有效内容。

  1. make命令执行

默认的情况下,make 会在工作目录(执行 make 的目录)下按照文件名顺序寻找makefile 文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。通常应该使用“makefile”或者“Makefile”作为一个 makefile 的文件名(推荐使用“Makefile”,首字母大写而比较显著,一般在一个目录中和当前目录的一些重要文件(README,Chagelist 等)靠近,在寻找时会比较容易的发现它)。而“GNUmakefile”是我们不推荐使用的文件名,因为以此命名的文件只有“GNU make”才可以识别,而其他版本的 make 程序只会在工作目录下“makefile”和“Makefile”这两个文件。如果make程序在工作目录下无法找到以上三个文件中的任何一个,它将不读取任何其他文件作为解析对象。但是根据make隐含规则的特性,我们可以通过命令行指定一个目标,如果当前目录下存在符合此目标的依赖文件,那么这个命令行所指定的目标将会被创建或者更新。

当 makefile 文件的命名不是这三个任何一个时,需要通过 make 的“-f”或者“--file”选项来指定 make 读取的 makefile 文件。给 make 指定 makefile 文件的格式为:“-f NAME”或者“—file=NAME”,它指定文件“NAME”作为执行 make 时读取的 makefile文件。也可以通过多个“-f”或者“--file”选项来指定多个需要读取的 makefile 文件,多个 makefile 文件将会被按照指定的顺序进行链接并被 make 解析执行。当通过“-f”或者“--file”指定 make 读取 makefile 的文件时,make 就不再自动查找这三个标准命名的 makefile 文件。

注释:通过命令指定目标使用make的隐含规则:

当前目录下不存在以“GNUmakefile”、“makefile”、“Makefile”命名的任何文件,

1. 当前目录下存在一个源文件foo.c的,我们可以使用“make foo.o”来使用make的隐含规则自动生成foo.o。当执行“make foo.o”时。我们可以看到其执行的命令为:

cc –c –o foo.o foo.c

之后,foo.o将会被创建或者更新。

2. 如果当前目录下没有foo.c文件时,就是make对.o文件目标的隐含规则中依赖文件不存在。如果使用命令“make foo.o”时,将回到到如下提示:

make: *** No rule to make target ‘foo.o’. Stop.

3. 如果直接使用命令“make”时,得到的提示信息如下:

make: *** No targets specified and no makefile found. Stop.

  1. 包含其他makefile文件

使用关键字“include”,include告诉make暂停读取当前的makefile,去读取include指定的一个或多个文件,完成后再继续当前makefile读取,makefile中指示符include书写在独立的一行,如:

incldue FILENAMES....

FILENAMES是shell所支持的文件名,多个文件名用空格或tab隔开。

  1. 特殊字符

9.1、$^,$@,$<的作用

在命令行中,$@表示目标文件,$^表示所有的依赖文件,$<表示第一个依赖文件

如:

main:main.o mytool1.o mytool2.o
gcc -o $@ $^

9.2、匹配符%的作用

允许对文件名进行类似正则运算的匹配。

如:

b%: $(BIN_B)/b%.c $(bb) t1.o t2.o

gcc -o $@ $^

匹配$(BIN_B)/b%.c中的所有b....点c文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值