Makefile 如何使GNU仅在前提条件改变时重建虚假目标?

Makefile 如何使GNU仅在前提条件改变时重建虚假目标?,makefile,gnu-make,Makefile,Gnu Make,在我的例子中,我有requirementstarget,它安装所需的Python包和test,它运行测试并依赖于前面的测试 安装依赖项是一项很长的操作,我希望它只在requirements.txt更改时执行。我怎样才能做到这一点 下面是一个简化的Makefile示例,我现在有: .PHONY: test requirements requirements: requirements.txt pip install -r $< test: tests/ | requirement

在我的例子中,我有
requirements
target,它安装所需的Python包和
test
,它运行测试并依赖于前面的测试

安装依赖项是一项很长的操作,我希望它只在
requirements.txt
更改时执行。我怎样才能做到这一点

下面是一个简化的Makefile示例,我现在有:

.PHONY: test requirements

requirements: requirements.txt
    pip install -r $<

test: tests/ | requirements
    py.test $^
.PHONY:测试要求
要求:requirements.txt
pip安装-r$<
测试:测试/要求
py试验$^

正如@user1034749所指出的,Make比较了文件的修改时间。如果您想让它知道自上次安装以来何时修改了
requirements.txt
,则必须给它一个文件,该文件的修改时间与上次安装的时间相同,以便它可以比较两者。换句话说,您必须拥有一个虚拟文件,并在执行安装时对其进行修改。您可以随意称呼它,但我将称之为“安装”:

.PHONY:测试
安装:requirements.txt
pip安装-r$<
触碰$@
测试:测试/安装
py试验$^

那你为什么要声明需求是假的呢?
make
只是比较修改时间,所以你需要一些文件,可以比较它(文件)和
requirements.txt
@Jens之间的时间,因为
需求
目标不生成任何文件,所以它是“假的”。但是我不是GNU make的专家,所以我不确定这个逻辑是否有效。
.PHONY: test

installation: requirements.txt
    pip install -r $<
    touch $@

test: tests/ | installation
    py.test $^