关于makefile:彻底掌握Makefile二

33次阅读

共计 4123 个字符,预计需要花费 11 分钟才能阅读完成。

彻底把握 Makefile(二)

前言

在后面的文章彻底把握 Makefile(一)当中,咱们简要的介绍了一些常见的 makefile 应用办法,在本篇文章当中咱们将持续介绍一些 makefile 当中的常见用法。

Makefile 中的条件判断

ifeq 和 ifneq

咱们在写 makefile 的时候经常会有通过 if 语句进行判断的需要,比如说依据不同的文件设置不同的编译器等等。

cc=g++

main: demo.c
    echo $(cc)

ifeq ($(cc), gcc)
    echo $(cc) = 相等的语句执行了
else
    echo $(cc) != 不相等的语句执行了
endif

下面的 makeifle 的执行后果如下:

在下面的 makefile 当中定义了一个变量 cc,他的值为 gcc。在下面的 makefile 当中 ifeq 示意如果后边的表达式成立的话,也就是 $(cc) 的值等于 gcc 那么就执行前面的语句,否则执行 else 前面的语句。依据下面 makefile 的执行后果来看,$(cc)和 gcc 不相等,因而和咱们的期待的后果是统一的。

咱们批改下面的 makefile 文件如下:

cc=g++

main: demo.c
    echo $(cc)

ifneq ($(cc), gcc)
    echo $(cc) != gcc
else
    echo $(cc) = gcc
endif

执行下面的 makefile 文件输入的后果如下:

在下面的 makefile 当中 ifneq 的含意示意如果不相等,因为 g ++ 不等于 gcc,因而这个满足条件,程序执行的后果满足条件。

对于 make 的输入问题,当 makefile 执行到 echo $(cc) != gcc 的时候,首先这条命令会被 make 输入,而后 make 会执行这条命令,而这条命令是输入g++ != gcc,因而才会有下面的输入。echo g++ != gcc,而执行这条命令还会输入g++ != gcc,看到这应该可能了解下面的 makefile 的输入后果了。

后面两个关键字的语法如下所示:

ifeq (<arg1>, <arg2>)
ifeq '<arg1>' '<arg2>'
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" '<arg2>'
ifeq '<arg1>' "<arg2>"

ifneq (<arg1>, <arg2>)
ifneq '<arg1>' '<arg2>'
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" '<arg2>'
ifneq '<arg1>' "<arg2>"

ifdef 和 ifndef

除了下面的两个关键字之外,make 还给咱们提供了另外两个关键字 ifdefifndef

ifdefifndef 用于判断表达式是否定义过,或者是否为空:

foo = 1
main: demo.c
    echo demo
ifdef foo
    echo define foo
else
    echo not define foo
endif

下面的 makefile 的输入后果如下:

在下面的 makefile 当中咱们定义了 foo,因而 ifdef 判断正确,输入define foo,当初批改下面的 makefile 如下所示说:

main: demo.c
    echo demo
ifdef foo
    echo define foo
else
    echo not define foo
endif

在下面的 makefile 当中咱们没有定义foo,因而在下面的 makefile 当中会输入not define foot

咱们在来看一个后果比拟令人纳闷的 makefile:

foo = 
main: demo.c
    echo demo
ifdef foo
    echo define foo
else
    echo not define foo
endif

在下面的 makefile 当中咱们定义了 foo,然而他没有值,咱们看一下这个 makefile 的输入后果:

下面 makefile 的输入示意 foo 没有被定义,因而当咱们定义一个空变量的时候和不定义的成果是一样的。

bar =
foo = $(bar)
main: demo.c
    echo demo
ifdef foo
    echo define foo
else
    echo not define foo
endif

在下面的 makefile 当中咱们定义了一个空的变量 bar 然而咱们令 foot=$(bar) 咱们看一下下面的 makefile 文件的输入:

能够看出是定义了 foo 的尽管 foo 的实在的值也为空,从这里也能够看出 ifdefifndef在进行判断的时候并不会将变量间接开展,而是直接判断成不为空。

Makfile 中的函数

在 makefile 当中除了可能应用条件表达式之外咱们还能够应用函数,在 makefile 当中函数的应用规定如下:

$(< 函数名 > < 函数参数 >)
或者
将 () 替换为{}

函数的调用规定如上图所示,函数参数用, 隔开。

字符串函数

subst
$(subst <from>,<to>,<text>)
  • 字符串替换函数。
  • <text> 示意文本,这个函数会将 text 当中是 <from> 的字符串替换为 <to>。
s = ii am learning makefile
ss = $(subst ii, you, $(s))

main: demo.c
    echo demo
    echo $(s)
    echo $(ss)

下面的 makefile 执行后果如下图所示:

从下面的后果咱们能够看出,的确将字符串 s 当中的 ii 替换成了 you!

