Xmake 是一个基于 Lua 的轻量级跨平台构建工具 。
它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时 。
它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上 。
我们能够使用它像 Make/Ninja 那样可以直接编译项目,也可以像 CMake/Meson 那样生成工程文件,另外它还有内置的包管理系统来帮助用户解决 C/C++ 依赖库的集成使用问题 。
目前,Xmake 主要用于 C/C++ 项目的构建 , 但是同时也支持其他 native 语言的构建,可以实现跟 C/C++ 进行混合编译,同时编译速度也是非常的快,可以跟 Ninja 持平 。
Xmake = Build backend + Project Generator + Package Manager + [Remote|Distributed] Build + Cache
尽管不是很准确,但我们还是可以把 Xmake 按下面的方式来理解:
【Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持】Xmake ~= Make/Ninja + CMake/Meson + Vcpkg/Conan + distcc + ccache/sccache
- 项目源码
- 官方文档
- 入门课程
文章插图
新特性介绍包组件支持背景简介这个新特性主要用于实现从一个 C/C++ 包中集成特定的子库,一般用于一些比较大的包中的库组件集成 。
因为这种包里面提供了很多的子库,但不是每个子库用户都需要,全部链接反而有可能会出问题 。
尽管 , 之前的版本也能够支持子库选择的特性,例如:
add_requires("sfml~foo", {configs = {graphics = true, window = true}})add_requires("sfml~bar", {configs = {network = true}})target("foo")set_kind("binary")add_packages("sfml~foo")target("bar")set_kind("binary")add_packages("sfml~bar")
这是通过每个包的自定义配置来实现的,但这种方式会存在一些问题:sfml~foo
和sfml~bar
会作为两个独立的包,重复安装,占用双倍的磁盘空间- 也会重复编译一些共用代码,影响安装效率
- 如果一个目标同时依赖了
sfml~foo
和sfml~bar
,会存在链接冲突
为了解决这个问题,Xmake 新增了包组件模式,它提供了以下一些好处:
- 仅仅一次编译安装,任意多个组件快速集成 , 极大提升安装效率,减少磁盘占用
- 组件抽象化,跨编译器和平台 , 用户不需要关心如何配置每个子库之间链接顺序依赖
- 使用更加方便
使用包组件对于用户 , 使用包组件是非常方便的,因为用户是不需要维护包的,只要使用的包 , 它配置了相关的组件集,我们就可以快速集成和使用它,例如:
add_requires("sfml")target("foo")set_kind("binary")add_packages("sfml", {components = "graphics"})target("bar")set_kind("binary")add_packages("sfml", {components = "network"})
查看包组件那么,如何知道指定的包提供了哪些组件呢?我们可以通过执行下面的命令查看:$ xrepo info sfmlThe package info of project:require(sfml):-> description: Simple and Fast Multimedia Library-> version: 2.5.1...-> components:-> system:-> graphics: system, window-> window: system-> audio: system-> network: system
包组件配置如果你是包的维护者,想要将一个包增加组件支持 , 那么需要通过下面两个接口来完成包组件的配置:- add_components: 添加包组件列表
- on_component: 配置每个包组件
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)...
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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类似的事件订阅方式