我想添加一个Make目标,使用envdir运行程序。
我遇到的另一个问题是,如果用户没有安装envdir,则该变量将求值为空字符串。因此:a)我的“安装envdir”目标实际上未运行,b)在它运行之后,$(ENVDIR)仍设置为空字符串,因此在服务目标中加载它不起作用。
有没有方法:a)即使未定义ENVDIR也可以运行安装目标,b)重新定义变量的值在“安装envdir”目标运行结束时?
请不要回答“为什么要使用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 是不好的,但有时候坏事非常有用)。 - Renaud Pacalet