-----仅作为学习笔记
6.自动化变量
这理介绍三个最常用的自动化变量:
$@:表示所有目标
$<:表示第一个依赖文件,如果依赖模式是%,那么他就表示一系列文件。
(%为通配符,类似linux上的*)
$^:表示所有依赖。
在了解这个三个自动化变量之前,我们先来写一个程序:
main.c
hello.c
hello.h
Makefile
使用这个Makefile虽然也可以成功编译,但是,一旦编译的文件多了,如果我们还这样编写makefile就会变得非常复杂。所以,自动化变量就派上用场啦。
简化一:用变量表示依赖文件
后面如果我们再增加依赖文件的话,我们直接在变量var后面增加就可以了。
简化二:使用通配符%,和自动化变量$@ $<替代目标和依赖,简化完如下图所示:
简化三:使用自动化变量$^表示所有依赖,简化完如下图所示:
7.wildcard函数
格式:$(wildcard PATTENR)
功能:展开指定的目录
举例:
在/home/longlive/test目录有一个a.c的c文件和一个test的文件夹,在/home/longlive/test文件夹下有一个b.c的文件。
我们在当前目录下创建的makefile里面写下如下代码,echo前面加了@符号,echo这个命令就不显示:
执行结果:
我们得到了./a.c和./test/b.c,所以wildcard函数会把我们指定目录下的c文件展开(显示出指定目录下的c文件且包含路径)。
8.notdir函数
格式:$(notdir $(var))
功能:去掉路径。
举例:
我们在上面的makefile中加上以下代码,因为上面的例子我们得到的结果是./a.c和./test/b.c是有路径的,我们可以直接使用这个变量。
执行结果:
因为notdir函数可以去掉路径,所以./a.c和./test/b.c去掉路径就得到了a.c和b.c
3.dir函数
格式:$(dir <names...>)
功能:取出目录,这里的目录指的是最后一个反斜杠/之前的部分,如果没有反斜杠/就返回当前。
举例:
我们在上面的例子中加入以下代码,如下图所示:
因为var2的值为./a.c和./test/b.c,所以取出目录就是./和./test,如下图所示:
4.patsubst函数
格式:$(patsubst 原文件,目标文件,文件列表)
功能:替换文件后缀
举例
我们在上的例子中加入以下代码,如下图所示:
这个函数会把var1变量的a.c和b.c的.c后缀替换为.o,如下图所示:
替换我们可以使用这个函数,也可以使用$(var:a=b)这个格式来替换,我们来改一下上面的代码,如下图所示:
运行结果如下:
5.foreach函数
格式:$(foreach <var>,<list>,<test>)
功能:把参数<list>中的单词逐一取出放到函数<var>所指定的变量中,然后再执行<test>所包含的表达式。每次<test>会返回一个字符串
举例:
因为var2变量的值为./和./test,所以先把./和./test/取出来放在n变量,然后再执行wildcard函数取出./和./test/下面的c文件的路径。执行结果如下图所示: