Makefile: либо-либо удовлетворяет предварительное условие - PullRequest
0 голосов
/ 18 февраля 2020

Вот соответствующие части Makefile для Python приложения. Цель состоит в том, чтобы создать правило, в котором наличие или $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, но если там ничего нет и py-deps-dev оценивается, затем выполняются обе цели pylib-editable, а затем pylib. Я предполагаю, что это потому, что $(or ...) вычисляется один раз во время анализа цели, а не после того, как pylib-editable был выполнен?

Если он построен из ничего:

  • через py-deps Я хочу, чтобы он вызывал $pylib
  • через py-deps-dev Я хочу вызвать $pylib-editable.

Есть ли чистый / элегантный способ решить это? Может быть, с помощью правил двойного двоеточия?

...