20230427Makefile函数

一、条件判断

ifeq($(VAR),val)
	#指令1
else
	#指令2
endif

$(VAR):表示要判断的变量名称
val:表示要判断的值

DEBUG := 1
CC := gc

ifeq($(DEBUG),1)
	CFLAGS := -g -O0
else
	CFLAGS := -O2
endif

all:
	$(CC)$(CFLAGS) -o app app.c

上述示例中,判断"DEBUG"的值是否为1
如果为1,则设置"CHLAGS"变量为"-g -O0",表示使用调试标志进行编译
如果不为1,则设置"CHLAGS"变量为"-O2",表示使用优化标志进行编译

#判断某个变量是否已定义,如果未定义则设置为"default.c"
ifedf MYSOURCE
	SOURCE := $(MYSOURCE)
else
	SOURCE := default.c
endif

此外还有"ifndef",与"ifdef"相反,判断两者是否不同

注意:判断语句中可以调用函数,但最好不要使用自动化变量(如"$@"),因为"make"命令在读取Makefile时就计算判断结果并选定语句,而自动化变量在运行时才展开

二、函数调用

函数用来完成某些特定的任务,一组定义好的操作,通过调用函数的方式来执行这些操作

$(<function> <arguments>)

<function>:表示函数名
<arguments>:函数的参数,以","或空格分隔

#示例
$(subst m a k e $(f) $(i) $(l) $(e))

1、字符串处理

(1)、“subst”

功能:用来替换字符串中的某些子串

#语法
$(subst <from>,<to>,<text>)

<from>:替换前的字符串
<to>:替换后的字符串
<text>:等待被替换的字符串

#示例
$(subst aa,AA,aaBBCC)

上述示例中,将"aaBBCC"中的"aa"替换为"AA",得到"AABBCC"

(2)、“patsubst”

功能:模式替换函数,用于对文本中的所有符合某种模式的子串进行替换

#语法
$(patsubst <pattern>,<replacement>,<text>)

<pattern>:替换的目标格式,可用通配符
<replacement>:替换后的字符串
<text>:等待被替换的字符串,可用变量,多个字符串以空格、"Tab"分隔

#示例
obj = main.c foo.c
$(patsubst %.c,%.o,$(obj) bar.c)
#下方示例与$(patsubst %.c,%.o,$(obj))等价
$(obj:.o=.c)

上述示例中,将所有".c"文件后缀替换为".o"

(3)、“strip”

功能:去掉变量中开头和结尾的所有空字符串,保留中间的

#语法
$(strip <string>)

<string>:要处理的字符串

#示例
FOO =      hello  word
$(strip $(FOO) a b  c    )
#"hello  word a b  c"

(4)、“findstring”

功能:用于查找一个字符串中是否包含另一个子串,找到则返回"",否则返回空

#语法
$(findstring <find>,<in>)

<find>:要找的字符串
<in>:源字符串

#示例
$(findstring a,a bc def)
$(findstring a,x bc def)

上述示例中,第一个返回"a"字符串,第二个返回空字符串

(4)、“filter”

功能:用于从一组字符串中筛选出符合条件的字符串,然后返回一个新的字符串列表,可以同时查找多个模式

#语法
$(filter <pattern>,<text>)

<pattern>:要查找的模式,可用通配符
<text>:被操作的初始字符串列表

#示例
obj = main.c mian.o main.d foo.c foo.o foo.d
$(filter %.c %.o,$(obj))
#返回值为main.c main.o foo.c foo.o

(5)、“filter-out”

功能:用于从一组字符串中筛选出不符合条件的字符串,与"filter"相对

#语法
$(filter-out <pattern>,<text>)

<pattern>:要查找的模式,可用通配符
<text>:被操作的初始字符串列表

#示例
obj = main.c mian.o main.d foo.c foo.o foo.d
$(filter %.c %.o,$(obj))
#返回值为main.d foo.d

(6)、“sort”

功能:用于对一组字符串进行排序,同时去掉重复的字符串

#语法
$(sort <list>)

<list>:被操作的初始字符串列表,字符串之间用空格分隔

#示例
obj = cat apple bee apple egg dog
$(list $(obj))
#返回值为apple bee cat dog egg

(6)、“word”

功能:用于从一个字符串列表中提取出指定位置的单词(以空格为分隔符)

#语法
$(word <n>,<list>)

<n>:表示要提取的单词位置
<list>:被操作的初始字符串列表

#示例
obj = cat apple bee apple egg dog
$(word 2,$(obj))
#返回值为apple
#位置超出列表则返回空

(7)、“wordlist”

功能:用于从一个字符串列表中提取出指定位置的单词(以空格为分隔符)

#语法
$(wordlist <m>,<n>,<list>)

<m>:表示要提取的单词起始位置
<n>:表示要提取的单词末尾位置
<list>:被操作的初始字符串列表

#示例
obj = cat apple bee apple egg dog
$(word 2,4,$(obj))
#返回值为apple bee apple
#位置超出列表的部分返回空

(8)、“words”

功能:用于计算一个字符串列表中单词个数

#语法
$(words <list>)

<list>:被操作的初始字符串列表

#示例
obj = cat apple bee apple egg dog
$(words $(obj))
#返回值为6

(9)、“firstword”

功能:用于获取字符串列表的首个单词

