彻底把握Makeifle(三)
前言
在后面的文章彻底把握Makefile(一)和彻底把握Makefile(二)当中,咱们简要的介绍了一些常见的makefile应用办法,在本篇文章当中咱们将持续介绍一些makefile当中的常见用法。
Makefile中与文件相干的函数
dir与notdir函数
file = ./files/a.cfdir = $(dir $(file))nfdir = $(notdir $(file))main: demo.c echo $(fdir) echo $(nfdir)
dir函数次要书获取文件门路当中的目录局部,而notdir函数次要是获取文件门路当中文件名的局部,执行下面的makefile后果如下所示:
suffix函数
这个函数次要是用于获取文件的后缀名。
file = ./files/a.cfdir = $(dir $(file))nfdir = $(notdir $(file))name = $(suffix $(file))main: demo.c echo $(fdir) echo $(nfdir) echo $(name)
下面的makefile执行后果如下下图 所示:
basename
这个函数用于获取文件门路当中除去后缀名的局部。
file = ./files/a.cbase = $(basename $(file))main: demo.c echo $(base)
addsuffix
这个函数次要是给文件加上后缀的。
file = ./files/a.cbase = $(addsuffix .c, $(file))main: demo.c echo $(base)
下面的代码执行后果如下:
下面的后果就示意在文件的开端加上了对应的后缀名。
addprefix
这个函数的次要作用就是在字符串的后面加上一串字符。
file = files/a.cbase = $(addprefix ./src/main/, $(file))main: demo.c echo $(base)
下面的makefile执行后果如下图所示:
循环函数foreach
foreach
函数的次要应用规定为:
$(foreach <var>,<list>,<text>)
咱们间接应用一个例子来阐明这个状况:
files = a.c b.c c.c d.cnew_files = $(foreach n, $(files), $(n)pp)main: demo.c echo $(new_files)
下面的makefile输入后果如下图所示:
foreach
函数会将files当中的字符串先依照空格、tab键、回车换行符进行宰割,而后将宰割后的值一个一个的放入变量n
当中,而后会产生一个字符串$(n)pp,最终将这些字符串通过空格拼接起来并且赋值给new_files,这才会有最终的后果。
下面的过程对应一个python代码如下所示:
call函数
call函数在makefile当中能够用于调用咱们自定义的一个表达式,他的语法个数如上面所示:
$(call <expression>,<parm1>,<parm2>,...,<parmn>)
- <expression>示意定义的表达式的名字。
- <parmn>示意第n个参数,咱们在<expression>当中能够应用
$(n)
进行援用。
咱们当初有一个需要就是将两个字符两头加上多个横杠,比方上面的makefile。
a=a.cb=b.cc=$(a)-------$(b)main: demo.c echo $(c)
下面的makefile执行后果如下图所示:
然而如果咱们想要反复实现这个性能的话,咱们就不须要每次都去写这样一个表达式,而是咱们应该写一个表达式而后进行调用。
a=a.cb=b.cc=$(1)-------$(2) # 定义表达式c $(1) 示意应用第一个参数 $(2) 示意应用第二个参数main: demo.c echo $(call c, $(a), $(b)) # c 就是定义好的表达式 这里调用表达式c
下面的makefile输入后果和下面一样:
在makefile当中应用shell函数
咱们在makefile的表达式当中能够应用shell的函数。
比方当初咱们有一个文件叫做test.txt
,文件的内容如下所示:
a.c b.c c.c d.c
咱们的makefile内容如下:
content=$(shell cat test.txt) # 将shell命令的输入内容赋给contentmain: demo.c echo $(content) # 输入content
下面的makefile执行后果如下图所示:
origin函数
origin这个函数次要是返回变量的定义形式,应用格局如下:
$(origin <variable>) # 其中 variable 是变量名字 这里不须要应用 $ 符号去援用
这个函数的输入后果又上面这些值:
undefined
如果 <variable>
素来没有定义过,origin函数返回这个值 undefined
default
如果 <variable>
是一个默认的定义,比方“CC”这个变量。
GNU make默认变量:
- AR-->归档维护程序的名称,默认值为ar
- ARFLAGS-->归档维护程序的选项
- AS-->汇编程序的名称,默认值为as
- ASFLAGS-->汇编程序的选项
- CC-->C编译器的名称,默认为gcc
- CPP-->C预编译器的名称
- CCFLAGS-->C编译器的选项
- CPPFLAGS-->C预编译的选项
- CXX-->C++编译器的名称,默认为g++
- CXXFLAGS-->C++编译器的选项
- FC-->FORTRAN编译器的名称,默认为f77
- FFLAGS-->FORTRAN编译器的选项
environment
variable是一个环境变量。
file
如果 <variable>
这个变量被定义在Makefile中。
command line
如果 <variable>
这个变量是被命令行定义的。
override
如果 <variable>
是被override批示符从新定义的,对于override的应用,请查看本文彩蛋局部。
当初咱们举一个例子,去看看下面这些值对应的例子:
override var = aaaafile=filemain: demo.c echo $(origin file) # makefile 外部定义的 echo $(origin data) # 命令行定义的 @echo $(origin var) # override 重写 @echo $(origin JAVA_HOME) # JAVA_HOME 是一个环境变量 @echo $(origin CXX) # 默认定义的变量
咱们当初应用make命令测试一下下面的makefile输入后果:
error函数
在makefile当中咱们能够应用error函数让makefie进行执行。当咱们有需要:让在某种条件下让makefile进行编译
data=dataifeq ($(data), data)$(error "data == data")endifmain: main.c gcc main.c
当初咱们执行makefile,输入后果如下:
还有一个函数warning
应用办法和下面一样用于产生正告。
彩蛋
@符号
有时候在makefile当中咱们不想输入某些命令(如果不进行设置makefile会输入每一条咱们执行过的命令),比方上面的makefile。
main: demo.c echo hello world
下面的makefile输入后果为:
当初咱们不想输入echo hello world
这条命令,咱们能够应用@进行润饰,在makefile当中如果一条命令应用@进行了润饰,那么这条命令就不会输入。
main: demo.c @echo hello world
下面的makefile输入后果如下:
override应用
在应用make命令的时候能够进行变量的设定,这个变量咱们能够在makefile文件当中应用:
main: demo.c @echo $(var) # 应用变量 var
咱们当初输出make命令并且指定参数而后查看后果:
能够看到咱们指定的变量在makefile当中能够应用了。
然而如果在咱们的makefile当中也有一个变量叫做var
那么makefile当中的var
就会被笼罩。比方像上面这个例子一样:
如果咱们想让咱们本人的变量起作用的话咱们能够应用override:
总结
在本篇文章当中次要给大家介绍了Makefile当中一些罕用的函数的应用,整体比较简单,大家能够对照着makefile和后果本人实现一遍。
以上就是本篇文章的所有内容了,我是LeHung,咱们下期再见!!!更多精彩内容合集可拜访我的项目:https://github.com/Chang-LeHu...
关注公众号:一无是处的钻研僧,理解更多计算机(Java、Python、计算机系统根底、算法与数据结构)常识。