繁体   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