在Makefile中动态设置全局变量
我在Makefile中有以下代码,它根据环境变量执行一个或另一个命令序列在Makefile中动态设置全局变量,makefile,gnu-make,gnu,Makefile,Gnu Make,Gnu,我在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;"; \
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
它按预期工作,但我希望在多个目标上执行相同的操作,在其他文件上使用它,而不必多次复制此代码片段
我的想法是动态设置一个变量(基于已计算的条件),其中包含一个或另一个命令,以便反复使用,就像Bash中的alias
这是个好主意吗?是否可以在
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的功能,在POSIX sh中无效,并且make(默认情况下)始终运行/bin/sh
,这在许多系统上是POSIX sh
我不知道你为什么在一节中使用
python
,在另一节中使用$(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的功能,在POSIX sh中无效,并且make(默认情况下)始终运行/bin/sh
,这在许多系统上是POSIX sh
我不知道你为什么在一节中使用
python
,在另一节中使用$(python)
;您似乎想在这两个方面都使用相同的功能,但无论如何。谢谢。如果设置了VIRTUAL_ENV,我将使用python
,因为它使用virtualenv中定义的解释器<代码>$(PYTHON)可能是一条绝对路径,它会破坏它。谢谢。如果设置了VIRTUAL_ENV,我将使用python
,因为它使用virtualenv中定义的解释器<代码>$(PYTHON)可能是一条绝对路径,它会破坏它。