彻底把握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、计算机系统根底、算法与数据结构)常识。