最近再次学习makefile,对一些个人觉得重要或者有用的东西,做个总结以便后续查用.
1.-作用
clean:-rm edit
rm 命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事 .
2.make自动推导
GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令.只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make 找到一个 whatever.o ,那么 whatever.c ,就会是 whatever.o 的依赖文件.并且 cc -c whatever.c 也会被推导出来.
main.o : main.c defs.h cc -c main.c 利用自动推导功能可以简写为main.o : defs.h
3.makefile的文件名字
默认情况下,make会按照“GNUmakefile”、“makefile”、“Makefile”的顺序搜索,大多数的make都支持makefile和Makefile,当然也可以通过-f来指定自定义的名字,如make -f make.linux
4.include使用
make 命令开始时,会把找寻 include 所指出的其它 Makefile.如果没有指定绝对或相对路径,ma会在当前目录下寻找,如果没有找到,make 还会在下面目录找:
1.有“-I”或“–include-dir”参数,make 就会在这个参数所指定的目录下去寻找;
2.目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,make 也会去找
5.通配符
objects = *.o
表示了,通符同样可以用在变量中.不是说[*.o]会展开,不!objects的值就是“*.o” .
如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合,那么,你可以这样 :
objects := $(wildcard *.o)
6.phony
伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以 make 无法生成它的依赖关系和决定它是否要执行。只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了.
为了避免和文件重名的这种情况,使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”.
.PHONY : clean
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样 .
伪目标的用法是先声明后使用,伪目标实质:伪目标是make中特殊目标.PHONY的依赖.
当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行.
7.自动生成依赖性
在 Makefile 中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我们的
main.c 中有一句“#include “defs.h””,那么我们的依赖关系应该是:
main.o : main.c defs.h
但是,如果是一个比较大型的工程,你必需清楚哪些 C 文件包含了哪些头文件,并且,
你在加入或删除头文件时,也需要小心地修改 Makefile,这是一个很没有维护性的工
作。为了避免这种繁重而又容易出错的事情,我们可以使用 C/C++编译的一个功能。大
多数的 C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并
生成一个依赖关系。例如,如果我们执行下面的命令:
cc -M main.c 其输出是:main.o : main.c defs.h
8.ignore-errors
给 make 加上“-i”或是“–ignore-errors”参数,那么,Makefile中所有命令都会忽略错误;-k”或是“–keep-going” ,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则
9.变量
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号 ,最好用()或者{}将变量包含起来.
:=可以避免在make中出现无限展开的情况,但是前面的变量不能使用后面的变量,只能使用前面已定义好了的变量 .
y := $(x) bar x := foo
那么,y 的值是“bar”,而不是“foo bar”.
10.定义空格
在操作符的右边是很难描述一个空格的,那么,可以先用一个 Empty 变量来标明变量的值开始,而后面采用“#”注释符来表示变量定义的终止,这样,可以定义出一个空格的变量.
nullstring :=
space := $(nullstring) # end of the line
11.变量值替换
通过$(var:a=b)”或是${var:a=b}替换变量中的共有的部分
foo := a.o b.o c.o
bar := $(foo:.o=.c)
$(bar)变量的值为“a.c b.c c.c”
makfile常见命令总结
最新推荐文章于 2023-08-27 20:21:34 发布