如果 Makefile 中的函数似乎忽略条件并意外执行

如果 Makefile 中的函数似乎忽略条件并意外执行

以下是一个简单的食谱,但其行为并不像我想要的那样:

$(eval PkgName := $(shell pacman -Qq zsh | awk '{print $$1}'))

$(if ifeq ($(strip ${PkgName}),), pacman -Sy --noconfirm zsh)

我想要它做的就是安装一个软件包,前提是它以前没有安装过。如果系统中不存在该软件包,则安装成功执行。但是,如果已安装,它也会执行。

我尝试过 GNU make 条件 ifeq ,结果相同。

如果系统中已经存在该包,如何避免它执行?

答案1

可以写成如下:

$(eval PkgName := $(shell pacman -Qq zsh | awk '{print $$1}'))

$(if ${PkgName},,pacman -Sy --noconfirm zsh)

这应该可以毫无错误地完成这一切。

再次感谢,我希望这可以帮助将来的人。

答案2

$(if cond,true_path,false_path)您将与 make 的条件混淆了ifeq

对于您的用例,您可以定义一个 make 变量$(STATUS)并在 if 语句中检查是否缺少 install。

STATUS := $(if $(strip $(shell pacman -Qq zsh | awk '{print $$1}')),,$(strip $(shell pacman -Sy --noconfirm zsh)))

相关内容