• Makefile 函数


    函数使用方式

    函数的使用类似变量是使用,语法

    $(function arg1, arg2, arg3,...)

    一、字符串函数

    1.字符串替换

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

    结果是str_from --> str_to (贪婪模式)

    2.模式字符串替换

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

    将符合模式pattern 的text内的部分替换成replacement内容(贪婪),%表示任意长度字符串 。

    3.去除开头和结尾的空格

    $(strip str)

    4.查找字符串

    $(findstr <find>,<in>)

    在in中找到了就返回 find字符串   否则 返回空字符串。

    5.过滤函数 过滤保留符合 模式的字符串

    $(filter <pattern ... >,<text>) 可以有多个模式
    eg:
    sources := foo.c bar.c baz.s ugh.h
    $(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”

    6.反过滤函数

    $(filter-out <pattern ...>,<text>)

    用法同上 结果相反 是要滤除符合模式的字符串

    7.排序函数(常用来去除重复)

    $(sort <list>)
    eg: 
    $(sort foo bar lose)返回 “bar foo lose”

    8.取单词

    $(word <n>,<text>)

    取字符串中的第n个单词,空格作为分割。

    9.取单词串函数

    $(wordlist <s>,<e>,<text>)

    s 和 e是指字符串中的单词 index

    10.统计单词个数

    $(words <text>)

    11.取首个单词

    $(firstword <text>)

    二、文件名操作函数

    1.从文件路径名(/home/xxx/test/hello.c)中取出路径名/home/xxx/test/,支持文件名序列。

    $(dir <names ... >) 

    2.单独取文件名函数,工作方式类似dir 但是它相反的是最终保留文件名 hello.c。

    $(notdir <name ... >)

    3.取后缀函数,同样是上面的 /home/xxx/test/hello.c 最后会返回 .c,多个文件序列 可能会返回 .h .c .c .s .lib 这种结果。

    $(suffix <names ....>) 

    4.取前缀名,同suffix相反 他会去除后缀保留其他(例如 /home/xxx/test/hello)的返回。

    $(basename <names ... >) 

    5.添加后缀,将suffix 后缀添加到 名字list中。

    $(addsuffix <suffix>,<names ... >) 

    6.添加前缀,将prefix 加到后面字符串序列前。

    $(addprefix <prefix>,<names ...>) 

    7.连接函数  同样支持多个 如果list1多个数多,则多出来的将保持不变 如果list2 多 则多出来的直接 附加在最终结果中。

    $(join <list1>,<list2>) --> list1list2

    三、循环控制

    $(foreach <var>,<list>,<text>)

    将参数list中的每个单词放到var中在执行 text中的表达式

    eg:
    names = a b c d 
    files := $(foreach n,$(names),$(n).o)
    $(files)= a.o b.o c.o d.o

    四、分支

    $(if <condition>,<then-part>) or $(if <condition>,<then-part>,<else-part>)

    如果满足条件则执行 then部分 ,如果是后者 还可能执行 else部分

    五、构造函数

    $(call <expression>,<parm1>,<parm2>, ...)

    expression为自定义表达式 参数的个数确定了 后面 parma的个数

    而在 expression 中访问parm1 时使用$(1)

    eg:
    reverse = $(1) $(2)
    
    
    foo = $(call reverse,a,b)
    foo = a b

    如果 reverse = $(2) $(1) 则 foo = b a

    六、变量祖籍查询函数

    $(origin <var>)

    返回
    undefined :变量未定义
    default :默认定义的参数
    file:makefile中
    command line:命令行
    override:被override 指示符重新定义过
    automatic:自动变量

    七、shell函数

    这个函数会生成一个新的shell程序来执行命令(并行),注意: Shell脚本在target里才有效,不能放在目标生成规则里

    $(shell cmd parma ...)

     这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你想像的多得多。

  • 相关阅读:
    闭包
    值类型和引用类型的区别?
    计算机基础知识和基本操作
    Git常用命令
    任务八
    CSS任务七
    CSS任务六
    MySql+EF6,不能选实体框架6.x或者闪退
    以一定的格式生成最新的数据库流水号
    layui父窗体获取弹出窗体元素
  • 原文地址:https://www.cnblogs.com/w-smile/p/12519923.html
Copyright © 2020-2023  润新知