Build pkg config:找到在哪里安装my.pc文件的平台无关方式?

Build pkg config:找到在哪里安装my.pc文件的平台无关方式?,build,cross-platform,makefile,pkg-config,Build,Cross Platform,Makefile,Pkg Config,如何知道在何处安装.pc文件?这些文件放在不同操作系统的不同位置。目标是能够在安装目标中使用类似于$(INSTALL)mylib.pc$$(pkg config--pcdir)的东西。我以为pkg config会告诉我一些事情,但什么也找不到 我正在寻找一个在普通Makefile中可用的“独立”解决方案(必须不需要autotools或类似工具的支持)。不幸的是,对于stockpkg config安装(版本0.23),没有办法提取默认的“pc路径”,在二进制文件上运行字符串(例如,strings/

如何知道在何处安装.pc文件?这些文件放在不同操作系统的不同位置。目标是能够在安装目标中使用类似于
$(INSTALL)mylib.pc$$(pkg config--pcdir)
的东西。我以为
pkg config
会告诉我一些事情,但什么也找不到


我正在寻找一个在普通Makefile中可用的“独立”解决方案(必须不需要autotools或类似工具的支持)。

不幸的是,对于stock
pkg config
安装(版本0.23),没有办法提取默认的“pc路径”,在二进制文件上运行
字符串(例如,
strings/usr/bin/pkg-config | grep'/usr/*/pkgconfig'

如果您能够安装自定义版本,只需对其进行修补,在使用相应选项运行时写出
PKG\u CONFIG\u PC\u PATH
的值即可


另一个可能对您没有帮助的选项(但为了完整起见,我还是要提到)是在调用
PKG CONFIG
更新时设置
PKG\u CONFIG\u PATH
环境变量:

显然现在有一种方法可以做到这一点:

pkg-config --variable pc_path pkg-config
可在此中找到(请参见注释4)。当前手册页似乎记录了这一点

原始答案:

可怕的黑客解决方案(假设bourne shell):

这可能会为您提供多个位置

编辑作者@just someone

较短版本

pkg-config --debug 2>&1 | sed -ne '/Scanning directory /s///p'
并在第一个目录后停止:

pkg-config --debug 2>&1 | sed -ne '/Scanning directory /{s///p;q;}'

它应该进入${libdir}/pkgconfig(即${prefix}/lib/pkgconfig)


基本上,如果你安装了库,它们放在${libdir}中,那么你的.pc文件应该放在${libdir}/pkgconfig中,而不是其他地方。

从pkg config 0.24开始,你可以执行“pkg config--variable=pc_path pkg config”


“不可能”:这也是我的结论。这不是一个我会非常满意的答案,但除非哈利波特出现,否则我会接受这个答案。@just someone:恭喜!非常好(但很难,但我的解决方案也是如此:-p)使用调试消息的方法。:-P-使用autoconf进行可移植功能探测--检查。-使用automake进行可移植构建--检查。-使用libtool抽象出共享库处理的特性--检查。-使用pkg配置可移植地发现编译器标志--检查。-…-依赖未记录的实现细节无论pkg配置是否存在,都将击败整个可移植性之争——检查。-1.仍在寻找一种可移植且非疯狂的方法this@fstd您应该查看当前的手册页--现在有一种方法可以做到这一点。如果现实世界如此简单,那就太好了,但不管出于什么原因,FreeBSD都会将pkgconfig文件放入其中${prefix}/libdata/pkgconfig。这很愚蠢,但它确实存在。在这种情况下,看看glib Does之类的东西freebsd肯定是遵循这种模式的;他们已经设置了libdir=${prefix}/libdata如果你安装了一个*.pc文件,它必须安装在$(DESTDIR)$(libdir)中/pkgconfig。包的用户有适当设置DESTDIR和libdir的权限和责任,如果包忽略了用户指定的内容,则包被破坏。
pkg-config --debug 2>&1 | sed -ne '/Scanning directory /{s///p;q;}'