makefile
来源:互联网 发布:sum服务器监控软件 编辑:程序博客网 时间:2024/06/03 20:06
make一些默认规则:
转载文章http://blog.csdn.net/xkq_lyx/article/details/17800791
一、两个阶段:
1.读取所有的makfile文件,(包括include字段),内建所有的变量和他们的值,隐式和显示规则,构建target和prerequisites的依赖关系
2.根据第1步中构造的依赖关系,来决定是否一些target是否需要进行重建工作。
二、变量赋值,按照官网的介绍,赋值有立即展开和延迟展开.
立即展开:意味着在第一阶段的时候,文件顺序被读取的时候,凡在该立即展开位置的变量都会被马上展开,而不会等待第二阶段,由全文来最终决定该变量的值
延迟展开:在第二阶段,由该变量在文件中的最后一个赋值关系进行最终展开。
如赋值:
immediate = deferredimmediate ?= deferredimmediate := immediateimmediate ::= immediateimmediate += deferred or immediateimmediate != immediatedefine immediate deferredendefdefine immediate = deferredendefdefine immediate ?= deferredendefdefine immediate := immediateendefdefine immediate ::= immediateendefdefine immediate += deferred or immediateendefdefine immediate != immediateendef
例子:
a=1test=xb$(test)=$(a)test=ya=3all: @echo $(bx) @echo $(by) @echo $(test)a=4
输出结果:
4
y
这里表示bx=4,by未定义空字符
首先根据b$(test)=$(a),其规则为immediate = deferred,
所以左边的b$(test)立即展开,而由于顺序读取文件时,其之前的test只能设值为x
因此立即展开为bx
而后面的deferred为延迟展开,所以b$(test)=$(a)的表达式等价为bx=$(a)
而@echo $(bx)也为延迟展开,在第二阶段的时候,先展开$(bx)即a,再展开$(a),而a在文件中最终赋值为4,因此为4
而@echo $(by)因为by实际并没有被定义,因此$(by)实际是空字符
而@echo $(test)因为test在中文件中最终赋值为y,则打印为y
提示:其实可以通过查看make -f Makefile -p 来查看该Makefile在第一阶段的解析是怎样,如下片段
# makefile (从'Makefile_8',行 3)
bx = $(a)
三、为了避免混淆(自己有点混淆),故可按照下面的方式进行解读:
1.先查看需要定位的语句,在该语句的位置判断其立即展开和延迟展开的部分
2.对于其立即展开的部分,根据其位置以上的均为到达该位置时已设置且可用的变量,并以此为基础,进行立即展开,而无视其位置后面的变量定义
3.对于延迟展开的部分,将延迟展开的表达式保留下来,等待文件完整读取完后,考虑该变量最终被设置成什么变量关系,并最终推导该变量的值
4.以此最终确定该表达式
四、.PHONY
一个作用是使目标名不认为是文件
如
.PHONY clean
clean:
rm -rf ./
这样即使当前路径下存在clean文件,也会忽略,而继续执行rm -rf ./指令
相关文章:https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html
五、自动变量
%@,target名字
%<第一依赖
六、搜索路径VPATH
vpath %.cpp ../src ../include
七、makefile的搜索路径与编译具体代码的搜索路径是两回事
如:
target ... : prerequisites ... command ...target...:prerequisties是makefile的搜索的路径,可通过vpath设置
而command则是你具体代码的搜索路径了,不会收到vpath的影响,同时其设置的搜索路径也不会影响target...:prerequisties
八、函数
$(fun_name argument,,)
文本处理函数
$(substFROM,TO,TEXT)
$(patsubstPATTERN,REPLACEMENT,TEXT)
$(stripSTRINT)
$(findstringFIND,IN)
$(filterPATTERN…,TEXT)
$(filter-outPATTERN...,TEXT)
$(sortLIST)
$(wordN,TEXT)
$(wordlistS,E,TEXT)
$(wordsTEXT)
$(firstwordNAMES…)
文件名处理函数
$(dirNAMES…)
$(notdirNAMES…)
$(suffixNAMES…)
$(basenameNAMES…)
$(addsuffixSUFFIX,NAMES…)
$(addprefixPREFIX,NAMES…)
$(joinLIST1,LIST2)
$(wildcardPATTERN)
$(foreachVAR,LIST,TEXT)
if 函数
$(ifCONDITION,THEN-PART[,ELSE-PART])
call函数
$(callVARIABLE,PARAM,PARAM,...)
value函数
$(valueVARIABLE)
eval函数
$(evalPARAM,...)
origin函数
$(originVARIABLE)
shell函数
$(shell catfoo)
make的控制函数
$(errorTEXT…)
$(warningTEXT…)
- Makefile
- Makefile
- makefile
- makefile
- makefile
- Makefile
- Makefile
- Makefile
- Makefile
- Makefile
- Makefile
- makefile
- Makefile
- makefile
- Makefile
- makefile
- makefile
- makefile
- HBase-1.2.1之查找Region位置的源码学习
- Android Https请求的简单使用(Volley Https请求的示例)
- Android中使用定时器的三种方法
- fetch()函数
- Linux内核之数据结构--队列
- makefile
- Maven项目打包不了的问题
- 图灵连发几十款机器人应用,开放战略将持续
- 1092. To Buy or Not to Buy (20)
- Kali Linux 秘籍 第二章 定制 Kali Linux
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处
- 相对路径与绝对路径
- 如何在Solr中更好的处理同义词
- 【leetcode】377. Combination Sum IV【M】