在Makefile

时间:2018-10-10 15:18:07

标签: 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;"; \
            else \
               python -m pip install -r requirements.txt && python script.py;  \
            fi

它可以按预期工作,但是我想在多个目标上执行相同的操作,以在其他文件上使用它,而不必多次复制此代码段。

我的想法是(根据已评估的条件)动态地设置一个变量,该变量包含一个或另一个命令,可以反复使用,例如Bash中的alias

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

1 个答案:

答案 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);似乎您想同时使用两者。