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 ~= 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
,会存在链接冲突如果是对于 boost 这种超大包的集成,重复编译和磁盘占用的影响会非常大,如果在子库组合非常多的情况下,甚至会导致超过 N 倍的磁盘占用。
为了解决这个问题,Xmake 新增了包组件模式,它提供了以下一些好处:
更多背景详情见:#2636
对于用户,使用包组件是非常方便的,因为用户是不需要维护包的,只要使用的包,它配置了相关的组件集,我们就可以快速集成和使用它,例如:
add_requires("sfml")
target("foo")
set_kind("binary")
add_packages("sfml", {components = "graphics"})
target("bar")
set_kind("binary")
add_packages("sfml", {components = "network"})
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 ~= Make/Ninja + CMake/Meson + Vcpkg/Conan + distcc + ccache/sccache
在先前的版本中,Xmake 提供了一种 TryBuild 模式,可以在没有 xmake.lua 的情况下,使用 Xmake 尝试对 autoconf/cmake/meson 等维护的第三方项目进行直接构建。
其实,也就是让 Xmake 检测到对应的构建系统后,调用 cmake 等命令来实现,但是会帮助用户简化配置操作,另外还能对接 xmake 的交叉编译工具链配置。
但是,这种模式有一定的失败率,比如以下一些情况,都会可能导致构建失败:
而 TryBuild 模式通常处理这些情况,但是在新版本中,我们对 TryBuild 模式引入了一种新的机制,通过复用 xmake-repo 仓库中的构建脚本,来改进构建逻辑。
它大概得处理流程是这样子的:
这能带来什么好处呢,如果匹配成功,我们能够解决上面提到的各种问题。
即使当前项目源码不支持指定平台,或者源码和构建脚本存在一定的缺陷,Xmake 也能自动打入特定 patch 去修复它,并引入需要的依赖包,确保它肯定能够一键编译通过。
我们使用 libjpeg 库为例,来直观的感受下。
$ wget https://jaist.dl.sourceforge.net/project/libjpeg-turbo/2.1.4/libjpeg-turbo-2.1.4.tar.gz
$ tar -xvf libjpeg-turbo-2.1.4.tar.gz
$ cd libjpeg-turbo-2.1.4
Xmake 如果检测到是 libjpeg 库,就会提示用户,是否作为 libjpeg 2.1.4 来构建。
ruki-2:libjpeg-turbo-2.1.4 ruki$ xmake
note: libjpeg-turbo 2.1.4 in xmake-repo found, try building it or you can run `xmake f --trybuild=` to set buildsystem (pass -y or --confirm=y/n/d to skip confirm)?
please input: y (y/n)
我们按下回车键确认继续构建。
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 ~= Make/Ninja + CMake/Meson + Vcpkg/Conan + distcc + ccache/sccache
这个版本我们对 C++20 Modules 的实现进行了重构和改进,改进了模块文件的依赖图解析,新增了对 STL 和 User HeaderUnits 的支持,同时让 CMakelists/compile_commands 生成器也支持了 C++ Modules。
另外,我们新增了一个 xmake watch
插件,可以实时监控当前工程文件更新,自动触发增量构建,或者运行一些自定义的命令。
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 ~= Make/Ninja + CMake/Meson + Vcpkg/Conan + distcc + ccache/sccache
这个版本,我们增加了大量的重量级新特性:
通过这些特性,我们可以更加快速地编译大型 C/C++ 项目。另外,它们完全是跨平台的,不仅支持 gcc/clang 也支持 msvc,而且除了编译器无任何第三方依赖,使用也非常方便。
因此,使用了 Xmake,就等于同时使用了 distcc/ccache/sccache
。
相比这些第三方的工具,Xmake 完全支持 Windows 和 msvc,在消除了平台差异性的同事,也省去了独立进程调用,以及额外的守护进程带来的开销。
除了这些特性之外,新版本 Xmake 还新增 Keil/c51 项目的编译支持,以及对 nvidia-hpc-sdk 工具链中的 nvc/nvc++/nvfortran 编译器的支持。
上个版本我们已经初步支持了远程编译,但是没有提供用户认证支持,这会带来一些安全性问题,因此这个版本,我们新增了用户认证支持。
目前,Xmake 主要提供以下几种认证机制,另外,它对分布式编译和远程缓存也同样生效。
这也是我们默认推荐的方式,更加安全,配置和连接也更加方便,每次连接也不用输入密码。
我们在执行 xmake service
命令时候,默认就会生成一个服务端和客户端的配置文件,并且自动生成一个默认的 token,因此本地直连是不需要任何配置的。
开源之夏是开源软件供应链点亮计划下的暑期活动,由中国科学院软件研究所与openEuler社区联合主办,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。作为每年暑期最火热的开源活动,开源之夏如今已进入第三届。
2022年,开源之夏联合124家开源社区,针对开源项目的开发与维护提供mini任务,学生可自主选择感兴趣的项目进行申请,并在中选后获得社区资深开发者亲自指导的机会。项目成功结项并贡献给社区后,参与者将获得开源之夏活动奖金和结项证书。
开源之夏网站:https://summer.iscas.ac.cn/
Xmake 社区今年继续参加了开源之夏 2022 活动,欢迎年满 18 周岁的在校学生踊跃参与我们的项目,还有奖金拿哦。
学生可以申请参加以下三个项目之一,完整项目详情见:Xmake 项目详情