8

目标:当用户键入'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中尝试做的事情是否可行?如果是这样,怎么做?

非常感谢。

4

2 回答 2

8

问题是该shell函数的行为就像 shell 中的反引号:它将输出带到 stdout 并将其作为函数的值返回。所以,apt-get 并没有挂起,它在等待您输入对某个问题的回复。但是你看不到这个问题,因为 make 已经获取了输出。

你这样做的方式是行不通的。你为什么要使用shell而不是仅仅把它写成规则?

packages:
        [ -z `dpkg -l | grep libx11-dev` ] && sudo apt-get install libx11-dev
.PHONY: packages
于 2012-05-16T12:20:14.320 回答
4

I figured out a better way, which avoids the problem of having unexpected arguments to the if statement:

if ! dpkg -l | grep libx11-dev -c >>/dev/null; then sudo apt-get install libx11-dev; fi

The -c flag on grep makes it return the number of lines in dpkg -l which contain the string libx11-dev, which will either be 0 (if uninstalled) or 1 (if installed), allowing

dpkg -l | grep libx11-dev -c  

to be treated like an ordinary boolean variable.

于 2012-05-18T00:31:47.890 回答