我最近尝试从源代码安装应用程序(如果它有所不同,请在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没有任何实际经验,所以如果我的示例代码看起来很奇怪......
答案 0 :(得分:4)
pkg-config --exists
无法创建任何输出,只需返回退出代码0
表示成功,1
表示失败。
&&
会运行右侧。
因此该行正在运行pkg-config --exists
并且iff返回true(返回代码0
),然后echo
输出1
。然后将1
与1
中的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
无论如何,我从他的描述中学到了很多东西,并感谢他。