【问题标题】:What, exactly, does 'pkg-config --exists' do?'pkg-config --exists' 究竟是做什么的?
【发布时间】:2014-09-16 17:22:32
【问题描述】:

我最近尝试从源代码安装一个应用程序(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 的所有内容,但一无所获。手册页特别令人沮丧,因为它只是将“--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 没有任何实际经验,所以如果我的示例代码看起来很奇怪......

【问题讨论】:

    标签: c linux makefile pkg-config


    【解决方案1】:

    pkg-config --exists 不会创建任何输出,它只是返回退出代码 0 表示成功,1 表示失败。

    shell 中的&& 在左侧返回成功时运行右侧。

    因此,该行正在运行 pkg-config --exists 并且如果它返回 true(0 的返回代码),那么它将 echos 和 1 作为输出。然后将 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
    

    【讨论】:

      【解决方案2】:

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

      这就是为什么,例如,。原型“你好,世界!”在 C 中以“return 0;”结尾而不是“返回 1”——非零代码被认为是错误的。 (并不是说任何人都可能会查看您的硬件的返回值,但仍然......)

      【讨论】:

        【解决方案3】:

        Etan 提供了非常好的洞察力。但是,关于他的建议有一个澄清:

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

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

        不管怎样,我从他的描述中学到了很多,感谢他。

        【讨论】:

          猜你喜欢
          • 2014-11-24
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多