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