#语法
$(firstword <list>)

<list>:被操作的初始字符串列表

#示例
obj = cat apple bee apple egg dog
$(firstword $(obj))
#返回值为cat

2、文件名操作

(1)、“dir”

功能:用于提取路径中的目录部分

#语法
$(dir <path>)

<path>:表示要提取目录部分的路径字符串

#示例
FOO = /home/user1/dir1/file.txt
$(dir $(FOO))
#返回值为/home/user/dir1/
#没有路径返回./

(2)、“nodir”

功能:用于提取路径中的非目录部分,即最后一个"/"后的部分

#语法
$(dir <path>)

<path>:表示要提取非目录部分的路径字符串

#示例
FOO = /home/user1/dir1/file.txt
$(dir $(FOO))
#返回值为file.txt

(3)、“suffix”

功能:用于从一个文件名中提取出其后缀部分

#语法
$(suffix <names>)

<names>:表示要处理的文件名列表,可以是一个或多个字符,用空格分隔

#示例
obj = /usr/include/stdio.h /usr/include/stdlib.h
$(suffix $(obj))
#返回值为.h .h
#没有后缀则返回空字符串

(4)、“basename”

功能:用于从一个文件名中提取出前缀部分(去除路径和扩展名)

#语法
$(basename <names>)

<names>:表示要处理的文件名列表,可以是一个或多个字符,用空格分隔

#示例
obj = /usr/include/stdio.h /usr/include/stdlib.h
$(basename $(obj))
#返回值为stdio stdlib

(5)、“addsuffix”

功能:用于给每个单词加上后缀

#语法
$(addsuffix <suffix>,<names>)

<suffix>:表示要添加的后缀
<names>:表示要处理的文件名列表,可以是一个或多个字符,用空格分隔

#示例
obj = stdio stdlib
$(addsuffix .h,$(obj))
#返回值为stdio.h stdlib.h

(6)、“addprefix”

功能:用于给每个单词加上前缀

#语法
$(addprefix <prefix>,<names>)

<prefix>:表示要添加的前缀
<names>:表示要处理的文件名列表,可以是一个或多个字符,用空格分隔

#示例
obj = stdio.h stdlib.h
$(addprefix src/,$(obj))
#返回值为src/stdio.h src/stdlib.h

(7)、“join”

功能:用于将两个字符串列表组合成一个新的字符串列表

#语法
$(join <list1>,<list2>)

<list1>:表示要组合的字符串前部分列表
<list2>:表示要组合的字符串后部分列表

#示例
FOO = a b c
BAR = 1 2 3
$(join $(FOO),$(BAR))
#返回值为a1 b2 c3

3、“foreach”

功能:循环函数,用于迭代列表中的每一个元素

#语法
$(foreach <var>,<list>,<text>)

<var>:表示迭代元素时用来存储迭代值的变量
<list>:表示要迭代的元素列表
<text>:表示对每个元素执行的操作

#示例
FOO = a b c
$(foreach x,$(FOO),$(x).o)
#返回值为a.o b.o c.o
#注意:x为临时变量 作用域只在函数范围内

4、“if”

功能:逻辑函数,用于根据一个条件的真假情况选择要执行的命令

#语法
$(if <condition>,<then-part>)
$(if <condition>,<then-part>,<else-part>)

<condition>:表示要判断的条件
<then-part>:表示条件为真时执行的命令
<else-part>:表示条件为假时执行的命令

#示例
DEBUG = 0
ifeq ($(DUBUG),1)
	#真时命令
eles
	#假时命令
endif

5、“call”

功能:用于在运行时(非声明)调用一个已定的Macro

#语法
$(call <macro>,<arg1>,<arg2>...)

<macro>:表示要调用的宏名称
<argn>:表示表示要传递给宏的参数,用逗号分隔

#示例
FOO = $(shell expr $$1 + $$2)
all:
	@echo"$(call FOO,1,2)"

上述示例中,定义了一个宏"FOO",使用"expr"命令计算两个参数的和,使用"call"调用宏"FOO"得到结果3

6、“origin”

功能:用于查看变量的定义来源

#语法
$(origin <variable>)

<variable>:表示要查询的变量名返回结果
<undefined>:表示该变量从未被定义
<default>:表示该变量是在Makefile文件的默认赋值中被定义
<environment>:表示该变量是从环境变量中继承
<file>:表示该变量是在Makefile文件中定义的
<command line>:表示该变量是被命令行定义的
<override>:表示该变量是被"override"指示符重新定义的
<automatic>:表示该变量是命令运行中的自动化变量

#示例
FOO := bar
$(origin FOO)
#返回值为file

7、“shell”

功能:将操作系统命令的输出转换成Makefile变量的值

#语法
$(shell <command>)

<command>:表示一个操作系统命令,可以是任何有效的Unix或Windows命令。该命令将在Makefile执行过程中被执行,并将命令的输出作为Makefile变量的值返回

#示例
MYPATH = $(shell pwd)
#返回值为当前目录名称,如/Users/user/Projects/mymakefile

8、“error”

功能:用于生成错误信息

#语法
$(error <message>)

<message>:表示要输出的错误信息,可以是任何字符串或Makefile变量名称

#示例
CC = gcc
CFLAGS = -Wall
ifeq($(CC),)
	$(error CC is not set)
endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值