我最近试着从源代码安装一个应用程序(如果有区别的话,在Debian Wheezy上安装dwb)。在安装时,它会因为一些依赖性问题而窒息,但对我来说,我似乎遇到了那个依赖性。I wasn't the only person with this problem.,这让我在项目的config.mk中四处寻找。
在www.example.com中config.mk我发现了几个类似这样的区块:
REQPKG=foo
ifeq ($(shell pkg-config --exists $(REQPKG) && echo 1),1)
LIBS=$(REQPKG)
else
$(error Cannot find $(REQPKG))
endif
这对我来说似乎是非常违反直觉的。我搜索了又搜索。阅读了手册页,查阅了google。阅读了我能找到的关于pkg-config的所有内容,但一无所获。手册页尤其令人沮丧,因为它只是将“--exists”列为一个标志,而没有给出任何描述(我猜它就像--help一样不言自明)。
我开始认为Debian的pkg-config有一个错误,它返回了相反的结果。但是,当请求的包 * 存在 * 时,'pkg-config --exists'应该返回0(即False)。
为什么会这样呢?它不会产生更简洁的代码来返回True/False或1/0,以指示所需的包的存在吗?您可以这样做:
if (shell pkg-config --exists foo)
/*do things*/
else
/*throw error*/
endif
而不是像我看到的那样:
ifeq (($(not(True) && True)),True)
/*do things*/
else [...]
关于pkg-config,我遗漏了什么?它这样做是因为它是一个shell实用程序和一些奇怪的约定吗?
还有,为什么文档这么少?我是不是错过了一个能给予我要找的信息的资源?
PS我没有任何C语言的真实的经验,所以如果我的示例代码看起来很奇怪...
4条答案
按热度按时间5us2dqdw1#
pkg-config --exists
不创建任何输出,它只是返回一个退出代码0
(表示成功)和1
(表示失败)。当左侧返回成功时,shell中的
&&
运行右侧。所以这一行运行
pkg-config --exists
,如果它返回true(返回代码0
),那么echo
将1
作为输出,然后将1
与ifeq
中的1
进行比较。至于为什么你不能在这里做一些更简单的事情,答案是因为make(当不在目标规则中时)不处理程序返回码,特别是
$(shell)
根本不关注正在运行的shell命令的返回码。就我个人而言,我可能会把这个测试写成:
或者类似的东西
bvuwiixz2#
许多UNIX命令和库函数在成功时返回0,这是“合理的默认值”。
这就是为什么,例如,C语言中典型的“Hello,world!”以“return 0;而不是“返回1”-非零代码被认为是错误的。(并不是说任何人都可能会看你的硬件的返回值,但仍然...)
l0oc07j23#
伊坦提供了非常好的见解。但是,关于他的建议有一点需要澄清:
在我的例子中,返回代码不能用
echo $?
检索,所以比较总是失败。该行直接在终端中工作,但不能在shell函数中工作。不管怎样,我从他的描述中学到了很多,并为此感谢他。
jjjwad0x4#
这对我来说似乎更清晰: