xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文主要详细讲解如何创建一个基于xmake的工程以及编译操作。
xmake提供了xmake create
命令,可以很方便的快速创建基于c/c++, swift, objc等各种语言的空工程项目,比如:
$ xmake create test
create test ...
[+]: xmake.lua
[+]: src/main.cpp
[+]: .gitignore
create ok!
默认会创建一个c++的hello world工程,根目录下会生成一个xmake.lua用于描述项目的构建规则。
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.cpp")
xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文主要详细讲解xmake在各个平台下的安装过程。
通常情况下我们只需要通过一键安装脚本即可完成安装。
bash <(curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh)
bash <(wget https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -O -)
Invoke-Expression (Invoke-Webrequest 'https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.ps1' -UseBasicParsing).Content
注:如果ps脚本执行提示失败,可以尝试在管理员模式下执行
此版本主要改进stream/stdio读写,字符集编码转换等操作,并重构整个原子操作实现,新增了c11风格atomic api来更细粒度控制。
tb_stream_init_from_sock_ref()
接口去直接打开一个socket作为stream去读取数据。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!
这个版本提供了全新的vs工程生成插件(非常感谢@OpportunityLiu的贡献),跟之前的生成vs的插件处理模式上有很大的不同,原先生成的vs工程是把所有源文件展开后,转交给vs来处理编译。
此外,我们重写了整个luajit的io runtime,使其更好的支持unicode字符集,尤其是windows上对中文字符的支持。
最后新版本开始尝试直接安装lua bitcode脚本,来减少安装包的大小(控制在2.4M以内),提高xmake启动加载的效率。
不过,需要注意的事,此版本的源码结构改成了git submodule来维护,所以老版本的xmake update
无法完整支持对新版本的更新,请参考安装文档进行完整安装。
原先的vs生成插件对xmake的rules是没法支持的。因为xmake的rules里面用了很多的on_build
此类自定义脚本,无法展开,所以像qt, wdk此类的项目就没法支持导出到vs里面进行编译了。
因此,为了解决这个问题,新版本的vs生成插件通过在vs下直接调用xmake命令,去执行编译操作,并且对intellsence和定义跳转,还有断点调试也做了支持。
具体使用方式跟老版本类似:
$ xmake project -k [vsxmake2010|vsxmake2013|vsxmake2015|..] -m "debug;release"
如果没指明版本,那么xmake会自动探测当前已有的vs版本来生成:
$ xmake project -k vsxmake -m "debug;release"