Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427114
  • 博文数量: 71
  • 博客积分: 26
  • 博客等级: 民兵
  • 技术积分: 1246
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 14:46
个人简介

linux --- 一切皆文件

文章分类

全部博文(71)

文章存档

2021年(1)

2019年(2)

2018年(4)

2017年(7)

2016年(11)

2015年(1)

2014年(2)

2013年(33)

2012年(10)

分类: LINUX

2016-02-29 19:00:13

 函数调用语法:

1:
    内嵌函数调用方法:$(funcname  arg1,arg2...)
    自定义函数调用方法:call
    show = $(1) $(2)        #show被认为是一个函数,1,2是通过call传入的参数
    $(call show, a, b)

2:
    内嵌函数调用,function和参数之间通过空格隔开,参数和参数之间通过逗号隔开

3:
    调用函数可以使用$()或者${},但是建议都是用一种风格,建议使用$()。
    $(warning $(aaaa))        #warning 为内嵌函数

4:
    在函数中使用空格和逗号的方法
    empty :=
    comma := ,
    #两个empty引用中间有个空格
    space := $(empty) $(empty) 
    foo := a.c b.c c.c
    bar := $(subst $(space), $(comma), $(foo))

    bar的结果是a.c,b.c,c.c

文本处理函数:

$(subst FROM, TO, TXT)
说明:将TXT中的FROM的内容替换成TO
Example:
    foo = aabbcc
    $(subst bb, ee, $(foo))
    输出:aaeecc

$(patsubst PATR, REPLACE, TXT)
说明:将TXT中的每个用空格隔开的字串中的PATR替换成REPLACE
Example:
    foo = a.c b.c c.c
    $(patsubst %.c, %.o, $(foo))
    输出:a.o b.o c.o

    等价于:$(foo: .c=.o)

$(strip STR)
说明:将STR里用空格分割的每个字串的前后的空格
Example:
    foo =      a     b     c d
    $(strip $(foo))
    output:a b c d

$(findstring FIND, IN)
说明:在IN中查找FIND字符串,有则返回FIND,没有则返回空
Example:
    foo = a b c
    $(findstring a, $(foo))
    output:a

$(filter PATTERN...., TXT)
说明:
    过滤掉不符合PATTERN模式的字串
Example:
    foo = a.c b.c d.s e.s k.el q.el
    $(filter %.c %.s, $(foo))
    output:a.c b.c d.s e.s

$(filter-out PATTERN..., TXT)
说明:输出不符合PATTERN的字串
Example:
    foo = a.c b.c d.s e.s k.el q.el
    bar = a.c b.c
    $(filter-out $(bar), $(foo))
    output:d.s e.s k.el q.el

    $(filter-out %.c %.el, $(foo))
    output:d.s e.s

$(sort LIST)
说明:按照字母顺序升序排序,并且去重复
Example:
    foo = aa dd bb aa
    $(sort $(foo))
    output:aa bb dd

$(word N, TXT)
说明:获取TXT中第N个单词
Example:
    foo = a.c b.c d.c
    $(word 2, $(foo))
    output:b.c

$(wordlist START, END, TXT)
说明:取出TXT中第START个单词开始到END
Example:
    foo = a.c b.c c.c d.c e.c
    $(wordlist 2,3, $(foo))
    output:b.c c.c

$(words TXT)
说明:返回TXT中以空格分割的单词个数
Example:
    foo = a.c b.c d.c
    $(words $(foo))
    output:3

$(firstword TXT)
说明:获取TXT中的第一个单词,等价于 $(words 1, TXT)
Example:
    foo = a.c b.c d.c
    $(firstword $(foo))
    output:a.c

empty :=
space := $(empty) $(empty)
VPATH = src:../include
override CFLAGS += $(patsubst %, -l%, $(subst :,$(space), VPATH))
output:CFLAGS += -lsrc -l../include

文件名处理:

$(dir NAMES)
说明:获取最后一个/前面的目录
Example:
    foo = /home/admin/xx.txt a.c
    $(dir $(foo))
    output:/home/admin ./                #单独的文件返回./

