从 CMake / PkgConfig 为 pkg-config 提供选项 --define-variable

Posted

技术标签:

【中文标题】从 CMake / PkgConfig 为 pkg-config 提供选项 --define-variable【英文标题】:Provide option --define-variable to pkg-config from CMake / PkgConfig 【发布时间】:2015-02-07 03:53:48 【问题描述】:

为了在 Windows 上移植 Linux 程序(使用 cygwin 和 gcc),我试图正确找到提供 pkg-config 文件的库(在我的例子中,这些库是由 Graphviz 带来的)。

简单的方法适用于 Linux:

find_package(PkgConfig)
pkg_check_modules(LIB_GRAPHVIZ libcdt libgvc libgraph)

在 Windows 上,我使用安装程序手动安装了 Graphviz(cygwin 路径:/cygdrive/c/graphviz)。为了找到pkg-config 文件,我导出了PKG_CONFIG_PATH 变量,以便在配置CMake 之前找到.pc 文件:

export PKG_CONFIG_PATH=/cygdrive/c/graphviz/pkgconfig
cmake $srcdir

配置工作正常,但是 .pc 文件没有适当的前缀(这会导致无效的包含和链接目录):

$ pkg-config --variable=prefix libgraph
/c/graphviz-mingw/local.2.20.3

关于pkg-config,解决方案是使用--define-variable 参数调用它,例如这里是如何获取有效的includedir

$ pkg-config --define-variable=prefix=/cygdrive/c/graphviz --variable=includedir libgraph
/cygdrive/c/graphviz/include/graphviz

我的问题:当从 CMake 中调用 pkg-config 时,如何将 --define-variable 参数提供给它?

PkgConfig 定义了指向pkg-config 程序的PKG_CONFIG_EXECUTABLE;我试图将我的选项附加到这个变量:

set(PKG_CONFIG_EXECUTABLE "$PKG_CONFIG_EXECUTABLE --define-variable=/cygdrive/c/graphviz")

但是pkg_check_modules() 无法检测到我的库。我的理解是对execute_process()的调用将$PKG_CONFIG_EXECUTABLE的内容视为无效程序。

我可以使用什么解决方法来解决我的问题?


编辑:实际上,一个简单的解决方法是使用不同的.pc 文件。但我很好奇是否可以在不更改这些文件的情况下解决问题。

【问题讨论】:

我遇到了同样的问题,也许您找到了另一个解决方案然后描述了解决方法? @CAMOBAP 不幸的是,我不记得了;我检查了最新的 CMake 文档,它没有提供任何方法来做到这一点。因此,据我所知,解决方法仍然是唯一的解决方案。 【参考方案1】:

感谢您覆盖PKG_CONFIG_EXECUTABLE 的想法!如果参数用分号分隔,这确实对我有用,如下所示:

set(PKG_CONFIG_EXECUTABLE "$PKG_CONFIG_EXECUTABLE;--define-variable=/cygdrive/c/graphviz")

CMake 会将其视为一个列表,并且由于 execute_process() 需要一个命令参数列表,因此效果很好(在 Linux 下使用 CMake 3.17 进行了测试)。

【讨论】:

以上是关于从 CMake / PkgConfig 为 pkg-config 提供选项 --define-variable的主要内容,如果未能解决你的问题,请参考以下文章

错误:找不到 PkgConfig(缺少:PKG_CONFIG_EXECUTABLE)

在 cmake 中设置 PKG_CONFIG_PATH

pkg-config找不到openssl.pc

jpeg-6b没有生成pkgconfig

CMake的pkg-config模块使用

如何从 cmake 目标自动生成 pkgconfig 文件