模块提供者
某些使用场景下,预定义模块的灵活性不足。例如,与某个特定任务相关的模块整体集可能会依赖于本地平台上的某些信息。
注意: 模块提供者是一个高级概念,您很少需要直接使用。阅读本节对大多数人日常工作不是必需的。
Qbs 如何使用模块提供者
如果 Qbs 遇到一个 Depends 项目,其名称与已知模块不匹配,它将检查是否可以生成这样的模块。此过程如下
- 如果qbsModuleProviders属性不是
未定义
,将对列表中的每个提供者名称,扫描所有搜索路径,查找名为module-providers/<name>.qbs
或module-providers/<name>/provider.qbs
的文件。 - 如果qbsModuleProviders属性是
未定义
,对搜索路径进行扫描,查找名为module-providers/<name>/provider.qbs
的文件,其中<name>
是Depends
项中指定的依赖项名称。多组件名称(如“a.b”)将转换为嵌套目录,并从最深路径开始扫描。例如,如果依赖项的名称是a.b
,则 Qbs 将查找a/b/provider.qbs
然后是a/provider.qbs
。 - 如果找到了这样的文件,它需要包含一个ModuleProvider项。此实例将创建一个项,可能导致创建一个或多个模块,并且 Qbs 从项中检索搜索路径来查找这些模块。详细信息请参阅ModuleProvider文档。
- 如果找到了匹配的模块提供者并提供了新的搜索路径,将再次尝试使用新路径来定位依赖项。只要找到匹配的模块提供者,就不论它是否创建了任何模块,都会停止搜索匹配的模块提供者。
- 如果任何搜索路径中都没有找到匹配的模块提供者,Qbs 将回退到通用模块提供者,该方法创建一个模块,尝试通过
pkg-config
来定位依赖项。此回退机制可以在各自的Depends项或全局通过–no-fallback-module-provider选项禁用。
选择模块提供者
如上所述,您可以使用 qbsModuleProviders 属性选择要运行的提供者。提供者按照此属性的指定顺序向 qbsSearchPaths 贡献,因此先指定的提供者生成的模块具有优先级。此属性可以在产品以及 项目 级别设置
$ qbs resolve project.qbsModuleProviders:providerA \ # sets property globally for the Project projects.SomeProject.qbsModuleProviders:providerB \ # overrides property for the specific Project products.SomeProduct.qbsModuleProviders:providerC \ # overrides property for the specific Product
模块提供者的参数化
您可以通过命令行、配置文件或产品内部将信息传递给模块提供者,方法与对模块进行操作时类似。例如,以下 Qbs 调用将信息传递给了两个模块提供者 a
和 b
$ qbs moduleProviders.a.p1:true moduleProviders.a.p2:true moduleProviders.b.p:false
Qbs 将相应地设置各自的模块提供者的属性。在上面的例子中,模块提供者 a
需要声明两个布尔属性 p1
和 p2
,它们将分别设置为 true
和 false
。
©2023 The Qt Company Ltd. 本文档中包含的贡献归其各自所有者所有。本提供的文档依照自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 及其相关标志为芬兰 The Qt Company Ltd 以及全球其他国家的商标。所有其他商标均为其各自所有者的财产。