我在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
它可以按预期工作,但是我想在多个目标上执行相同的操作,以在其他文件上使用它,而不必多次复制此代码段。
我的想法是(根据已评估的条件)动态地设置一个变量,该变量包含一个或另一个命令,可以反复使用,例如Bash中的alias
。
这是个好主意吗?是否可以在Makefile
中设置全局别名,以便它可以根据环境变量在两个Python解释器之间进行选择?
答案 0 :(得分:3)
假设您正在使用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)
;似乎您想同时使用两者。