参考链接:
Makefile中foreach函数使用方法
Makefile中的$@, $^, $< , $?, $%, $+, $*
Makefile之patsubst

wildcard ,notdir ,patsubst ,obj=$(dir:%.c=%.o)

例子:
建立一个测试目录,在测试目录下建立一个名为sub的子目录

$ mkdir test
$ cd test
$ mkdir sub

在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件

建立一个简单的Makefile

src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )all:@echo $(src)@echo $(dir)@echo $(obj)@echo "end"

执行结果分析:

1、wildcard : 扩展通配符

src=$(wildcard *.c ./sub/*.c)
第一行输出:

a.c b.c ./sub/sa.c ./sub/sb.c

wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。

2、notdir : 去除路径

src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
第二行输出:

a.c b.c sa.c sb.c

notdir把展开的文件去除掉路径信息

3、patsubst :替换通配符

src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
第三行输出:

a.o b.o sa.o sb.o

$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
任何输出。或者可以使用obj=$(dir:%.c=%.o)效果也是一样的。

4、foreach 函数

foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:

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

这个函数的意思是,把参数中的单词逐一取出放到参数所指定的变量中,然后再执行 所包含的表达式。

每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

所以,<var>最好是一个变量名,<list>可以是一个表达式,而 中一般会使用 <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 自动化变量

自动化变量 描述
$@ 规则中的目标集合,在模式规则中,如果有多个目标的话,
“$@” 表示匹配模式中定义的目标集合。
$% 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。
$< 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么
“$<” 就是符合模式的一系列的文件集合。
$? 所有比目标新的依赖目标集合,以空格分开。
$^ 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,
“$^” 会去除重复的依赖文件,值保留一份。
$+ 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
$* 这个变量表示目标模式中"%"及其之前的部分,如果目标是式为a.%.c,那么“$*”就是test/a.test。

makefile中的foreach、patsubst等函数及自动化变量相关推荐

  1. Makefile中的wildcard patsubst

    在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数"wildcard",它的用法是:$(wildc ...

  2. makefile中wildcard notdir patsubst的简单介绍

    1.wildcard : 扩展通配符 2.notdir : 去除路径 3.patsubst :替换通配符 例子: 建立一个测试目录,在测试目录下建立一个名为sub的子目录 $ mkdir test $ ...

  3. Makefile中常用的函数

     常用函数调用 语法: $(<function> <arguments>)或 ${<function><arguments>} <functi ...

  4. Makefile中支持的函数大全

    From: http://blog.chinaunix.net/uid-25365622-id-3056374.html 一.描述 Makefile的函数调用,很像变量的使用,也是以"$&q ...

  5. makefile中常用函数

    Linux下编译c/c++源码需要编写makefile文件,文章参看 http://blog.sina.com.cn/s/blog_4c4d6e74010009jr.html 一函数的调用语法 二字符 ...

  6. Android Makefile中inherit-product函数简介,以及与include的区别

    在 Android Makefile 中时不时会看见 inherit-product 函数的使用,类似下方这样:         $(call  inherit-product,  vendor/do ...

  7. Makefile中的$$

    1 $$的用处 在uboot/kernel的顶层Makefile中我们可以看到,当执行make时同时传入多个目标是这样处理的: __build_one_by_one:$(Q)set -e; \for ...

  8. Makefile中的常用函数subst、foreach、wildcard、notdir、patsubst

    Makefile中函数参数间以逗号分隔,函数名和参数间以空格分隔,$ 是取值符号,$val相当于获取val变量的值. subst函数的调用语法 subst FROM, TO, TEXT 即将字符串TE ...

  9. Makefile中的常用函数——wildcard,patsubst,filter

    Makefile中的常用函数 wildcard 提取文件用 #拿到DIR指定目录的所有文件 SRC = $(wildcard $(DIR)) #拿到当前文件夹下的 *.cpp 文件 src=$(wil ...

最新文章

  1. java中保存图片到本地_java保存网络图片到本地
  2. 【UIKit】UILabel使用
  3. JavaScript面向对象的支持(7)
  4. 【CMD】管道符(|)
  5. Mysql(Mariadb)数据库主从复制
  6. 想问一下C++里queue要怎么遍历
  7. java jdbc rowset_JAVA基础知识之JDBC——RowSet
  8. 30款非常酷的创意名片设计欣赏
  9. 小米球ngrok内网穿透
  10. base64编码 springboot_解决idea中Springboot找不到BASE64Encoder或Decoder的jar包
  11. Unity3d之Http通讯GET方法和POST方法
  12. 为Vue2集成UIkit
  13. docker容器运行后退出,怎么才能一直运行?【转】
  14. P3935 Calculating
  15. Python 装饰器的八种写法
  16. 【优化算法】杂草优化算法(IWO)【含Matlab源码 1076期】
  17. 计算机硬盘大小一般都是整数,电脑硬盘如何精准整数分区
  18. 数据分析-划分客户等级
  19. 一文了解CSP、NOIP、NOI 三大信息学赛事
  20. SqlServer的填充因子

热门文章

  1. 烽火HG680KA-Hi3798MV300-当贝纯净桌面-卡刷固件包
  2. excel筛选时只有文本筛选,没有数字筛选
  3. PS证件照换背景颜色
  4. 软件工程概论学习进度表第一周
  5. 计操理论课10 -- openEuler实验第九章内核虚拟化
  6. 软件工程作业-方舟学习笔记07-方舟构建方法
  7. QT5的程序打包(将QT5的工程项目打包成一个exe程序)
  8. imx6q烧写程序的方法
  9. 进行网络防御的重要性_2019年最强大的10种网络安全软件工具
  10. 单片机多功能电子琴课设_单片机电子琴课程设计