标题可能无法表达出我的疑惑。在我们写makefile的时候,每一个规则都有对应的命令,那么,make怎么知道规则的最后一条命令是什么呢?一条规则的命令到哪里结束?如果不搞清楚,可能就会对阅读甚至编写make产生误解。
例如正常的规则编写应该是这样的:
如果目标下空了一行,如下图:
按我之前的理解,此时的echo命令并不归属于test规则【这是错误的理解!】,然而在我看大神的makefile的时候,却惊讶地发现是允许在目标与命令之间空行的。这是非常简单的情况,如果之间再掺杂了if\ifndef\define等等又会怎么样呢?就简单来说,make如何解析一个规则的命令的结束?
由于在网上找不到资料,而我学习的文档《跟我一起学makefile-陈皓》里又没讲清楚,因此以下仅仅是我的测试结果。由于精力与见识有限,不可能测试完整,或完全测试正确,若有错误地地方,或者你们能找到解答我疑惑的文章,务必告诉我,让我们一起进步。
======================================================================================
测试结论:
1、空行、ifeq、define、ifndef等并不识别为命令集的结束
2、新的目标或者变量定义会识别为命令集的结束
简言之:
一条规则的命令会一直向下搜索,直到遇到非命令相关的部分(例如目标,变量定义等)【命令相关的部分包括条件判断,命令包】
=======================================================================================
测试1:
结论1:命令会一直向下执行,而ifdef\ifeq是对命令是否执行的选择,define是对命令的封装,均属于命令类,因此会一直执行到TEST:=string_again
测试2:
结论2:由于第一个目标的命令遇到TEST变量的定义而结束了,因此24行的命令为非法命令,导致make无法执行
此博客为本人学习makefile中的部分学习思考,由于还在学习积累中,难免会有些幼稚与错误,希望指正