實驗表示測試出來的結論,沒有代碼理論依據
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。 停止。