• Makefile常用函数


    1. 格式

    Makefile 中函数的调用格式如下:

    $(function arguments)

    其中,function 为函数名,arguments 为参数。

    函数名与参数之间由空格Tab分隔,如果有多个参数,这些参数之间由逗号分隔。

    2. 常用函数介绍

    内核的 Makefile 中用到大量的函数,以下介绍一些常用的函数。

    2.1 字符串替换和分析函数

    • $(subst from,to,text)

       其中,subst 为 substitude(v 替代) 的缩写。

       功能:在字符串 text 中,使用 to 替换每一处 from.

       返回:替换过后产生的新的字符串。

       举例:$(subst ee,EE,feet on the street)

       返回结果:fEEt on the strEET

    • $(patsubst pattern,replacement,text)

       其中,patsubst 为 pattern 和 substitude 的缩写。

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

       返回:替换过后产生的新的字符串。

       举例:$(patsubst %.c,%.o,x.c.c bar.c)

       返回结果:x.c.o bar.o

       一种更为简单的批量替换文件后缀的方法--变量的替换引用

       $(VAR:PATTERN=REPLACEMENT)

       它相当于 $(patsubst PATTERN,REPLACEMENT,$(VAR))

       举例:假设有变量定义为“objects = foo.o bar.o baz.o”。为了得到这些.o文件所对应的.c源文件。我们可以使用以下两种方式的任意一个:

       $(objects:.o=.c)
       $(patsubst %.o,%.c,$(objects))

     

    • $(strip string)

       strip意为“脱去”

       功能:去除 string 中前导和结尾的空格,并将中间的多个空格压缩为一个空格。

       返回:脱掉冗余空格之后的新的字符串。

       举例:$(strip a     b   c   )

       返回结果:a b c

    • $(findstring find,in)

       功能:在字符串 in 中搜寻 find ,如果找到,则返回值是传入的参数 find, 否则返回值为空。

       举例:$(findstring a,a b c)

       返回结果:a

       举例:$(findstring a,b c)

       返回结果:

    • $(filter pattern…,text)

       功能:过滤掉 text 中不符合 pattern 的字符串

       举例:$(filter %.c %.s,foo.c bar.c baz.s ugh.h)

       返回结果:foo.c bar.c baz.s

    • $(filter-out pattern…,text)

       功能:$(filter pattern…,text) 的反函数,过滤掉 text 中符合 pattern 的字符串。

       举例:$(filter %.c %.s,foo.c bar.c baz.s ugh.h)

       返回结果:ugh.h

    • $(sort list)

       功能:将 list 中的单词以首字母为准进行升序排序,并去掉重复的单词。

       举例:$(sort foo bar lose foo)

       返回结果:bar foo lose

    2.2 文件名函数

    • $(dir names…)

       功能:从文件名序列 names… 中取出各个文件名的目录部分。文件名的目录部分就是包含在文件名中的最后一个斜线(“/”)(包括斜线)之前的部分。如果没有反斜杠,那么返回./。

       举例:$(dir src/foo.c hacks)

       返回结果:src/ ./

       注意:以上例子中其实是两个文件 src/foo.c 和 ./hacks

    • $(notdir names…)

       功能:从文件名序列 names 中取出非目录部分。非目录部分是指最後一个反斜杠(/)之后的部分,即文件名。

       举例:$(notdir src/foo.c hacks)

       返回结果:foo.c hacks

    • $(basename names…)

       功能:抽取 names 中每一个文件名中除后缀外的一切字符。

       举例:$(basename src/foo.c src-1.0/bar hacks)

       返回结果:src/foo src-1.0/bar hacks

    • $(addsuffix suffix,names…)

       功能:添加后缀。

       举例:$(addsuffix .c foo bar)

       返回结果:foo.c bar.c

    • $(addprefix prefix,names…)

       功能:把前缀 prefix 加到 names 中的每个单词后面

       举例:$(addprefix src/,foo bar)

       返回结果:src/foo src/bar

    2.3 其他函数

    • $(foreach var,list,text)

       功能:把参数 list 中的单词逐一取出放到参数 var 所指定的变量中,然后再执行 text 所包含的表达式。每一次 text 会返回一个字符串,循环过程中, text 的所返回的每个字符串会以空格分隔,最后当整个循环结束时, text 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

       举例:names := a b c d

                files := $(foreach n,$(names),$(n).o)

       返回结果:a.o b.o c.o d.o

    • $(if condition,then-part)

       或是 $(if condition,then-part,else-part)

       功能:if 函数可以包含 else 部分,或是不含。即 if 函数的参数可以是两个,也可以是三个。 condition 参数是 if 的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是, then-part 会被计算,否则 else-part 会被计算。

               而 if 函数的返回值是,如果 condition 为真(非空字符串),那个 then-part 会是整个函数的返回值,如果 condition 为假(空字符串),那么 else-part 会是整个函数的返回值,此时如果 else-part 没有被定义,那么,整个函数返回空字串。

               所以, then-part 和 else-part 只会有一个被计算。

    • $(origin variable)

       功能:origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来的?

                注意,  variable 是变量的名字,不应该是引用。所以你最好不要在 variable 中使用$ 字符。Origin 函数会以其返回值来告诉你这个变量的“出生情况”。

       返回值:

                undefined       如果 variable 从来没有定义过,origin 函数返回这个值。

                default            如果 variable 是一个默认的定义,比如“CC”这个变量。
                environment   如果 variable 是一个环境变量,并且当 Makefile 被执行时, -e 参数没有
    被打开。
                file                  如果 variable 这个变量被定义在 Makefile 中。
                command line 如果 variable 这个变量是被命令行定义的。
                override          如果 variable 是被 override 指示符重新定义的。

                automatic       如果 variable 是一个命令运行中的自动化变量。

    • $(shell command argument)

          功能:相当于在 shell 中执行 command argument。

  • 相关阅读:
    Oracle中查看建立索引和使用索引的注意点
    一个父亲的教育札记——leo鉴书58
    puma 配置,启动脚本
    HDU 6003 Problem Buyer
    c# 类间关系
    前台线程和后台线程总结
    多线程学习进程
    进程类的使用
    c#异步编程
    【程序17】
  • 原文地址:https://www.cnblogs.com/outs/p/7147206.html
Copyright © 2020-2023  润新知