【问题标题】:Setup a global variable dynamically in a Makefile在 Makefile 中动态设置全局变量
【发布时间】:2018-10-10 15:18:07
【问题描述】:

我在 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

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

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

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

【问题讨论】:

    标签: makefile gnu-make gnu


    【解决方案1】:

    假设您使用的是 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嘘。

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

    【讨论】:

    • 谢谢。如果设置了 VIRTUAL_ENV,我使用python,因为它使用 virtualenv 中定义的解释器; $(PYTHON) 可能是绝对路径,它会破坏它。
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2016-10-16
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多