以下是基于Python的应用程序的Makefile的相关部分。目标是制定一条规则,使 $pylib
或$pylib-editable
的存在都满足目标依赖性。
pylib = $(VIRTUAL_ENV)/$(PY_SITEPACKAGES)/pylib/__init__.py
pylib-editable = $(VIRTUAL_ENV)/$(PY_SITEPACKAGES)/pylib.egg-link
pylib-any = $(or $(realpath $(pylib-editable)),$(pylib))
$(pylib-editable): requirements/.requirements.installed | $(VIRTUAL_ENV) vendor/pylib
# this creates pylib.egg-link
pip install --ignore-installed --no-deps -v -e vendor/pylib
.PHONY: pylib-editable
pylib-editable:
-$(RM) $(pylib-editable)
$(MAKE) $(pylib-editable)
.PHONY: pylib
pylib: $(pylib)
$(pylib): requirements/.main.installed vendor/pylib | $(VIRTUAL_ENV)
# this creates pylib/__init__.py
pip install --ignore-installed --no-deps -v vendor/pylib/
# Install Python (just release) dependencies
.PHONY: py-deps
py-deps: $(pylib-any) requirements/.main.installed | $(VIRTUAL_ENV)
# Install Python (development & release) py-deps
.PHONY: py-deps-dev
py-deps-dev: $(pylib-editable) py-deps requirements/.dev.installed
(其他规则取决于py-deps
/ py-deps-dev
)
如果运行pylib-any
时找到了$pylib
/ $pylib-editable
个文件之一,但上面make
的先决条件似乎起作用,但是如果没有{{1 }}被评估,然后同时执行py-deps-dev
和pylib-editable
目标。我认为这是因为pylib
在目标解析期间被评估一次,而不是在执行$(or ...)
之后被评估一次?
如果它不是一无是处的:
pylib-editable
,我希望它调用py-deps
$pylib
我要调用py-deps-dev
。是否有一种干净/优雅的方法来解决它?也许通过双冒号规则?