【发布时间】:2021-04-25 09:45:19
【问题描述】:
我正在尝试编写一个通用的 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)'
只要我在% 目标的依赖列表中省略sync,它就可以很好地工作。一旦我重新添加它,Makefile 目标由于某种原因被拾取,导致它通过 ssh 进入远程机器并运行make Makefile,这不是一个有效的目标或预期的行为
为了澄清,我自己并没有将Makefile 指定为目标。我愿意
make
make clean
所有这些都会导致 Makefile 目标运行,而不管
【问题讨论】:
-
也许将
Makefile添加为显式目标,配方为空且无依赖关系? -
Make 通常会尝试将 Makefile 构建为目标,以及包含在 makefile 中的任何文件。这可用于在源更改时更新 Makefile,例如保持自动依赖正确。它通常什么都不做,就像它在远程运行 make 命令时会做的那样。
-
没有
sync假依赖,make 会看到Makefile存在并且没有依赖,因此不需要重新制作,因此它不会运行配方。但是一旦它有一个虚假的依赖,它似乎总是需要重新制作,因为它的依赖 (sync) 总是重新制作,并且运行配方。您可以像@HolyBlackCat 所说的那样避免这种情况,因为这样可以防止使用模式规则。