究竟是什么,' pkg-config - 存在'做?

时间:2014-09-16 17:22:33

标签: c linux makefile pkg-config

我最近尝试从源代码安装应用程序(如果它有所不同,请在Debian Wheezy上安装dwb)。在安装时,它会阻塞一些依赖性问题,但对我来说,似乎我遇到了这种依赖性。 I wasn't the only person with this problem.让我在项目的config.mk中找到了。

在config.mk中,我发现了几个看起来像这样的块:

REQPKG=foo
ifeq ($(shell pkg-config --exists $(REQPKG) && echo 1),1)
LIBS=$(REQPKG)
else
$(error Cannot find $(REQPKG))
endif

这对我来说似乎非常直观。我搜索和搜索。阅读手册页,咨询谷歌。阅读关于pkg-config的所有内容,一无所获。该手册页特别令人沮丧,因为它只是列出了“存在”。作为一面旗帜并没有给出任何描述(我猜它是自我解释为--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没有任何实际经验,所以如果我的示例代码看起来很奇怪......

3 个答案:

答案 0 :(得分:4)

pkg-config --exists无法创建任何输出,只需返回退出代码0表示成功,1表示失败。

当左侧成功返回时,shell中的

&&会运行右侧。

因此该行正在运行pkg-config --exists并且iff返回true(返回代码0),然后echo输出1。然后将11中的ifeq进行比较。

至于为什么你不能在这里做更简单的事情,答案是因为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

答案 1 :(得分:1)

许多UNIX命令和库函数在成功时返回0。这是"明智的默认"在那个世界里。

这就是为什么,例如。典型的"你好,世界!"在C中结束"返回0;"而不是"返回1" - 非零代码被认为是错误的。 (并不是说任何人可能会查看你的HW的返回值,但仍然......)

答案 2 :(得分:0)

Etan提供了很好的见解。但是,关于他的建议有一个澄清之处:

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

在我的情况下,无法使用echo $?检索返回码,因此比较总是失败。该行直接在终端中工作,但不在shell函数中工作。我不得不求助于令人困惑的&& echo 0

无论如何,我从他的描述中学到了很多东西,并感谢他。