实验表示测试出来的结论,没有代码理论依据
Makefile中,目标对应的命令结束标记是什么呢?换句话说,Make中怎么判断目标的最后一条命令?
例如常见的目标编写如下:
test1:
echo "test1"
echo "test without empty line"
那如果目标下空一行呢?
test2:
echo "test2"
echo "test with emtpy line"
如果目标命令还掺杂了ifeq
,define
,ifndef
呢?
test3:
echo "test3"
echo "test with emtpy line"
ifneq (DEBUG, )
echo "test with ifneq"
endif
这可能是一个非常“幼稚”的问题,以至于找到的学习资料都没有描述,却着实让我迷惑了一段时间。
实验结论:
- 空行、ifeq、define、ifndef等并不作为命令集的结束
- 新的目标或者定义变量会识别为命令集的结束
换句话说:
一条目标的命令集会一直往下检索,直到遇到非命令相关的部分(例如其他目标,变量定义等)
测试1:
var=val
cmd6="cmd 6"
test1:
@echo "-- target 1 --"
@echo cmd 1
@echo cmd 2
ifdef var
@echo cmd 3
endif
define common
@echo cmd 4
endef
$(call common)
@echo cmd 5
@echo ${cmd6}
test2:
@echo "-- target 2 --"
执行结果:
[GMPY@09:14 tmp]$make test1
-- target 1 --
cmd 1
cmd 2
cmd 3
cmd 4
cmd 5
cmd 6
不管目标下是否有空行、ifdef等,依然是归属为同一个目标的命令
测试2:
var=val
cmd6="cmd 6"
test1:
@echo "-- target 1 --"
TEST=TEST
@echo cmd 1
test2:
@echo "-- target 2 --"
执行结果:
[GMPY@09:19 tmp]$make test1
Makefile:7: *** commands commence before first target。 停止。