彻底把握 Makeifle(三)
前言
在后面的文章彻底把握 Makefile(一)和彻底把握 Makefile(二)当中,咱们简要的介绍了一些常见的 makefile 应用办法,在本篇文章当中咱们将持续介绍一些 makefile 当中的常见用法。
Makefile 中与文件相干的函数
dir 与 notdir 函数
file = ./files/a.c
fdir = $(dir $(file))
nfdir = $(notdir $(file))
main: demo.c
echo $(fdir)
echo $(nfdir)
dir 函数次要书获取文件门路当中的目录局部,而 notdir 函数次要是获取文件门路当中文件名的局部,执行下面的 makefile 后果如下所示:
suffix 函数
这个函数次要是用于获取文件的后缀名。
file = ./files/a.c
fdir = $(dir $(file))
nfdir = $(notdir $(file))
name = $(suffix $(file))
main: demo.c
echo $(fdir)
echo $(nfdir)
echo $(name)
下面的 makefile 执行后果如下下图 所示:
basename
这个函数用于获取文件门路当中除去后缀名的局部。
file = ./files/a.c
base = $(basename $(file))
main: demo.c
echo $(base)
addsuffix
这个函数次要是给文件加上后缀的。
file = ./files/a.c
base = $(addsuffix .c, $(file))
main: demo.c
echo $(base)
下面的代码执行后果如下:
下面的后果就示意在文件的开端加上了对应的后缀名。
addprefix
这个函数的次要作用就是在字符串的后面加上一串字符。
file = files/a.c
base = $(addprefix ./src/main/, $(file))
main: demo.c
echo $(base)
下面的 makefile 执行后果如下图所示:
循环函数 foreach
foreach
函数的次要应用规定为:
$(foreach <var>,<list>,<text>)
咱们间接应用一个例子来阐明这个状况:
files = a.c b.c c.c d.c
new_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.c
b=b.c
c=$(a)-------$(b)
main: demo.c
echo $(c)
下面的 makefile 执行后果如下图所示:
然而如果咱们想要反复实现这个性能的话,咱们就不须要每次都去写这样一个表达式,而是咱们应该写一个表达式而后进行调用。
a=a.c
b=b.c
c=$(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 命令的输入内容赋给 content
main: 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 = aaaa
file=file
main: 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=data
ifeq ($(data), data)
$(error "data == data")
endif
main: 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、计算机系统根底、算法与数据结构)常识。