'pkg-config --exists'到底是做什么的?

wbrvyc0a  于 2023-02-15  发布在  其他
关注(0)|答案(4)|浏览(243)

我最近试着从源代码安装一个应用程序(如果有区别的话,在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语言的真实的经验,所以如果我的示例代码看起来很奇怪...

5us2dqdw

5us2dqdw1#

pkg-config --exists不创建任何输出,它只是返回一个退出代码0(表示成功)和1(表示失败)。
当左侧返回成功时,shell中的&&运行右侧。
所以这一行运行pkg-config --exists,如果它返回true(返回代码0),那么echo1作为输出,然后将1ifeq中的1进行比较。
至于为什么你不能在这里做一些更简单的事情,答案是因为make(当不在目标规则中时)不处理程序返回码,特别是$(shell)根本不关注正在运行的shell命令的返回码。
就我个人而言,我可能会把这个测试写成:

ifeq ($(shell pkg-config --exists $(REQPKG); echo $?),0)

或者类似的东西

REQPKG=foo
REQPKG:=$(shell pkg-config --exists $(REQPKG) && echo '$(REQPKG)')
ifneq ($(REQPKG),)
    LIBS=$(REQPKG)
else
    $(error ...)
fi
bvuwiixz

bvuwiixz2#

许多UNIX命令和库函数在成功时返回0,这是“合理的默认值”。
这就是为什么,例如,C语言中典型的“Hello,world!”以“return 0;而不是“返回1”-非零代码被认为是错误的。(并不是说任何人都可能会看你的硬件的返回值,但仍然...)

l0oc07j2

l0oc07j23#

伊坦提供了非常好的见解。但是,关于他的建议有一点需要澄清:

ifeq ($(shell pkg-config --exists $(REQPKG); echo $?),0)

在我的例子中,返回代码不能用echo $?检索,所以比较总是失败。该行直接在终端中工作,但不能在shell函数中工作。
不管怎样,我从他的描述中学到了很多,并为此感谢他。

jjjwad0x

jjjwad0x4#

这对我来说似乎更清晰:

pkg-config --exists gtk+-3.0 && echo "Installed" || echo "Not installed"

相关问题