在 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)
;看起来你想在两者中使用相同的东西,但无论如何。
我在 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)
;看起来你想在两者中使用相同的东西,但无论如何。