Вот соответствующие части 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
.
Есть ли чистый / элегантный способ решить это? Может быть, с помощью правил двойного двоеточия?