我想添加一个使用envdir运行程序的Make目标。

ENVDIR := $(shell command -v envdir)

serve: | $(ENVDIR)
    $(ENVDIR) /usr/local/myservice/env python -m SimpleHTTPServer 8000

这个想法是,如果用户没有安装envdir,它将为他们安装它。我需要管道字符,因为我并不总是希望它运行。我只想要它的任何版本。不幸的是,我无法很好地预测将envdir安装到的位置。
UNAME := $(shell uname)
$(ENVDIR):
ifeq ($(UNAME), Darwin)
    brew install daemontools
endif
ifeq ($(UNAME), Linux)
    sudo apt-get install daemontools
endif
# Add other operating systems here as appropriate...

我遇到的另一个问题是,如果用户未安装envdir,则该变量的值为空字符串。因此,a)我的“安装envdir”目标实际上并未运行,并且b)运行之后,$(ENVDIR)仍设置为空字符串,因此无法将其加载到serve目标中。

有没有一种方法可以使a)即使未定义ENVDIR,也可以使安装目标运行,以及b)在“install envdir”目标运行结束时重新定义变量的值?

请不要回答“您为什么要使用envdir”-我遇到了我依赖的各种不同二进制文件的问题,这恰好是一个易于共享的示例。

最佳答案

对于“空”问题,您可以执行以下操作:

ENVDIR := $(or $(shell command -v envdir),envdir)

因此,如果shell函数扩展为空字符串,则将替换envdir(在GNU make 3.81中添加了or函数)。这可能足以解决您的所有问题,因为安装后envdir命令现在将出现在PATH上,因此您不需要完整的路径。

09-26 18:14