PkgConfigDeps¶
PkgConfigDeps 是 pkg-config 的依赖项生成器。它会生成名为 <PKG-NAME>.pc 的 pkg-config 文件,其中包含有效的 pkg-config 文件语法。
此生成器可在 conanfile 中通过名称使用
class Pkg(ConanFile):
generators = "PkgConfigDeps"
[generators]
PkgConfigDeps
它也可以在 conanfile 的 generate() 方法中完全实例化
from conan import ConanFile
from conan.tools.gnu import PkgConfigDeps
class App(ConanFile):
settings = "os", "arch", "compiler", "build_type"
requires = "zlib/1.3.1"
def generate(self):
pc = PkgConfigDeps(self)
pc.generate()
生成的文件¶
名为 <PKG-NAME>.pc 的 pkg-config 格式文件,包含有效的 pkg-config 文件语法。 prefix 变量会自动调整为 package_folder。
prefix=/Users/YOUR_USER/.conan/data/zlib/1.3.1/_/_/package/647afeb69d3b0a2d3d316e80b24d38c714cc6900
libdir=${prefix}/lib
includedir=${prefix}/include
bindir=${prefix}/bin
Name: zlib
Description: Conan package: zlib
Version: 1.2.11
Libs: -L"${libdir}" -lz -F Frameworks
Cflags: -I"${includedir}"
自定义¶
命名¶
默认情况下,*.pc 文件的命名遵循以下规则:
对于包,它使用包名,例如,包
zlib/1.3.1->zlib.pc。对于组件,包名 + 连字符 + 组件名,例如,
openssl/3.0.0配合self.cpp_info.components["crypto"]->openssl-crypto.pc。
您可以通过 pkg_config_name 和 pkg_config_aliases 属性更改此默认行为。请参阅 下面的属性部分。
如果一个配方使用**组件**,生成的将是 <[PKG-NAME]-[COMP-NAME]>.pc 文件,并带有相应的标志和依赖关系。
此外,还会生成一个 <PKG-NAME>.pc 文件,以维护与开始支持组件的配方的兼容性。此 <PKG-NAME>.pc 文件将所有组件声明为依赖项,而其余字段将为空,依赖于从组件 <[PKG-NAME]-[COMP-NAME]>.pc 文件传播的标志。
如果您想禁用 <PKG-NAME>.pc 文件的生成,可以将 pkg_config_name 属性设置为 none 字符串值。
def package_info(self):
self.cpp_info.set_property("pkg_config_name", "none")
self.cpp_info.components["crypto"].set_property("pkg_config_name", "mylib-crypto")
这将只生成 mylib-foo.pc 文件,而不生成 mylib.pc 文件。这只能在全局 cpp_info 级别完成,而不能在组件级别完成。
参考¶
属性¶
build_context_activated¶
当您有 **build-require** 时,默认情况下,*.pc 文件不会生成。但您可以使用 **build_context_activated** 属性激活它。
tool_requires = ["my_tool/0.0.1"]
def generate(self):
pc = PkgConfigDeps(self)
# generate the *.pc file for the tool require
pc.build_context_activated = ["my_tool"]
pc.generate()
build_context_folder¶
Conan 2.2.0 新增功能。
当您将同一包同时作为 **build-require** 和 **regular require** 时,这会导致生成器冲突,因为 *.pc 文件的文件名会冲突,同样名称、依赖名称等也会冲突。
例如,这是某些依赖项(capnproto、protobuf…)的典型情况,这些依赖项包含一个用于在构建时生成源代码的工具(因此是 **build_require**),同时也提供一个用于链接到最终应用程序的库,因此您还有一个 **regular require**。解决此冲突对于交叉构建尤其重要,因为工具(将在构建机器上运行)属于与库不同的二进制包,而库将“运行”在主机机器上。
您可以使用 build_context_folder 属性来指定一个文件夹,用于保存 *.pc 文件,这些文件是由 build_context_activated 中列出的所有 build requirements 创建的。
tool_requires = ["my_tool/0.0.1"]
requires = ["my_tool/0.0.1"]
def generate(self):
pc = PkgConfigDeps(self)
# generate the *.pc file for the tool require
pc.build_context_activated = ["my_tool"]
# save all the *.pc files coming from the "my_tool" build context and its requirements
pc.build_context_folder = "build" # [generators_folder]/build/
pc.generate()
build_context_suffix¶
已弃用:请改用 build_context_folder 属性。
与上面引用的 build_context_folder 属性概念相同,但此属性用于为需求指定一个后缀,因此构建上下文(工具需求)中的需求的文件/依赖/名称将被重命名。
tool_requires = ["my_tool/0.0.1"]
requires = ["my_tool/0.0.1"]
def generate(self):
pc = PkgConfigDeps(self)
# generate the *.pc file for the tool require
pc.build_context_activated = ["my_tool"]
# disambiguate the files, requires, names, etc
pc.build_context_suffix = {"my_tool": "_BUILD"}
pc.generate()
重要
此属性不应与 build_context_folder 属性同时使用。
属性¶
以下属性会影响 PkgConfigDeps 生成器:
pkg_config_name 属性将定义生成的
*.pc文件的名称(xxxxx.pc),或者设置为字符串none来禁用为该包生成全局*.pc文件。pkg_config_aliases 属性为 pkg_config 生成器设置任何包/组件名称的别名。此属性仅接受列表类型的 Python 对象。
pkg_config_custom_content 属性将向此生成器创建的 .pc 文件添加用户定义的免费格式变量。该内容可以是字符串或字典类型的 Python 对象。请注意,此处声明的变量将覆盖 Conan 已定义的变量。有关
*.pc文件中变量类型的更多信息,请单击 此处。system_package_version:此属性为创建的包的
*.pc文件中的Version字段设置自定义版本。component_version 属性为创建的该组件的
*.pc文件中的Version字段设置自定义版本(优先于 system_package_version 属性)。
这些属性可以在全局 cpp_info 级别或组件级别定义。
示例
def package_info(self):
custom_content = {"datadir": "${prefix}/share"} # or "datadir=${prefix}/share"
self.cpp_info.set_property("pkg_config_custom_content", custom_content)
self.cpp_info.set_property("pkg_config_name", "myname")
self.cpp_info.components["mycomponent"].set_property("pkg_config_name", "componentname")
self.cpp_info.components["mycomponent"].set_property("pkg_config_aliases", ["alias1", "alias2"])
self.cpp_info.components["mycomponent"].set_property("component_version", "1.14.12")