目标:当用户输入'make packages'时,自动搜索包libx11-dev(我的程序需要编译),如果没有找到,则安装它。这是我的makefile的简化版本:
PACKAGES = $(shell if [ -z $(dpkg -l | grep libx11-dev) ]; then sudo apt-get install libx11-dev; fi)
[other definitions and targets]
packages: $(PACKAGES)
当我输入'make packages'时,系统会提示我输入超级用户密码。如果输入正确,则会无限期挂起。
我正在尝试从makefile中做什么?如果是这样,怎么样?
非常感谢。
答案 0 :(得分:8)
问题是shell
函数的作用类似于shell中的反引号:它将输出转换为stdout并将其作为函数的值返回。所以,apt-get并没有挂起,它等着你输入对某个问题的回复。但是你无法看到这个问题,因为make已经取得了输出。
你这样做的方式是行不通的。为什么使用shell
而不只是将其作为规则编写?
packages:
[ -z `dpkg -l | grep libx11-dev` ] && sudo apt-get install libx11-dev
.PHONY: packages
答案 1 :(得分:4)
我找到了一种更好的方法,避免了if语句出现意外参数的问题:
if ! dpkg -l | grep libx11-dev -c >>/dev/null; then sudo apt-get install libx11-dev; fi
grep上的-c标志使它返回dpkg -l中包含字符串libx11-dev的行数,该字符串将为0(如果已卸载)或1(如果已安装),则允许
dpkg -l | grep libx11-dev -c
被视为普通的布尔变量。