簡體   English   中英

Makefile % match-anything 規則選擇“Makefile”目標

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM