首页 > 解决方案 > Makefile:要么满足先决条件

问题描述

这是基于 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-editablemakepy-deps-devpylib-editablepylib$(or ...)pylib-editable

如果它是白手起家:

有没有一种干净/优雅的方法来解决它?也许通过双冒号规则?

标签: makefilegnu-make

解决方案


推荐阅读