从makefile内部自动安装软件包

从makefile内部自动安装软件包,makefile,package,Makefile,Package,目标:当用户键入“makepackages”时,自动搜索程序包libx11dev(我的程序需要编译),如果找不到,则安装它。以下是我的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

目标:当用户键入“makepackages”时,自动搜索程序包libx11dev(我的程序需要编译),如果找不到,则安装它。以下是我的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中做的事情可能吗?如果是,怎么做


非常感谢。

问题在于
shell
函数的作用类似于shell中的backticks:它将输出带到stdout,并将其作为函数的值返回。所以,apt get不是挂起的,它在等待您输入对某个问题的响应。但您无法看到问题,因为make已获取输出

你这样做是行不通的。为什么要使用
shell
,而不是将其作为一个规则来编写

packages:
        [ -z `dpkg -l | grep libx11-dev` ] && sudo apt-get install libx11-dev
.PHONY: packages

我找到了一种更好的方法,避免了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  

将其视为普通布尔变量。

我在这里看到一个模板;拿出libx11 dev,让它在一个包列表上工作?@madcascitist非常感谢!这是可行的,除非软件包已经安装,否则我会得到错误:“/bin/sh:1:[:ii:unexpected operator”,这可能与命令dpkg-l | grep libx11 dev的输出是“ii libx11 dev 2:1.4.99.1-0ubuntu2”Add quotes:
[-z”`dpkg-l | grep libx11 dev`]有关。