Makefile:要么满足要么满足先决条件

时间:2020-02-17 23:26:58

标签: makefile gnu-make

以下是基于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-devpylib-editable目标。我认为这是因为pylib在目标解析期间被评估一次,而不是在执行$(or ...)之后被评估一次?

如果它不是一无是处的:

  • 通过pylib-editable,我希望它调用py-deps
  • 通过$pylib我要调用py-deps-dev

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

0 个答案:

没有答案