包组件的链接配置大多数情况下,包组件只需要配置它自己的一些子链接信息,例如:
package("sfml")add_components("graphics")add_components("audio", "network", "window")add_components("system")on_component("graphics", function (package, component)local e = package:config("shared") and "" or "-s"component:add("links", "sfml-graphics" .. e)if package:is_plat("windows", "mingw") and not package:config("shared") thencomponent:add("links", "freetype")component:add("syslinks", "opengl32", "gdi32", "user32", "advapi32")endend)on_component("window", function (package, component)local e = package:config("shared") and "" or "-s"component:add("links", "sfml-window" .. e)if package:is_plat("windows", "mingw") and not package:config("shared") thencomponent:add("syslinks", "opengl32", "gdi32", "user32", "advapi32")endend)...
【Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持】上面是一个不完整的包配置,我仅仅摘取一部分跟包组件相关的配置 。
一个关于包组件的配置和使用的完整例子见:components example
配置组件的编译信息我们不仅可以配置每个组件的链接信息,还有 includedirs, defines 等等编译信息,我们也可以对每个组件单独配置 。
package("sfml")on_component("graphics", function (package, component)package:add("defines", "TEST")end)
配置组件依赖package("sfml")add_components("graphics")add_components("audio", "network", "window")add_components("system")on_component("graphics", function (package, component)component:add("deps", "window", "system")end)
上面的配置,告诉包,我们的 graphics 组件还会额外依赖 window
和 system
两个组件 。
因此,在用户端,我们对 graphics 的组件使用,可以从
add_packages("sfml", {components = {"graphics", "window", "system"})
简化为:
add_packages("sfml", {components = "graphics")
因为,只要我们开启了 graphics 组件,它也会自动启用依赖的 window 和 system 组件,并且自动保证链接顺序正确 。
另外,我们也可以通过 add_components("graphics", {deps = {"window", "system"}})
来配置组件依赖关系 。
从系统库中查找组件我们知道,在包配置中,配置 add_extsources
可以改进包在系统中的查找,比如从 apt/pacman 等系统包管理器中找库 。
当然,我们也可以让每个组件也能通过 extsources
配置,去优先从系统库中找到它们 。
例如,sfml 包,它在 homebrew 中其实也是组件化的,我们完全可以让包从系统库中,找到对应的每个组件,而不需要每次源码安装它们 。
$ ls -l /usr/local/opt/sfml/lib/pkgconfig-r--r--r--1 rukiadmin317 10 19 17:52 sfml-all.pc-r--r--r--1 rukiadmin534 10 19 17:52 sfml-audio.pc-r--r--r--1 rukiadmin609 10 19 17:52 sfml-graphics.pc-r--r--r--1 rukiadmin327 10 19 17:52 sfml-network.pc-r--r--r--1 rukiadmin302 10 19 17:52 sfml-system.pc-r--r--r--1 rukiadmin562 10 19 17:52 sfml-window.pc
我们只需要,对每个组件配置它的 extsources:
if is_plat("macosx") thenadd_extsources("brew::sfml/sfml-all")endon_component("graphics", function (package, component)-- ...component:add("extsources", "brew::sfml/sfml-graphics")end)
默认的全局组件配置除了通过指定组件名的方式,配置特定组件,如果我们没有指定组件名,默认就是全局配置所有组件 。
package("sfml")on_component(function (package, component)-- configure all componentsend)
当然,我们也可以通过下面的方式,指定配置 graphics 组件,剩下的组件通过默认的全局配置接口进行配置:
package("sfml")add_components("graphics")add_components("audio", "network", "window")add_components("system")on_component("graphics", function (package, component)-- configure graphicsend)on_component(function (package, component)-- component audio, network, window, systemend)
经验总结扩展阅读
- vivox60的缺点_vivox60优缺点
- 一加9垃圾_一加9严重缺点
- Java 超新星开源项目 Solon v1.10.10 发布
- ipadpro2021款什么时候发布的_苹果ipadpro2021款发布
- 摩托罗拉edge s充电
- macbookpro2021款几月上市_macbookpro2021预计发布时间
- 大疆Action2上市时间_大疆Action2即将发布
- 2021华为p50发布会时间_华为p50发布会2021时间表
- Hugging Face发布diffuser模型AI绘画库初尝鲜!
- Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式