$(notdir NAMES)
说明:获取最后一个/后面的文件
Example:
    foo = /home/admin/xx.txt a.c
    $(notdir $(foo))
    output:xx.txt a.c

$(suffix NAMES)
说明:获取文件拓展名
Example:
     foo = /home/admin/xx.txt a.c aaa
    $(suffix $(foo))

    output:.txt .c            #没有.后的拓展名的,则返回空

$(basename NAMES)
说明:获取扩展品之前的内容,包括目录
Example:
    foo = /home/admin/a.c aaa
    $(basename $(foo))
    output:/home/admin/a aaa

$(addsuffix SUFFIX,NAMES)
说明:给NAMES的添加后缀
Example:
    foo = aaa bbb
    $(addsuffix .c, $(foo))
    output:aaa.c bbb.c

$(addprefix PREFIX, NAMES)
说明:添加NAMES的前缀
Example:
    foo = aaa bbb
    $(addprefix -l, $(foo))
    output:-laaa -lbbb

$(join LIST1, LIST2)
说明:将LIST1中对应位置的和LIST2的对应的位置相链接
Example:
    foo = aaa bbb ccc
    bar = .c .s 
    $(join $(foo), $(bar))
    output:aaa.c bbb.s ccc

$(wildcard PATTERN)
说明:匹配满足的文件
Example:
    $(wildcard *.c)
    output:列出所有以.c结尾的文件

foreach函数:

$(foreach VAR, LIST, TEXT)
说明:一次遍历LIST的中以空格分开的成员,每个成员每次赋值为VAR,VAR相当于临时变量。
        TEXT引用每次产生的VAR的值,进行处理。
Example:
    foo = a b c
    bar := $(foreach dir, $(foo), $(wildcard $(dir)/*.c))
    output:获取目录a, b, c下的以.c结尾的文件

if函数:

$(if condition, then-part, else-part)
说明:如果condition成立则执行then-part,否则执行else-part
Example:
    aa = 100
    bar := $(if $(aa), exist, not exist)
    output:exist。判断aa是否定义,定义了则将exist赋值给bar,否则将not exist赋值给bar

call函数:

说明:调用自己定义的功能变量,变量中的的$(1)$(2)...对应call调用的参数。
Example:
    foo = $(2) $(1)
    $(call foo, a, b)
    output: b a

    pathsearch = $(firstword $(wildcard $(addsubfix /$(1), $(subst :, ,$(PATH)))))            #$(0) 值是pathsearch(函数名)
    LS := $(call pathsearch,ls)             #ls这个字符串和其前面的逗号不可有空格
    output:/bin/ls

value函数:

说明:value函数不会对参数的值进行展开。而是原封不动的替换。
Example:
    foo = $PATH
    all:
        echo $(foo)        #输出结果为ATH,因为$P为空
        echo $(value $(foo))    #其输出结果为PATH的值,环境变量。原封不动的将$PATH替换到当前位置,不对$P进行展开。

eval函数:

说明:eval构造一个可变的规则结构,将展开结果作为makefile的一部分。展开结果可以包含一个新的变量,目标,隐含规则或者明确规则。
Example:
PROGS := server client
define template
$(1):$$($(1)_OBJ) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef

$(foreach prog, $(PROGS), $(eval $(call template, $(prog))))   

origin函数

说明:origin确定一个变量的出处
Example:
a = 100
$(origin a)        #此时是获取a的出处,而不是引用a,所以不需要$(a)

变量类型:
undefined:变量未定义
file:在某个文件中被定义
default:CC MAKE这种默认的定义
environment:系统环境变量
environment override: make -e时定义的变量,替换了文件中的变量定义。
command line:通过make命令行定义的变量。make aa=100,makefile中:$(origin aa)输出为command line
override:文件中定义并使用了override指示声明
automatic:自动变量$@, $*等。

makefile中执行shell命令:

a.txt:
xxxxx
makefile:
$(warning $(shell cat a.txt))
Output: xxxxx

$(error TXT)

说明:给用户输出TXT信息,并退出make执行

$(error "File Is Not Existed.")

$(warning TXT)

说明:输出告警给用户,不退出make执行

$(warning "File Is Not Existed")
阅读(2334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~