Makefile学习笔记(五)

"本文详细介绍了Makefile中的条件判断用法,包括ifeq和ifneq等,以及如何根据$(CC)判断编译选项。同时,讲解了函数的调用语法,如$(function arguments)和${function arguments}
摘要由CSDN通过智能技术生成

使用条件判断

使用条件判断可以让make根据不同的情况执行不同的分支。

一、示例

举例:判断$(CC)是否是gcc,如果是的话则使用GNU函数编译目标

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
[Tab]$(CC) -o foo $(objects) $(libs_for_gcc)
else
[Tab]$(CC) -o foo $(objects) $(normal_libs)
endif

当我们的$(CC)是gcc时,foo的规则就是

$(CC) -o foo $(objects) $(libs_for_gcc)

当我们的$(CC)不是gcc时,foo的规则是

$(CC) -o foo $(objects) $(normal_libs)

二、语法

第一个:比较arg1和arg2是否相同。相同为真,不相同为假

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

第二个:比较arg1和arg2是否相同。不相同为真,相同为假

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

第三个:如果变量< variable-name >的值非空,那表达式为真,否则为假。

	ifdef <variable-name>

举例:

bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif

根据程序的设定可知,frobozz的值为yes
第四个: 如果变量< variable-name >的值为空,那表达式为真,否则为假。

	ifndef <variable-name>

切记:不是命令的行千万不要以[Tab]键开头,空格和空行不会影响结果

使用函数

函数调用后,函数的返回值可以做变量来使用。

一、函数的调用语法

很想变量的使用规则,也是用$来标识的,语法如下:

$(<function> <arguments>)

或是

${<function> <arguments>}

arguments是参数,参数之间用逗号隔开。
举例:

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))

这段代码的作用就是把foo中的空格替换成逗号,subst函数是一个替换函数,第一个参数时被替换字串,第二个参数替换字串,第三个参数替换操作作用的字串

二、字符串处理函数

函数1:

$(subst <from>,<to>,<text>)

名称:字符串替换函数
功能:把字符串text中的from替换成to
返回:函数返回被替换过后的字串

函数2

$(patsubst <pattern>,<replacement>,<text>)

名称:模式字符串替换函数
功能:查找< text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式< pattern>,如果匹配的话,则以< replacement>替换。这里,< pattern>可以包括通配符“%”,表示任意长度的字串。如果< replacement>中也包含“%”,那么,< replacement>中的这个“%”将是< pattern>中的那个“%”所代表的字串。(可以用“/”来转义,以“/%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。

三、文件名操作函数

每个函数的参数字符串都会被当做一个或者一系列的文件名来对待
函数1:

$(dir <names...>)

名称: 取目录函数
功能: 从文件名序列< names>中取出目录部分。目录部分是指最后一个反斜杠之前的部分,如果没有反斜杠,那么返回“ ./ ”

函数2:

$(notdir <names...>)

名称:取文件函数
功能:从文件名序列< names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。
返回:返回文件名序列< names>的非目录部分。

参考资料:

https://blog.csdn.net/haoel/article/details/2894(其他函数请参考大佬写的这篇文章的介绍)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思识己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值