eea*_*ach 2 c linux makefile pkg-config
我最近尝试从源代码安装一个应用程序(如果有影响的话,在 Debian Wheezy 上安装 dwb)。安装时,它会因某些依赖性问题而窒息,但对我来说,我似乎正在满足这种依赖性。我不是唯一遇到这个问题的人。这让我开始研究项目的 config.mk。
在 config.mk 中,我发现了几个如下所示的块:
REQPKG=foo
ifeq ($(shell pkg-config --exists $(REQPKG) && echo 1),1)
LIBS=$(REQPKG)
else
$(error Cannot find $(REQPKG))
endif
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎非常违反直觉。我找啊找啊。阅读手册页,查阅谷歌。我阅读了有关 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
Run Code Online (Sandbox Code Playgroud)
而不是我看起来的样子:
ifeq (($(not(True) && True)),True)
/*do things*/
else [...]
Run Code Online (Sandbox Code Playgroud)
我对 pkg-config 缺少什么?它这样做是因为它是一个 shell 实用程序并且有一些关于它们的奇怪约定吗?
另外,为什么文档如此稀疏?我是否缺少可以提供我正在寻找的信息的资源?
PS 我对 C 没有任何实际经验,所以如果我的示例代码看起来很奇怪......
pkg-config --exists不会创建任何输出,它只是返回0成功和1失败的退出代码。
&&当左侧返回成功时,shell 中运行右侧。
因此该行正在运行pkg-config --exists并且当且仅当它返回 true (返回代码0)然后将其echo作为1输出。然后1与1中的进行比较ifeq。
至于为什么你不能在这里做一些更简单的事情,答案是因为 make (当不在目标规则中时)不处理程序返回代码。特别是$(shell)根本不关注正在运行的 shell 命令的返回代码。
就我个人而言,我可能会将该测试编写为:
ifeq ($(shell pkg-config --exists $(REQPKG); echo $?),0)
Run Code Online (Sandbox Code Playgroud)
或者类似的东西
REQPKG=foo
REQPKG:=$(shell pkg-config --exists $(REQPKG) && echo '$(REQPKG)')
ifneq ($(REQPKG),)
LIBS=$(REQPKG)
else
$(error ...)
fi
Run Code Online (Sandbox Code Playgroud)