一、条件判断
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