[英]Makefile % match-anything rule picks up "Makefile" target
我正在嘗試編寫一個通用 Makefile 以將源樹與某個遠程主機 ssh 同步到其中並在那里執行 make,轉發任何目標或變量覆蓋
到目前為止,我想出了這個:
HOST ?= host
DIR ?= ~/dev
SRC = src
all:
.PHONY: sync
sync:
rsync -azP --exclude ".*/" --exclude ".*" $(SRC)/ $(HOST):$(DIR)
%: sync
ssh $(HOST) 'cd $(DIR) && make $@ MAKEFLAGS=$(MAKEFLAGS)'
只要我在%
target 的依賴項列表中省略sync
,它就可以很好地工作。 一旦我重新添加它, Makefile
目標由於某種原因被拾取,導致它 ssh 進入遠程機器並運行make Makefile
,這不是一個有效的目標或預期的行為
澄清一下,我自己並沒有將Makefile
指定為目標。 我願意
make
make clean
所有這些都會導致Makefile
目標運行,無論
GNU make
在構建指定目標或默認目標之前自動嘗試重新構建 makefile 。 其他make
實現不一定這樣做。 GNU make
手冊包含有關您的特定問題的建議:
如果您知道您的一個或多個 makefile 無法重新制作,並且您想阻止 make 對它們執行隱式規則搜索,也許出於效率原因,您可以使用任何防止隱式規則查找的常規方法來執行此操作。 例如,您可以使用 makefile 作為目標編寫一個顯式規則,以及一個空配方 [...]
空配方方法是添加如下規則:
Makefile: ;
在您的 makefile 中存在該文件(並且文件名為Makefile
),當make
查找用於重建Makefile
的規則時,它將選擇明確的通配符規則,空的規則。 但是,這樣寫會更健壯一些:
$(MAKEFILE_LIST): ;
MAKEFILE_LIST
變量包含所有make
讀取的 makefile 的名稱,因此即使您將include
指令添加到 makefile 或者如果您從不同的目錄或使用-f
命令通過不同的名稱訪問它,它也會覆蓋您 -線選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.