gpt4 book ai didi

makefile - Make 目标依赖于二进制文件,它可能存在也可能不存在于 $PATH

转载 作者:行者123 更新时间:2023-12-04 21:33:08 25 4
gpt4 key购买 nike

我想添加一个使用 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) 仍然设置为空字符串,所以将它加载到服务目标中不起作用。

有没有办法 a) 让安装目标运行,即使 ENVDIR 未定义,b) 在“安装 envdir”目标运行结束时重新定义变量的值?

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

最佳答案

对于“空”问题,您可以这样做:

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

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

关于makefile - Make 目标依赖于二进制文件,它可能存在也可能不存在于 $PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45972663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com