尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【2017-08-14】Makefile的二次解析简单笔记

【2017-08-14】Makefile的二次解析简单笔记 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2017-08-14 标题Makefile的二次解析简单笔记分类操作系统 / linux 标签makefileMakefile的二次解析简单笔记makefile中的“立即展开”与“延后展开”今天在搞Makefile的时候掉进了一个大坑里爬了好久。这里简单的笔记下Makefile的一些概念:makefile中的“立即展开”与“延后展开”本文参考【 http://blog.csdn.net/shyanyang/article/details/7529795 】GUN make的执行过程分为两个阶段。第一阶段读取所有的makefile文件包括“MAKEFILES”变量指定的、指示符“include“指定的、以及命令行选项“-f–file“指定的makefile文件内建所有的变量、明确规则和隐含规则并建立所有目标和依赖之间关系结构链表。第二阶段根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新并使用对应的规则來重建这些目标。1.在make执行的第一阶段如果变量和函数被展开那么称此展开是“立即“的其他的展开称之为“延后“的。2.变量定义解析规则如下IMMEDIATE DEFERRED IMMEDIATE ? DEFERRED IMMEDIATE : IMMEDIATE IMMEDIATE DEFERRED or IMMEDIATE define IMMEDIATE DEFERRED Endef当变量使用追加符 时如果此前这个变量是一个简单变量使用:定义的则认为它是立即展开的其他情况时都被认为是“延后“展开的变量。3.所有使用到条件语句在产生分支的地方make程序会根据预设条件将正确的分支展开。即条件分支的展开是“立即“的。其中包括“ifdef”、“ifeq“、”ifndef“和“ifneq“所确定的所有分支命令4.所有的规则在make执行时都按照如下的模式展开IMMEDIATE:IMMEDIATE;DEFERRED DEFERRED注上面的IMMEDIATE表示立即展开DEFERRED表示延后展开这里立即和延后的示例如下VAL1 1 VAL2 : 2 VAL3 $(abspath .) VAL4 : $(abspath .) VAL5 $(VAL3) VAL6 : $(VAL3) VAL3 3 SHOWARGS: echo VAL1: $(VAL1) echo VAL2: $(VAL2) echo VAL3: $(VAL3) echo VAL4: $(VAL4) echo VAL5: $(VAL5) echo VAL6: $(VAL6)执行结果如下cstriker1407-T450-ubuntu:~/MakefileTest$makeVAL1:1#延后展开但由于是简单变量因此无所谓VAL2:2#立刻展开但由于是简单变量因此无所谓VAL3:3#延后展开而且被改了值VAL4: /home/cstriker1407/MakefileTest#立刻展开VAL5:3#延后展开VAL3的值改变会更新即第一次展开为VAL5$(VAL3), 第二次展开为VAL53VAL6: /home/cstriker1407/MakefileTest#立刻展开第一次展开为VAL6/home/cstriker1407/MakefileTest虽然后面VAL3被修改了但是VAL6已经展开了不会在变动
返回列表