在 Makefile 中动态设置全局变量

Setup a global variable dynamically in a Makefile

我在 Makefile 中有以下代码,它根据环境变量执行一个或另一个命令序列。

generate :
            if test -z "$$VIRTUAL_ENV"; then \
                $(PYTHON) -m fades -V &>/dev/null || $(PYTHON) -m pip install --user fades; $(PYTHON) -m fades -r requirements.txt script.py;"; \
            else \
               python -m pip install -r requirements.txt && python script.py;  \
            fi

它按预期工作,但我想在多个目标上做同样的事情,以便在其他文件上使用它,而不必多次复制这段代码。

我的想法是动态设置一个变量(基于已评估的条件),包含一个或另一个命令,以便反复使用,如 alias in Bash.

这是个好主意吗?是否可以在 Makefile 中设置全局别名,以便它可以根据环境变量在两个 Python 解释器之间进行选择?

假设您使用的是 GNU make,您可以这样做:

ifdef VIRTUAL_ENV
  PYCMD = python -m pip install -r requirements.txt && python
else
  PYCMD = $(PYTHON) -m fades -V >/dev/null 2>&1 || $(PYTHON) -m pip install --user fades; $(PYTHON) -m fades -r requirements.txt
endif

generate:
        $(PYCMD) script.py

注意我将 &>/dev/null 更改为 >/dev/null 2>&1 因为前者是 bash-only 功能并且在 POSIX sh 和 make 中无效(默认情况下)总是运行 /bin/sh 这是(在许多系统上)一个 POSIX sh.

我不知道你为什么在一个部分使用 python 而在另一个部分使用 $(PYTHON);看起来你想在两者中使用相同的东西,但无论如何。