Pkgconfig 模块

此模块是一个简单的 pkg-config 文件生成器。

用法

pkg = import('pkgconfig')
bar_dep = dependency('bar')
lib = library('foo', dependencies : [bar])
pkg.generate(lib)

pkg.generate()

生成的文件的属性使用以下关键字参数指定。

  • description 描述库的字符串,用于设置 Description: 字段
  • extra_cflags 要添加到 Cflags 字段中的额外编译器标志列表,位于头文件搜索路径之后
  • filebase 用于 pkg-config 文件的基本名称;例如,libfoo 的值将生成一个名为 libfoo.pc 的 pkg-config 文件
  • install_dir 要安装到的目录,默认为选项 libdir 的值,后跟 /pkgconfig
  • libraries 用户需要链接的已构建库列表(通常是 shared_library 的结果)。也可以提供任意字符串,它们将被添加到 Libs 字段中。从 0.45.0 版本开始,已构建库的依赖项将被自动添加,有关确切规则,请参阅下面的 隐式依赖项 部分。从 0.58.0 版本开始,只要它们是可链接的(具有已知的扩展名,例如 .a.so 等),custom_target() 对象也受支持。
  • libraries_private 要放入 Libs.private 字段中的已构建库或字符串列表。从 0.45.0 版本开始,已构建库的依赖项将被自动添加,有关确切规则,请参阅下面的 隐式依赖项 部分。从 0.58.0 版本开始,只要它们是可链接的(具有已知的扩展名,例如 .a.so 等),custom_target() 对象也受支持。
  • name 此库的名称,用于设置 Name: 字段
  • subdirs 应将 include 的哪些子目录添加到头文件搜索路径中,例如,如果您将头文件安装到 ${PREFIX}/include/foobar-1 中,此参数的正确值为 foobar-1
  • requires 字符串列表,pkg-config 依赖项或库,用于将 pkgconfig.generate() 用于放入 Requires 字段中
  • requires_privaterequires 相同,但用于 Requires.private 字段
  • url 包含库 URL 的字符串
  • variables 包含要添加到生成文件中的自定义变量的字符串列表。字符串必须采用 name=value 的形式,并且可以引用其他 pkgconfig 变量,例如 datadir=${prefix}/share。名称 prefixlibdirincludedir 是保留的,不能使用。从 0.56.0 版本开始,它也可以是一个字典,但 Meson 字典的排序没有保证,这可能会在一些变量引用其他变量时导致问题。值中的空格将用 \ 转义,这是必需的,因为在值是路径并且用于 cflagslibs 参数的情况下。从 0.59.0 版本开始,如果不需要转义(例如,空格分隔的值列表),则应使用 unescaped_variables 关键字参数。从 0.62.0 版本开始,默认情况下会自动创建引用的内置目录变量。
  • uninstalled_variables 用于代替 variables 关键字参数,用于生成未安装的 pkg-config 文件。从 0.54.0 版本开始,值中的空格将用 \ 转义,这是必需的,因为在值是路径并且用于 cflagslibs 参数的情况下。从 0.59.0 版本开始,如果不需要转义(例如,空格分隔的值列表),则应使用 unescaped_uninstalled_variables 关键字参数。
  • version 描述此库版本的字符串,用于设置 Version: 字段。(从 0.46.0 版本开始)如果未指定,则默认为项目版本。
  • d_module_versions 此 pkg-config 文件引用的 D 源代码编译时使用的模块版本标志列表
  • dataonly 字段。(从 0.54.0 版本开始)这用于在项目也有体系结构相关的输出时使用的体系结构无关的 pkg-config 文件。
  • conflicts从 0.36.0 版本开始,在 0.54.0 版本之前错误地发出警告)要放入 Conflicts 字段中的字符串列表。

从 0.46 版本开始,可以可选地将 StaticLibrarySharedLibrary 对象作为第一个位置参数传递。如果提供了一个对象,将为 pc 文件的所有必需字段提供默认值

  • install_dir 设置为与提供的库相同位置的 pkgconfig 文件夹。
  • description 设置为项目名称后跟库的名称。
  • name 设置为库的名称。

从 0.54.0 版本开始,也会生成未安装的 pkg-config 文件。它们位于 <build dir>/meson-uninstalled/ 中。有时,在不将它们安装到前缀的情况下,使用 Meson 构建的库构建项目很有用。为此,只需在构建应用程序之前设置 PKG_CONFIG_PATH=<builddir>/meson-uninstalled 即可。这将导致 pkg-config 优先使用这些 -uninstalled.pc 文件并从 Meson 构建目录中查找库和头文件。这是一个实验性功能,以尽力提供,它可能不适用于所有用例。

隐式依赖项

用于查找被隐式添加到 pkg-config 文件中的依赖项的确切规则随着时间的推移而演变。以下是截至 Meson 0.49.0 版本的规则,之前的版本可能会有略微不同的行为。

  • 未找到的库或依赖项将被忽略。
  • 库和依赖项默认情况下是私有的(即添加到 Requires.private:Libs.private: 中),除非它们在 librariesrequires 关键字参数中被明确添加,或者为主库(第一个位置参数)。
  • 库和依赖项将被去重,如果它们在公有和私有中都被添加(例如 Requires:Requires.private:),则它将从私有列表中删除。
  • 共享库(即 shared_library()而不是 library())仅将 -lfoo 添加到 Libs:Libs.private: 中,但不会提取它们的依赖项。这是因为依赖项仅在静态链接时才需要。
  • 其他库(即 static_library()library())将 -lfoo 添加到 Libs:Libs.private: 中,并递归地将其依赖项添加到 Libs.private:Requires.private: 中。
  • pkg-config 提供的依赖项将被添加到 Requires:Requires.private: 中。如果在声明该依赖项时指定了版本,它也将被写入生成的文件中。
  • 线程依赖项(即 dependency('threads'))将 -pthread 添加到 Libs:Libs.private: 中。
  • 内部依赖项(即 declare_dependency(compiler_args : '-DFOO', link_args : '-Wl,something', link_with : foo))将 compiler_args 添加到 Cflags: 中(如果为公有),将 link_argslink_with 添加到 Libs: 中(如果为公有),或将 Libs.private: 添加到 Libs.private: 中(如果为私有)。
  • 其他依赖项类型将它们的编译器参数添加到 Cflags: 中(如果为公有),并将链接器参数添加到 Libs: 中(如果为公有),或将 Libs.private: 添加到 Libs.private: 中(如果为私有)。
  • 一旦使用 pkg.generate(mylib) 为库生成一个 pkg-config 文件,任何后续对 pkg.generate() 的调用(其中 mylib 出现),将生成 Requires:Requires.private,而不是 Libs:Libs.private:

可重定位的 pkg-config 文件

默认情况下,pkg.generate 生成的文件包含硬编码的前缀路径。为了使它们可重定位,提供了 pkgconfig.relocatable 内置选项。请参阅 Pkgconfig 模块选项

搜索结果为