GNU Make manual 学习笔记 C语言 / c++ 构建工具
- 5.函数,控制语句
- 5-1.函数
- 5-1-1.替换,函数$(subst from,to,text),
- 5-1-2.替换,函数$(patsubst pattern,replacement,text)
- 5-1-3.除空格,函数$(strip string)
- 5-1-4.查找字符串,函数$(findstring find , in)
- 5-1-5.过滤匹配,函数$(filter pattern...,text)
- 5-1-6.滤除,函数$(filter-out pattern...,text)
- 5-1-7.排序,函数$(sort list)
- 5-1-8.查找位置,函数$(word n ,text)
- 5-1-9.部分获取字符串,函数$(wordlist s,e,text)
- 5-1-10.获取字符串数量,函数$(words text)
- 5-1-11.首字符串,函数$(firstword names.....)
- 5-1-12.末字符串,函数$(lastword names...)
- 5-1-13.路径名,函数$(dir names...)
- 5-1-14.文件名,函数$(notdir names...)
- 5-1-15.后缀,函数$(suffix names...)
- 5-1-16.文件路径,函数$(basename names...)
- 5-1-17.添加后缀,函数$(addsuffix suffix,names...)
- 5-1-18.添加前缀,函数$(addprefix prefix,namex...)
- 5-1-19.字符串连接,函数$(join list1,list2)
- 5-1-20.真实路径,函数$(realpath names...)
- 5-1-21.绝对路径,函数$(abspath names...)
- 5-1-22.文件操作,函数$(file op filename[,text])
- 5-1-23.shell调用,函数$(shell )
- 5-2.条件控制语句
5.函数,控制语句
make做了一些简单的函数,已知的列在下面,有简单用法。
中文名字仅仅是方便看。
5-1.函数
5-1-1.替换,函数$(subst from,to,text),
将text中匹配from的内容,替换为to的内容。
例子
.PHONY:print
print:
@echo $(subst ee, EE,feet_fault_bee)
5-1-2.替换,函数$(patsubst pattern,replacement,text)
类似上一个函数,特殊的是,使用空格将text切割,然后使用 %.后缀 的方式来匹配替换。
和变量中$(var:suffix=replacement)是很类似的。
例子
.PHONY:print
print:
@echo $(patsubst %.c,%.o, x.c.c bar.c foo)
去除空格
5-1-3.除空格,函数$(strip string)
去除两边的空格
print:
@echo $(strip " abc ")
5-1-4.查找字符串,函数$(findstring find , in)
在字符串中查找指定的字符串,找到就返回这个值,需要完全匹配
print:
@echo $(findstring d ,a b c)
@echo $(findstring a ,b c tea a)
5-1-5.过滤匹配,函数$(filter pattern…,text)
过滤字符,返回符合pattern的字符集
sources :=foo.c bar.o baz.s lib.a
remain =$(filter %.c %.o,$(sources))
print:
@echo $(remain)
5-1-6.滤除,函数$(filter-out pattern…,text)
按照空格分隔text,将符合pattern的字符剔除,
sources =foo.c bar.o baz.s lib.a
remain =$(filter-out %.c %.o,$(sources))
print:
@echo $(remain)
5-1-7.排序,函数$(sort list)
按照自然顺序排序
print:
@echo $(sort foo boo aoo too coo boo 1 5 4)
5-1-8.查找位置,函数$(word n ,text)
按照空格分隔字符串,返回第n个值,从1开始
print:
@echo $(word 2,foo bar baz)
5-1-9.部分获取字符串,函数$(wordlist s,e,text)
空格分隔,从第s位开始,到e位结束,获取字符串,角标从1开始
print:
@echo $(wordlist 2,3, foo bar baz avd abc rgd)
5-1-10.获取字符串数量,函数$(words text)
返回字符串中用空格分隔的字符串的数量
print:
@echo $(words abc aaa vvv bbb)
5-1-11.首字符串,函数$(firstword names…)
将字符串用空格分隔,返回第一结果
print:
@echo $(firstword first name bcd efg ttt ggg hhh)
5-1-12.末字符串,函数$(lastword names…)
将字符串用空格分隔,返回最后一个结果
print:
@echo $(lastword abc ggg hhh jjj last)
5-1-13.路径名,函数$(dir names…)
根据传入的字符,做一个相对路径
print:
@echo $(dir src/foo.c lib/api.c main.c)
5-1-14.文件名,函数$(notdir names…)
根据传入的字符做一个去除路径的文件名
print:
@echo $(notdir src/foo.c lib/api.c main.c)
5-1-15.后缀,函数$(suffix names…)
返回后缀
print:
@echo $(suffix src/foo.c src-1.0/bar.c main)
5-1-16.文件路径,函数$(basename names…)
返回除了后缀的名字,包括路径
print:
@echo $(basename src/foo.c src-1.0/bar.o main)
5-1-17.添加后缀,函数$(addsuffix suffix,names…)
添加后缀
5-1-18.添加前缀,函数$(addprefix prefix,namex…)
添加前缀
print:
@echo $(addsuffix .c, foo bar)
@echo $(addprefix src/, foo bar)
5-1-19.字符串连接,函数$(join list1,list2)
连接连个字符串
print:
@echo $(join a b c,.a .o .c)
5-1-20.真实路径,函数$(realpath names…)
将文件的真实路径返回,不会有相对路径的字符 . 或者..
如果文件存在就返回路径,不存在就返回空
5-1-21.绝对路径,函数$(abspath names…)
返回文件的绝对路径,
不管文件是否真实存在,会使用这个名字和当前路径结合
print:
@echo $(realpath foo.c main.c)
@echo $(realpath src/foo.c src/main.c)
@echo $(abspath foo.c main.c)
5-1-22.文件操作,函数$(file op filename[,text])
文件函数
op有
> 覆盖,就是文件开头开始重写这个文件
>> append,在文件的结束接着写
< 读取这个文件
for_read.txt
some_message
print:
@echo $(file < for_read.txt)
5-1-23.shell调用,函数$(shell )
就是使用shell能用的命令
print:
@echo $(shell echo *.c) #会在当前路径找.c后缀的文件并打印出来
5-2.条件控制语句
5-2.1条件语句,if/else
ifeq (arg1,arg2)
recipe
else
recipe
endif
ifneq (arg1,arg2)
recipe
else
recipe
endif
5-2-2.函数$(foreach var, pattern,text)
作为循环控制的函数
print:
@echo $(foreach target,foo.c bar.o main,operate_$(target))