【Makefile】学习if wildcard foreach
来源:互联网 发布:strpos php 编辑:程序博客网 时间:2024/06/13 01:04
FFMPEGPARTS_ALL = libavfilter libavformat libavcodec libswscale libswresample libavutil
###变量part 列表FFMPEGPARTS_ALL ,最后执行$(if $(wildcard $(DT_FFMPEG_ANDROID_DIR)/lib), $(part))
###$(if $(wildcard $(DT_FFMPEG_ANDROID_DIR)/lib), $(part)) 对于$(DT_FFMPEG_ANDROID_DIR)/lib路径下的所有文件(夹)存在,就返回$(part),因此这里是返回子目录
FFMPEGPARTS = $(foreach part, $(FFMPEGPARTS_ALL), $(if $(wildcard $(DT_FFMPEG_ANDROID_DIR)/lib), $(part)))
####返回每个子目录下的对应目录名.a的文件
FFMPEGLIBS = $(foreach part, $(FFMPEGPARTS), $(DT_FFMPEG_ANDROID_DIR)/lib/$(part).a)
=================================
http://www.cppblog.com/ivenher/articles/22107.html
四、foreach 函数
foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:
$(foreach <var>;,<list>;,<text>;)
这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行<text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
所以,<var>;最好是一个变量名,<list>;可以是一个表达式,而<text>;中一般会使用<var>;这个参数来依次枚举<list>;中的单词。举个例子:
names := a b c d
files := $(foreach n,$(names),$(n).o)
上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是“a.o b.o c.o d.o”。
注意,foreach中的<var>;参数是一个临时的局部变量,foreach函数执行完后,参数<var>;的变量将不在作用,其作用域只在foreach函数当中。
============
Makefile中使用foreach生成一类规则
CSDN上,有朋友发帖问了这样一个问题(我按自己的理解翻译一下):
当前目录下有四个静态库文件: liba.a libb.a libc.a libd.a。现在想将它们做成一个动态库libp.so。
怎样实现一个方法,在Makefile 能将列表里的.a文件逐个取出来, 分别执行$(AR) -x。
我的做法是:
在实际使用中,如果静态库与动态库是在同一个makefile(或者说同一个工程)中的,不太可能使用这种
解包静态库之后再打包成动态库的用法。而是直接使用相关的.o文件生成动态库。
=============================http://blog.sina.com.cn/s/blog_78d30f6b01016j3i.html
Makefile中函数使用小技巧
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
例子:
建立一个测试目录,在测试目录下建立一个名为sub的子目录
$ mkdir test
$ cd test
$ mkdir sub
在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件
建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c) 指定目录下所有的.c都输出
dir=$(notdir $(src)) 指定文件都去除路径信息
obj=$(patsubst %.c,%.o,$(dir) ) 指定文件按照某模式进行替换
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo “end”
执行结果分析:
第一行输出:
a.c b.c ./sub/sa.c ./sub/sb.c
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
第二行输出:
a.c b.c sa.c sb.c
notdir把展开的文件去除掉路径信息
第三行输出:
a.o b.o sa.o sb.o
在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
任何输出。
或者可以使用
obj=$(dir:%.c=%.o)
效果也是一样的。
这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。
它的标准格式是
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a
今天在研究makefile时在网上看到一篇文章,介绍了使用函数wildcard得到指定目录下所有的C语言源程序文件名的方法,这下好了,不用手工一个一个指定需要编译的.c文件了,方法如下:
SRC = $(wildcard *.c)
等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:
SRC = $(wildcard *.c) $(wildcard inc/*.c)
也可以指定汇编源程序:
ASRC = $(wildcard *.S)
root@Ubuntu32:/home/zhangbin/zbhome/dttv201409/learnMakefile/test# makea.c b.c ./sub/sa.c ./sub/sb.ca.c b.c sa.c sb.ca.o b.o sa.o sb.oendroot@Ubuntu32:/home/zhangbin/zbhome/dttv201409/learnMakefile/test# lsa.c b.c Makefile Makefile~ subroot@Ubuntu32:/home/zhangbin/zbhome/dttv201409/learnMakefile/test# ls subsa.c sb.croot@Ubuntu32:/home/zhangbin/zbhome/dttv201409/learnMakefile/test#
makefile 中的 wildcard 与 patsubst 函数
makefile 里的函数跟它的变量很相似——使用的时候,你用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后用关括号结束。例如,在 GNU Make 里有一个叫 'wildcard' 的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:
五、if 函数
if函数很像GNU的make所支持的条件语句——ifeq(参见前面所述的章节),if函数的语法是:
$(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>;只会有一个被计算。
- 【Makefile】学习if wildcard foreach
- makefile常用函数学习(wildcard foreach filter word if ) PRODUCT_COPY_FILES
- makefile 中的 wildcard,foreach 与 patsubst 函数
- GNU Makefile 笔记 foreach wildcard patsubst
- makefile 中的 wildcard,foreach 与 patsubst 函数 .
- Makefile 中subst、foreach、wildcard、notdir函数
- Makefile学习之wildcard
- Android学习 - Makefile之wildcard
- Makefile九之foreach,if,call函数
- Makefile – Check if a file exists using wildcard function
- Makefile学习笔记-wildcard notdir patsubst用法
- makefile学习3-wildcard和patsubst
- makefile详解 函数 foreach if call origin shell
- Makefile foreach
- Makefile之wildcard
- Makefile中的wildcard用法
- Makefile中函数wildcard
- Makefile之wildcard
- android hardware解析
- I2C slave address
- 穷养儿富养女 很多人都不知道这句话的真正含义
- 服务器推送技术
- java 报数游戏:有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,报到m的人出列
- 【Makefile】学习if wildcard foreach
- 博客已经转移到Github Pages
- All work and no play makes jack a dull boy 中谓语为什么用makes
- 注册表 读写练习
- Sum Root to Leaf Numbers
- Android中 View not attached to window manager错误的解决办法
- (转) firstResult/maxResults specified with collection fetch; applying in memory
- UITableView 一直显示滚动条(ScrollBar Indicators)、滚动条Width(宽度)、滚动条Color(颜色)
- 【工作经验】程序员什么时候该考虑辞职