这个版本没啥太大新特性,主要对c++20 modules进行了实验性支持,目前支持clang/msvc编译器,除此之外改进了不少使用体验,并且提高了一些稳定性。

另外,这个版本新增了socket.io支持以及对应协程io的调度支持,为下个版本的远程编译,以及后续的分布式编译做准备。

新特性介绍

c++20 modules

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

Hello Module

关于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作为源文件而已。

模块接口文件

上文所述的*.mpp是xmake推荐的模块接口文件命名,其实各家编译器对于模块文件的默认后缀名都是不统一的,clang下是*.cppm,而msvc下是*.ixx,这对于编写跨编译器统一的模块项目是非常不友好的,

因此这里参考了build2里面的推荐方式,采用统一的*.mpp后缀,来规范xmake下模块项目接口的命令。

当然,这也支持xmake推荐命名方式,而对于*.ixx, *.cppm等后缀名,xmake也是完全兼容支持的,也可以直接添加到add_files中去。

其他例子

xmake项目下还内置了不少跟c++modules相关的工程examples,有兴趣的同学可以参考下:c++module examples

set_toolchain接口改动

set_toolchain这个接口主要用于针对target设置不同的编译工具链,2.2.9之前的版本其实有add_toolsset_tools两个接口来处理相同的事情,不过这两接口命名和使用上和规范不是很一致,因此做了些调整改动,用这个set_toolchain新接口更好的设置工具链。

对于add_files("*.c")添加的源码文件,默认都是会调用系统最匹配的编译工具去编译,或者通过xmake f --cc=clang命令手动去修改,不过这些都是全局影响所有target目标的。

如果有些特殊需求,需要对当前工程下某个特定的target目标单独指定不同的编译器、链接器或者特定版本的编译器,这个时候此接口就可以排上用途了,例如:

target("test1")
add_files("*.c") target("test2")
add_files("*.c")
set_toolchain("cc", "$(projectdir)/tools/bin/clang-5.0")

上述描述仅对test2目标的编译器进行特殊设置,使用特定的clang-5.0编译器来编译test2,而test1还是使用默认设置。

对于一些编译器文件名不规则,导致xmake无法正常识别处理为已知的编译器名的情况下,我们也可以加一个工具名提示,例如:

set_toolchain("cc", "gcc@$(projectdir)/tools/bin/mipscc.exe")

上述描述设置mipscc.exe作为c编译器,并且提示xmake作为gcc的传参处理方式进行编译。

socket io

这块的接口初步已经实现,支持lua协程的io调度,实现高并发的io读写(后期还会同时支持进程、pipe的调度支持),目前主要用于xmake自身的使用,用于为后续的远程编译和分布式编译做准备,所以暂时不开放用户自己使用,不过等后续完善后,会开放出来,用户也可以在自己的插件里面通过socket io做一些服务程序。

不过可能用户用到的场景不是很多,毕竟xmake只是个构建工具,很少会让用户自己去做io通信。

更新内容

新特性

  • #569: 增加对c++模块的实验性支持
  • 添加xmake project -k xmakefile生成器
  • 620: 添加全局~/.xmakerc.lua配置文件,对所有本地工程生效.
  • 593: 添加core.base.socket模块,为下一步远程编译和分布式编译做准备。

改进

  • #563: 重构构建逻辑,将特定语言的构建抽离到独立的rules中去
  • #570: 改进Qt构建,将qt.application拆分成qt.widgetappqt.quickapp两个构建规则
  • #576: 使用set_toolchain替代add_toolsset_tools,解决老接口使用歧义,提供更加易理解的设置方式
  • 改进xmake create创建模板工程
  • #589: 改进默认的构建任务数,充分利用cpu core来提速整体编译速度
  • #598: 改进find_package支持在macOS上对.tbd系统库文件的查找
  • #615: 支持安装和使用其他arch和ios的conan包
  • #629: 改进hash.uuid并且实现uuid v4
  • #639: 改进参数解析器支持-jN风格传参

Bugs修复

  • #567: 修复序列化对象时候出现的内存溢出问题
  • #566: 修复安装远程依赖的链接顺序问题
  • #565: 修复vcpkg包的运行PATH设置问题
  • #597: 修复xmake require安装包时间过长问题
  • #634: 修复mode.coverage构建规则,并且改进flags检测

xmake v2.2.9 发布, 新增c++20 modules的实验性支持的更多相关文章

  1. xmake v2.3.7 发布, 新增 tinyc 和 emscripten 工具链支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  2. xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  3. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  4. xmake v2.5.9 发布,改进 C++20 模块,并支持 Nim, Keil MDK 和 Unity Build

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  5. xmake v2.5.8 发布,新增 Pascal/Swig 程序和 Lua53 运行时支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  6. xmake v2.3.1 发布, 无缝对接其他构建系统

    最近对xmake内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验. 项目源码 官方文档 一些新特性: 一键编译其他构建系统维护的项目,实现无缝对接,并且支持交叉编译(比如autotoo ...

  7. xmake v2.3.4 发布, 更加完善的工具链支持

    为了让xmake更好得支持交叉编译,这个版本我重构了整个工具链,使得工具链的切换更加的方便快捷,并且现在用户可以很方便地在xmake.lua中扩展自己的工具链. 关于平台的支持上,我们新增了对*BSD ...

  8. xmake v2.5.7 发布,包依赖锁定和 Vala/Metal 语言编译支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  9. Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

随机推荐

  1. Elasticsearch:hanlp 中文分词器

    HanLP 中文分词器是一个开源的分词器,是专为Elasticsearch而设计的.它是基于HanLP,并提供了HanLP中大部分的分词方式.它的源码位于: https://github.com/Ke ...

  2. 【洛谷P3338】力

    题目大意:求 \[ E_{j}=\sum_{i<j} \frac{q_{i}}{(i-j)^{2}}-\sum_{i>j} \frac{q_{i}}{(i-j)^{2}} \] 题解:可以 ...

  3. python爬虫及结巴分词《攀登者》影评分析

    <攀登者>影评爬取及分析 0.项目结构 其中simkai.ttf为字体文件,Windows查看系统自带的字体 C:\Windows\Fonts 一.爬取豆瓣影评数据 # -*- codin ...

  4. org.springframework.web.servlet.view.ContentNegotiatingViewResolver

    restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式. 描述资源的三 ...

  5. xgboost使用细节

    from http://blog.csdn.net/zc02051126/article/details/46771793 在Python中使用XGBoost 下面将介绍XGBoost的Python模 ...

  6. 12.24TG1

    1,线段树中把pushup写出去是因为 有点线段树维护的值比较多,写出去方便美观. 2,洛谷有的质量高有的质量不高,没办法.

  7. Python模块之-OS模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  8. Spring Boot教程(十一) springboot程序构建一个docker镜像

    准备工作 环境: linux环境或mac,不要用windows jdk 8 maven 3.0 docker 对docker一无所知的看docker教程. 创建一个springboot工程 引入web ...

  9. babel简介——简单介绍与实用(转)

    博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3.babel转译器 4.babel的使用 5.常见的几种babel转译器和插件 6.babel最常见配置选项 7.babe ...

  10. sqli-labs(18)

    开始挑战第十八关(Header Injection - Uagent field - Error based) 常见的HTTP注入点产生位置为[Referer].[X-Forwarded-For].[ ...