跟我学Makefile(五)
文件名操作函数
每个函数的参数字符串都会被当做一个或是一系列的文件名来对待。
$(dir <names...>)
名称:取目录函数——dir。
功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。
返回:返回文件名序列<names>的目录部分。
示例: $(dir src/foo.c hacks)返回值是“src/ ./”。
$(notdir <names...>)
名称:取文件函数——notdir。
功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。
返回:返回文件名序列<names>的非目录部分。
示例: $(notdir src/foo.c hacks)返回值是“foo.c hacks”。
$(suffix <names...>)
名称:取后缀函数——suffix。
功能:从文件名序列<names>中取出各个文件名的后缀。
返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字串。
示例: $(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。
$(basename <names...>)
名称:取前缀函数——basename。
功能:从文件名序列<names>中取出各个文件名的前缀部分。
返回:返回文件名序列<names>的前缀序列,如果文件没有前缀,则返回空字串。
示例: $(basename src/foo.c src-1.0/bar.c hacks)返回值是“src/foo src-1.0/bar hacks”。
$(addsuffix <suffix>,<names...>)
名称:加后缀函数——addsuffix。
功能:把后缀<suffix>加到<names>中的每个单词后面。
返回:返回加过后缀的文件名序列。
示例: $(addsuffix .c,foo bar)返回值是“foo.c bar.c”。
$(addprefix <prefix>,<names...>)
名称:加前缀函数——addprefix。
功能:把前缀<prefix>加到<names>中的每个单词后面。
返回:返回加过前缀的文件名序列。
示例: $(addprefix src/,foo bar)返回值是“src/foo src/bar”。
$(join <list1>,<list2>)
名称:连接函数——join。
功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么, <list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,
<list2>多出来的单词将被复制到<list2>中。
返回:返回连接过后的字符串。
示例: $(join aaa bbb , )返回值是“aaa111 bbb222 ”。
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) //$(files)的值是“a.o b.o c.o d.o
注意, foreach 中的<var>参数是一个临时的局部变量, foreach 函数执行完后,参数<var>的变量将不在作用,其作用域只在 foreach 函数当中
if 函数 :跟ifeq很像
$(if <condition>,<then-part>) //<condition>参数是 if 的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是, <then-part>会被计算,否则<else-part>会被计算
或是
$(if <condition>,<then-part>,<else-part>)
call 函数 :唯一一个可以用来创建新的参数化的函数
$(call <expression>,<parm1>,<parm2>,<parm3>...)
当 make 执行这个函数时, <expression>参数中的变量,如$(1), $(2), $(3)等,会被参数<parm1>, <parm2>, <parm3>依次取代。而<expression>的返回值就是 call 函数的返回值。
eg:
reverse = $() $()
foo = $(call reverse,a,b)
那么, foo 的值就是“a b”。当然,参数的次序是可以自定义的,不一定是顺序的,如:
reverse = $() $()
foo = $(call reverse,a,b)
此时的 foo 的值就是“b a”
origin 函数 :不操作变量的值,他只是告诉你你的这个变量是哪里来的 。
$(origin <variable>)
注意:<variable>是变量的名字,不应该是引用。所以你最好不要在<variable>中使用“$”字符。 Origin函数会以其返回值来告诉你这个变量的“出生情况”,origin函数的返回值:
“undefined” :如果<variable>从来没有定义过, origin 函数返回这个值“undefined”。
“default” :如果<variable>是一个默认的定义,比如“CC”这个变量
“environment” :如果<variable>是一个环境变量,并且当 Makefile 被执行时,“-e”参数没有被打开。
“file” :如果<variable>这个变量被定义在 Makefile 中。
“command line” :如果<variable>这个变量是被命令行定义的。
“override” :如果<variable>是被 override 指示符重新定义的。
“automatic” :如果<variable>是一个命令运行中的自动化变量。
跟我学Makefile(五)的更多相关文章
- Mina、Netty、Twisted一起学(五):整合protobuf
protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化.反序列化),一般应用于网络传输,可支持多种编程语言. protobuf如何使用这里不再介绍, ...
- 从头开始学JavaScript (五)——操作符(二)
原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:* 乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...
- 跟我学Makefile(三)
紧接着跟我学Makefile(二)继续学习:变量高级用法 (1)变量值的替换 :替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,把变量“var”中所有以“a”字串 ...
- 一起学Makefile(五)
多目标规则 多目标规则,可以简单的理解为是一种将多条具有1)相同依赖和2)相同生成命令的规则,合并成一条规则的语法,其基本格式为: targets...: prerequisites... comma ...
- 一起学makefile
Unix.Linux必学知识哈哈,网上看到一哥们写得挺好挺详细的,直接复制地址就分享哈哈哈. 跟我一起写 Makefile(一) 概述 跟我一起写 Makefile(二) make是如何工作的 跟我一 ...
- Linux就该这么学--第五期 学习笔记
第一节:基础 <Linux就该这么学>第二期视频 Linux就该这么学第5期第二节: ------------你的价值:你对公司做出的共享和你的不可替代性------------瑞尔系统R ...
- 跟我一起学Makefile
概述 什么是makefile?或许很多Winodws程序员都不知道这个东西,因为那些Windows IDE都为你做了这个工作,但我觉得要做一个好的和professional的程序员,makefile还 ...
- 跟我一起写Makefile(五)
使用变量———— 在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方.其与C/C++所不同的是, ...
- 跟我学Makefile(七)
定义模式规则 使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符.“%”的意思是表示一个或多个任意字符.在依赖目标中同样可以使用“%”,只是依赖 ...
随机推荐
- linux下 redis 启动
启动文件 startredis.sh : nohup /data/redis/bin/redis-server /data/redis/etc/redis.conf & 关闭文件 stopr ...
- NHibernate初学三之条件查询(Criteria Queries)与AspNetPager分页实例
NHibernate除了SQL与HQL两种查询操作外,还有一种就是条件查询Criteria,本文将从网上整理一些Criteria的理论及小实例,最后通过一个结合AspNetPager分页来加深理解,必 ...
- 记XX2013届优秀毕业生评选(请重视在公司展现自己,重视业绩參评过程,非技术贴)
本文不是什么技术贴.仅仅是作为一名码农,在公司发展中遇到"參评"中的一个分享,希望对大家有帮助.毕竟,升职加薪这样的事情,你须要自己去争取,须要获得领导和同事的认可.. . .考虑 ...
- 九度 1547 出入栈(递推DP)
题目描述: 给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈.要求在操作序列的执行过程中不会出现非法的操作,即不会在空栈时执行出栈操作,同时保证当操作序列完成后,栈恰好为一 ...
- Effective C++ Item 13 Use object to manage resources
1. Always use object to manage resource! If you delete a pointer or release a handler manually by yo ...
- Discuz 升级X3问题汇总整理
最近一段时间公司的社区垃圾帖数量陡然上涨,以至于社区首页的推荐版块满满都是垃圾帖的身影,为了进一步解决垃圾帖问题我们整整花了1天时间删垃圾贴,清除不良用户,删的手都酸了,可见垃圾帖的数量之多!可耻的刷 ...
- iOS事件拦截(实现触摸任意位置隐藏指定view)
项目里有一个需求,类似新浪或者腾讯微博的顶部title栏的类别选择器的消失(在选择器展开的时候,触摸屏幕任何地方使其消失). 最开始的想法是当这个选择器(selectorView)展开的时候,在当前屏 ...
- springjdbc的批量操作
这里主要是看的官方文档,如何翻译: NamedParameterJdbcTemplate The NamedParameterJdbcTemplate class adds support for p ...
- Android 简单案例:继承BaseAdapter实现Adapter
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import ...
- vux组件绑定事件
我一开始是这样绑定事件的,但是没有效果: <box gap="15px 45px"> <x-button plain type="primary&quo ...