距离上个版本,一晃又快四个月过去了,这期间断断续续对xmake做了不少使用体验上的改进,并且修复了不少问题。
这个版本并没有加入太多新特性,主要对 c++20 modules 进行了实验性支持,目前支持 clang/msvc 编译器,但是由于 gcc 目前相关支持还没 merge 进 master,所以 xmake 暂时还没对齐支持,有兴趣的同学可以使用 clang/msvc 尝鲜下。
另外,这个版本新增了 socket.io 支持以及对应协程 io 的调度支持,为下个版本的远程编译
,以及后续的分布式编译做准备
。
关于明年的下个版本,我打算先支持上远程编译,比如可以在 win 上方便的远程编译运行 linux/macosx 程序,或者在 linux 上远程编译 win 程序,然后通过搭配 xmake-vscode/vs/sublime 等插件提高开发效率。
XMake 是一个基于 Lua 的轻量级跨平台自动构建工具,支持在各种主流平台上构建项目
xmake 的目标是开发者更加关注于项目本身开发,简化项目的描述和构建,并且提供平台无关性,使得一次编写,随处构建
它跟 cmake、automake、premake 有点类似,但是机制不同,它默认不会去生成 IDE 相关的工程文件,采用直接编译,并且更加的方便易用 采用 lua 的工程描述语法更简洁直观,支持在大部分常用平台上进行构建,以及交叉编译
并且 xmake 提供了创建、配置、编译、打包、安装、卸载、运行等一些 actions,使得开发和构建更加的方便和流程化。
不仅如此,它还提供了许多更加高级的特性,例如插件扩展、脚本宏记录、批量打包、自动文档生成等等。。
add_requires("libuv master", "ffmpeg", "zlib 1.20.*", "tbox >1.6.1")
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("libuv", "ffmpeg", "tbox", "zlib")
c++ modules 已经正式纳入了 c++20 草案,msvc 和 clang 也已经基本实现了对modules-ts的支持,随着 c++20 的脚步离我们越来越近,xmake 也开始对 c++modules 提前做好了支持。
目前 xmake 已经完全支持了 msvc/clang 的 modules-ts 构建实现,而对于 gcc,由于它的 cxx-modules 分支还在开发中,还没有正式进入 master,我看了下里面的 changelog,相关 flags 还在不断变动,感觉还没稳定下来,因此这里暂时还没对其进行支持。
关于 xmake 对 c++modules 的相关进展见:https://github.com/xmake-io/xmake/pull/569
关于 c++modules 的相关介绍我就不多说了,这边主要还是介绍下 xmake 下如何去构建 c++modules 项目,我们先来看一个简单的例子:
target("hello")
set_kind("binary")
add_files("src/*.cpp", "src/*.mpp")
上面是一个支持构建 c++modules 文件的 xmake.lua 描述,其中hello.mpp
就是模块文件:
#include <cstdio>
export module hello;
using namespace std;
export namespace hello {
void say(const char* str) {
printf("%s\n", str);
}
}
而 main.cpp 是使用了 hello 模块的主程序:
import hello;
int main() {
hello::say("hello module!");
return 0;
}
接下来我们执行 xmake 来构建下这个程序吧:
ruki:hello ruki$ xmake
[ 0%]: ccache compiling.release src/hello.mpp
[ 50%]: ccache compiling.release src/main.cpp
[100%]: linking.release hello
build ok!
xmake 内部会去处理所有细节逻辑,对于开发者而言,仅仅是添加了模块文件*.mpp
作为源文件而已。
关于更多详情,可以看下我的博客文章:https://tboox.org/cn/2019/12/21/xmake-update-v2.2.9/
上文所述的*.mpp
是 xmake 推荐的模块接口文件命名,其实各家编译器对于模块文件的默认后缀名都是不统一的,clang 下是*.cppm
,而 msvc 下是*.ixx
,这对于编写跨编译器统一的模块项目是非常不友好的,
因此这里参考了build2里面的推荐方式,采用统一的*.mpp
后缀,来规范 xmake 下模块项目接口的命令。
当然,这也支持 xmake 推荐命名方式,而对于*.ixx
, *.cppm
等后缀名,xmake 也是完全兼容支持的,也可以直接添加到add_files
中去。
xmake 项目下还内置了不少跟 c++modules 相关的工程 examples,有兴趣的同学可以参考下:c++module examples
这块的接口初步已经实现,支持 lua 协程的 io 调度,实现高并发的 io 读写(后期还会同时支持进程、pipe 的调度支持),目前主要用于 xmake 自身的使用,用于为后续的远程编译和分布式编译做准备,所以暂时不开放用户自己使用,不过等后续完善后,会开放出来,用户也可以在自己的插件里面通过 socket io 做一些服务程序。
不过可能用户用到的场景不是很多,毕竟 xmake 只是个构建工具,很少会让用户自己去做 io 通信。
xmake project -k xmakefile
生成器~/.xmakerc.lua
配置文件,对所有本地工程生效.core.base.socket
模块,为下一步远程编译和分布式编译做准备。qt.application
拆分成qt.widgetapp
和qt.quickapp
两个构建规则set_toolchain
替代add_tools
和set_tools
,解决老接口使用歧义,提供更加易理解的设置方式xmake create
创建模板工程find_package
支持在 macOS 上对.tbd 系统库文件的查找-jN
风格传参这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.