使依赖规则不执行
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 中包含它。
我的期望:
make all
查看 FOO_CMD_SCRIPT
的依赖项(实际上是磁盘上文件的文件名)。依赖是 foo_requirements
规则 (PHONY
)
- 规则
foo_requirements
具有文件依赖性 requirements.txt
和 venv
。这里也有 .FORCE
,因为我不知道如何检查包安装是否已经完成。所以我认为应该发生的是: 1. 没有依赖项 requirements.txt
(文件存在,没有规则) 2. 运行 venv
的规则如果不存在。
- 当
venv
规则有运行并创建目录时,运行规则的实际内容:pip install
.
- 在那之后,
all
的依赖项应该完成,实际命令应该 运行。
实际发生了什么:
venv
创建成功
pip
从不 运行s
- 实际命令从不 运行s
为什么规则的内容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
。
我想要实现的目标:一个为脚本创建虚拟环境、激活它并安装包依赖项的 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 中包含它。
我的期望:
make all
查看FOO_CMD_SCRIPT
的依赖项(实际上是磁盘上文件的文件名)。依赖是foo_requirements
规则 (PHONY
)- 规则
foo_requirements
具有文件依赖性requirements.txt
和venv
。这里也有.FORCE
,因为我不知道如何检查包安装是否已经完成。所以我认为应该发生的是: 1. 没有依赖项requirements.txt
(文件存在,没有规则) 2. 运行venv
的规则如果不存在。 - 当
venv
规则有运行并创建目录时,运行规则的实际内容:pip install
. - 在那之后,
all
的依赖项应该完成,实际命令应该 运行。
实际发生了什么:
venv
创建成功pip
从不 运行s- 实际命令从不 运行s
为什么规则的内容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
。