乐趣区

关于后端:彻底掌握Makeifle三

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

退出移动版