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