使依赖规则不执行

Make dependency rule does not execute

我想要实现的目标:一个为脚本创建虚拟环境、激活它并安装包依赖项的 make 规则。 (为方便起见,我创建了一个包含需要重新创建的文件的存储库)。

这是我的 Makefile:

venv:
    @echo VENV
    virtualenv $@ -p python2

foo_requirements: requirements.txt venv .FORCE
    @echo PIP
    ( . venv/bin/activate && pip install -r $< )

.PHONY: foo_requirements

FOO_CMD_SCRIPT = foo.py

FOO_CMD = . venv/bin/activate && python2 $(FOO_CMD_SCRIPT)

$(FOO_CMD_SCRIPT): foo_requirements

#--- Usage ---
all: $(FOO_CMD_SCRIPT)
    $(FOO_CMD)

.FORCE:

目标 all 仅用于测试,在现实生活中我会将内容放在 foo.mk 文件中,并从另一个 makefile 中包含它。

我的期望:

实际发生了什么:

为什么规则的内容foo_requirements 运行?

同样,all 规则内容从不 运行s。

结果:

$ make
VENV
virtualenv venv -p python2
created virtual environment CPython2.7.18.final.0-64 in 46ms
  creator CPython2Posix(dest=/home/gauthier/tmp/test_mk/venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/gauthier/.local/share/virtualenv)
    added seed packages: pip==20.3.4, pkg_resources==0.0.0, setuptools==44.1.1, wheel==0.34.2
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator

如果您不另行说明,make 将始终构建 makefile 中的第一个目标(连同其任何先决条件),然后停止。

您的 makefile 中的第一个目标是 venv 并且它没有先决条件,因此构建该目标然后 make 停止。

您可以运行make <target>到运行一个特定的目标,例如make all

或者您可以将 all 目标作为 makefile 中的第一个目标。

或者您可以在 makefile 中添加 .DEFAULT_GOAL: all

How make Processes a Makefile