彻底把握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) != gccelse echo $(cc) = gccendif
执行下面的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还给咱们提供了另外两个关键字ifdef
和ifndef
。
ifdef
和ifndef
用于判断表达式是否定义过,或者是否为空:
foo = 1main: demo.c echo demoifdef foo echo define fooelse echo not define fooendif
下面的makefile的输入后果如下:
在下面的makefile当中咱们定义了foo,因而ifdef
判断正确,输入define foo
,当初批改下面的makefile如下所示说:
main: demo.c echo demoifdef foo echo define fooelse echo not define fooendif
在下面的makefile当中咱们没有定义foo
,因而在下面的makefile当中会输入not define foot
。
咱们在来看一个后果比拟令人纳闷的makefile:
foo = main: demo.c echo demoifdef foo echo define fooelse echo not define fooendif
在下面的makefile当中咱们定义了foo,然而他没有值,咱们看一下这个makefile的输入后果:
下面makefile的输入示意foo
没有被定义,因而当咱们定义一个空变量的时候和不定义的成果是一样的。
bar =foo = $(bar)main: demo.c echo demoifdef foo echo define fooelse echo not define fooendif
在下面的makefile当中咱们定义了一个空的变量bar
然而咱们令foot=$(bar)
咱们看一下下面的makefile文件的输入:
能够看出是定义了foo的尽管foo的实在的值也为空,从这里也能够看出ifdef
和ifndef
在进行判断的时候并不会将变量间接开展,而是直接判断成不为空。
Makfile中的函数
在makefile当中除了可能应用条件表达式之外咱们还能够应用函数,在makefile当中函数的应用规定如下:
$(<函数名> <函数参数>)或者将()替换为{}
函数的调用规定如上图所示,函数参数用,隔开。
字符串函数
subst
$(subst <from>,<to>,<text>)
- 字符串替换函数。
- <text>示意文本,这个函数会将text当中是<from>的字符串替换为<to>。
s = ii am learning makefiless = $(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.css = $(patsubst %.c, %.o, $(s))main: demo.c echo demo echo $(s) echo $(ss)
执行make命令下面的makefile的输入后果如下图所示:
从下面的后果咱们能够看出,patsubst函数将所有的.c文件的后缀都变成了.o。
- 在下面的makefile当中首先会将$(s)当中的字符串依照回车换行、空格以及tab键将$(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.yss = $(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.yss = $(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 5ss = $(words $(s))main: demo.c echo $(ss)
firstword
这个函数次要是用于返回第一个字符串的。
s = 1 2 3 4 5ss = $(firstword $(s))main: demo.c echo $(ss)
在本篇文章当中次要给大家介绍了Makefile当中一些罕用的函数和条件语句的应用,整体比较简单,大家能够对照着makefile和后果本人实现一遍,下期咱们将在makefile当中的一些其余的函数!
以上就是本篇文章的所有内容了,我是LeHung,咱们下期再见!!!更多精彩内容合集可拜访我的项目:https://github.com/Chang-LeHu...
关注公众号:一无是处的钻研僧,理解更多计算机(Java、Python、计算机系统根底、算法与数据结构)常识。