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

时间:2014-12-09 09:48:39

标签: windows cmake cygwin build-process pkg-config

试图在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中调用--define-variable时如何向pkg-config提供PkgConfig参数?

PKG_CONFIG_EXECUTABLE定义指向pkg-config计划的set(PKG_CONFIG_EXECUTABLE "${PKG_CONFIG_EXECUTABLE} --define-variable=/cygdrive/c/graphviz") ;我试图将我的选项附加到此变量:

pkg_check_modules()

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

我可以使用哪些解决方法来解决我的问题?


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

1 个答案:

答案 0 :(得分:1)

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

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

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