我想添加一个Make目标,该目标使用envdir运行程序。
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)仍然被设置为空字符串,因此将其加载到服务目标中不起作用。
是否有办法a)让安装目标运行,即使ENVDIR未定义,以及b)在“安装envdir”目标运行结束时重新定义变量的值?
请不要回答“为什么你使用envdir” - 我遇到了这个问题,我依赖于各种不同的二进制文件,这恰好是一个容易分享的例子。
为什么不使用条件来区分已经安装了'envdir'的情况和它不是的情况? 'ifeq($(ENVDIR),)... else ... endif'可能会成功。在'envdir'安装配方结束时,您可以简单地重新调用make,而不是试图改变'ENVDIR'变量的值(我知道,*递归make是坏的,但坏事有时非常有用)。 –