如何使用.ONESHELL为Makefile规则中的简单变量赋值?

问题描述 投票:0回答:1

我有以下食谱:

.ONESHELL:
misc:
  $(eval venvPath := $(shell xdg-user-dir ENVIRONMENTS)/nav)
ifeq ($(wildcard ${venvPath}),)
  python -m venv ${venvPath} \
    && source ${venvPath}/bin/activate \
    && pip install -U pip wheel
  source ${venvPath}/bin/activate \
    && pip install powerline-status
endif
.PHONY: misc

我想使用简单变量 venvPath 的值。但是,在使用 $(eval ...) 设置其值后,它始终保持为空。

如何正确使用 .ONESHELL 来做到这一点?或者还有其他方法吗?

makefile
1个回答
0
投票

你在这里有很多困惑。其中一些可以通过遵循规则来缓解,切勿在食谱中使用

$(eval ...)
。与使用
$(shell ...)
类似。它仅在最晦涩的情况下使用,并且只有当您真正深入了解 make 的工作原理时才使用。

编写此代码的最简单方法是使用所有 shell 脚本,而不使用 make 函数。例如:

.ONESHELL:
misc:
        venvPath=$$(xdg-user-dir ENVIRONMENTS)/nav)
        if test -d $$venvPath; then
            python -m venv $$venvPath \
                && source $$venvPath/bin/activate \
                && pip install -U pip wheel
            . $$venvPath/bin/activate \
                && pip install powerline-status
        fi
.PHONY: misc

您遇到问题的基本原因是

ifeq
是一个预处理器语句,它在解析makefile时扩展和测试,而配方的内容(由TAB缩进的行)仅在稍后执行make 尝试构建目标。

因此,无法使用

ifeq
来测试调用配方之前未设置的变量。

© www.soinside.com 2019 - 2024. All rights reserved.