从makefile内部自动安装包

时间:2012-05-15 20:04:53

标签: makefile package

目标:当用户输入'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中做什么?如果是这样,怎么样?

非常感谢。

2 个答案:

答案 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  

被视为普通的布尔变量。