patsubst
$(patsubst <pattern>,<replacement>,<text>)
  • pattern 示意第一个参数,用于示意如何对 text 进行匹配。
  • replacement 示意第二个参数 示意如何对匹配的字符进行重写。
  • patsubst 在进行匹配替换的时候,会先将字符串 text 依据空格或者 tab 键或者回车换行符进行宰割,而后一一的进行替换和匹配。

这个函数也是一个字符串替换函数,然而与下面的函数不同的是这是一个模式替换。咱们间接依据例子来进行剖析:

s = a.c b.c d.c abc.c abo.c
ss = $(patsubst %.c, %.o, $(s))

main: demo.c
    echo demo
    echo $(s)
    echo $(ss)

执行 make 命令下面的 makefile 的输入后果如下图所示:

从下面的后果咱们能够看出,patsubst 函数将所有的.c 文件的后缀都变成了.o。

  • 在下面的 makefile 当中首先会将 &dollar;(s)当中的字符串依照回车换行、空格以及 tab 键将 &dollar;(s)当中的进行宰割,而后一个一个进行 patsubst 操作,而后将失去后果合并起来。
  • 在下面的 patsubst 函数当中 % 符号是一个通配符,他匹配了.c 后面的所有符号。
  • 在 pattern 当中的符号为 ”%.c”,这个示意用 % 匹配了.c 后面的所有的字符。
  • 在 replacement 当中的字符串为 ”%.o”,这个 % 用于示意在 pattern 当中匹配到的字符串,比方对于 abo.c 来说 % 就代表了 abo,因而被替换的字符串就是 abo.o。

你如果你对 Python 有所理解的话,那么下面的替换代码等价的 Python 代码如下所示:

Strip
$(strip <string>)
  • 次要性能去掉字符串 string 首尾的空格。
findstring
$(findstring <find>,<text>)
  • 这个函数的作用是从字符串 <text> 当中寻找字符串 <find>,如果找到了字符串 <find> 就返回字符串 <find>,否则返回空。

filter

$(filter <pattern...>,<text>)

这是一个过滤函数,这个函数执行时,首先会依据空格或者 tab 键或者回车换行符进行宰割,而后一一的进行 filter 函数的操作。而后遍历每一个被宰割进去的字符,如果不满足 pattern 的规定的话对应的字符就会被过滤掉。

s = a.c abo.c s.o s.y x.o x.y
ss = $(filter %.c %.o, $(s))

main: demo.c
    echo $(ss)

下面的 makefile 执行之后输入的后果如下图所示:

能够看过滤掉了不是以.c 和.o 结尾的文件。

下面的过滤函数对应的 Python 代码如下所示:

filter-out

这个函数和 filter 的用法是一样的只不过,作用刚好相同,filter 是保留符合条件的字符串,filter-out 是保留不符合条件的字符串。

s = a.c abo.c s.o s.y x.o x.y
ss = $(filter-out %.c %.o, $(s))

main: demo.c
    echo $(ss)

sort

这个函数次要是用于帮忙字符串排序的,同时还会取出宰割之后雷同的字符串。

s = g a b c d e f  a a a a 
ss = $(sort $(s))

main: demo.c
    echo $(ss)

以上的 makefile 输入后果如下图所示:

从下面的输入后果咱们能够验证 sort 不仅能够给字符串排序还会去除雷同的字符串。

word
$(word <n>,<text>)

这个性能很简略,返回 <text> 当中第 <n> 个字符。

s = g a b c d e f  a a a a 
ss = $(word 1, $(s)) # 取出第一个字符

main: demo.c
    echo $(ss)

wordlist
$(wordlist <start>,<end>,<text>)

这个也是从字符串当中取出字符,是取出第 <start> 个字符始终到第 <end> 个字符。

s = g a b c d e f  a a a a 
ss = $(wordlist 1, 5, $(s))

main: demo.c
    echo $(ss)

words

统计单词的个数。

s = 1 2 3 4 5
ss = $(words $(s))

main: demo.c
    echo $(ss)

firstword

这个函数次要是用于返回第一个字符串的。

s = 1 2 3 4 5
ss = $(firstword $(s))

main: demo.c
    echo $(ss)

在本篇文章当中次要给大家介绍了 Makefile 当中一些罕用的函数和条件语句的应用,整体比较简单,大家能够对照着 makefile 和后果本人实现一遍,下期咱们将在 makefile 当中的一些其余的函数!


以上就是本篇文章的所有内容了,我是LeHung,咱们下期再见!!!更多精彩内容合集可拜访我的项目:https://github.com/Chang-LeHu…

关注公众号:一无是处的钻研僧,理解更多计算机(Java、Python、计算机系统根底、算法与数据结构)常识。

正文完
 0