Xmake v2.8.3 发布,改进 Wasm 并支持 Xmake 源码调试
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 自身源码的断点调试支持,这可以帮助贡献者更加快速的熟悉 xmake 源码,也可以帮助用户去快速调试分析自身项目的配置脚本。
另外,我们 xmake-repo 官方仓库包的数量也即将突破 1100,短短一个月的时间,就新增了 100 多个包,非常感谢 @star-hengxing 的贡献。
同时,我们重点改进了 Wasm 的构建支持,以及 Qt6 for wasm 的支持。
断点调试 Xmake 源码
2.8.3 版本,我们新增了 Lua 断点调试支持,配合 VSCode-EmmyLua 插件,我们可以很方便的在 VSCode 中断点调试 Xmake 自身源码。
首先,我们需要在 VSCode 的插件市场安装 VSCode-EmmyLua 插件,然后执行下面的命令更新下 xmake-repo 仓库保持最新。
xrepo update-repo
!> Xmake 也需要保持最新版本。
然后,在自己的工程目录下执行以下命令:
$ xrepo env -b emmylua_debugger -- xmake build
其中 xrepo env -b emmylua_debugger
用于绑定 EmmyLua 调试器插件环境,而 --
后面的参数,就是我们实际需要被调试的 xmake 命令。
通常我们仅仅调试 xmake build
构建,如果想要调试其他命令,可以自己调整,比如想要调试 xmake install -o /tmp
安装命令,那么可以改成:
$ xrepo env -b emmylua_debugger -- xmake install -o /tmp
执行完上面的命令后,它不会立即退出,会一直处于等待调试状态,有可能没有任何输出。
这个时候,我们不要急着退出它,继续打开 VSCode,并在 VSCode 中打开 Xmake 的 Lua 脚本源码目录。
也就是这个目录:Xmake Lua Scripts,我们可以下载的本地,也可以直接打开 Xmake 安装目录中的 lua 脚本目录。
然后切换到 VSCode 的调试 Tab 页,点击 RunDebug
-> Emmylua New Debug
就能连接到我们的 xmake build
命令调试端,开启调试。
如下图所示,默认的起始断点会自动中断到 debugger:_start_emmylua_debugger
内部,我们可以点击单步跳出当前函数,就能进入 main 入口。
然后设置自己的断点,点击继续运行,就能中断到自己想要调试的代码位置。
我们也可以在项目工程的配置脚本中设置断点,也可以实现快速调试自己的配置脚本,而不仅仅是 Xmake 自身源码。
远程调试 Xmake 源码
2.8.3 版本现在也能支持远程调试,其实这个功能主要是给作者用的,因为作者本人的开发电脑是 mac,但是有时候还是需要能够在 windows 上调试 xmake 源码脚本。
但是在虚拟机中调试,太卡,体验不好,并且作者本人的电脑磁盘空间不够,因此我通常会远程连到单独的 windows 主机上去调试 xmake 源码。
我们先在 windows 机器上开启远程编译服务:
$ xmake service
然后本机打开需要构建的工程目录,执行远程连接,然后执行 xmake service --sync --xmakesrc=
去同步本地源码:
$ xmake service --connect
$ xmake service --sync --xmakesrc=~/projects/personal/xmake/xmake/
$ xmake build
$ xmake run
这样,我们就能本地修改 xmake 脚本源码,然后同步到远程 windows 机器上,然后远程执行 xmake 构建命令,获取对应的调试输出,以及分析构建行为。
我们也能够通过 xmake service --pull=
命令,回拉远程的文件到本地,进行分析。
注:详细的远程编译特性说明,见 远程编译文档。
支持 Cppfront 程序
我么也新增了一个构建规则,用于支持 cppfront 程序的编译:
add_rules("mode.debug", "mode.release")add_requires("cppfront")target("test")add_rules("cppfront")set_kind("binary")add_files("src/*.cpp2")add_packages("cppfront")
新增 utils.hlsl2spv 构建规则
早期我们已经提供了 utils.glsl2spv
规则去支持 glsl 的编译和使用,现在我们又新增了 utils.hlsl2spv
规则,实现对 hlsl 的编译支持。
add_rules("mode.debug", "mode.release")add_requires("glslang", {configs = {binaryonly = true}})target("test")set_kind("binary")add_rules("utils.hlsl2spv", {bin2c = true})add_files("src/*.c")add_files("src/*.hlsl", "src/*.hlsl")add_packages("directxshadercompiler")
关于这个规则的详细描述,可以参考文档:utils.glsl2spv,两者的使用方式和原理都是类似的。
新增 lib.lua.package 模块
Xmake 默认会限制对 lua 原生模块和接口的访问,而这个模块主要用于开放一些 lua 原生提供的 API,用户可以按需使用。
目前,它仅仅提供了 package.loadlib
接口,用于加载本地 so/dylib/dll 动态库中的 lua 模块。
这通常用于一些高性能要求的场景。
import("lib.lub.package")local script = package.loadlib("/xxx/libfoo.so", "luaopen_mymodule")
local mymodule = script()
mymodule.hello()
改进 Address sanitizer 支持
Address Sanitizer(ASan)是一个快速的内存错误检测工具,由编译器内置支持,通常我们需要在编译和链接的 flags 中同时配置 -fsanitize-address
才能正确开启。
而之前的版本中,我们是通过配置 add_rules("mode.asan")
然后 xmake f -m asan
去切换构建模式的方式来支持。
但这会有一些问题:
- 不能对依赖包生效
- 需要切换构建模式
- 不能同时检测 asan 和 ubsan
因此,新版本中,我们改用 policy 去更好的支持它们。
而我们可以通过开启 build.sanitizer.address
策略,就可以快速全局启用它,这会使得编译出来的程序,直接支持 ASan 检测。
例如,我们可以通过命令行的方式去启用:
$ xmake f --policies=build.sanitizer.address
也可以通过接口配置去全局启用:
set_policy("build.sanitizer.address", true)
当然,我们也可以单独对某个特定的 target 去配置开启,另外,如果全局配置它,我们就可以同时对所有依赖包也生效。
set_policy("build.sanitizer.address", true)add_requires("zlib")
add_requires("libpng")
它等价于,对每个包依次设置 asan 配置。
add_requires("zlib", {configs = {asan = true}})
add_requires("libpng", {configs = {asan = true}})
另外,我们也可以同时生效多个 sanitizer 检测,例如:
set_policy("build.sanitizer.address", true)
set_policy("build.sanitizer.undefined", true)
或者
$ xmake f --policies=build.sanitizer.address,build.sanitizer.undefined
除了 Asan,我们还提供了其他类似的 policies,用于检测线程,内存泄漏等问题。
- build.sanitizer.thread
- build.sanitizer.memory
- build.sanitizer.leak
- build.sanitizer.undefined
运行前自动构建
我们新增了 run.atuobuild
策略用于调整 xmake run
的行为,默认情况下,执行 xmake run
并不会自动构建目标程序,如果程序还没被编译,就是提示用户手动构建一下。
而开启这个策略,我们就可以在运行程序前,先自动构建对应的目标程序。
$ xmake f --policies=run.autobuild
$ xmake run
如果想要全局生效这个策略,可以全局开启它。
$ xmake g --policies=run.autobuild
浅构建指定目标
当我们指定重新构建某个目标的时候,如果它有很多的依赖目标,那么通常都会全部被重新构建。
$ xmake --rebuild foo
rebuild foo
rebuild foo.dep1
rebuild foo.dep2
...
这对于一些大型项目,依赖了大量 target 时候,非常影响编译速度,几乎等于大半个项目都要被重新构建。
新版本中,我们新增了 --shallow
参数,用于告诉 Xmake,当前仅仅重新构建指定的 target,它的所有依赖不需要被全部重新编译。
$ xmake --rebuild --shallow foo
only rebuild foo
改进警告设置
set_warnings
接口新增 extra
和 pedantic
设置,并且支持多个警告值组合。
set_warnings("all", "extra")
set_warnings("pedantic")
改进 Wasm 构建
现在,我们可以通过下面的配置,自己拉取 emscripten 工具链,并自动使用它去构建 wasm 程序。
if is_plat("wasm") thenadd_requires("emscripten")set_toolchains("emcc@emscripten")
end
仅仅只需要执行
$ xmake f -p wasm
$ xmake
就可以完成 wasm 程序构建,用户可以不用自己手动安装 emscripten,更加的方便。
另外,我们也对 Qt6 for wasm 做了很好的支持。
更新日志
新特性
- #4122: 支持 Lua 调试 (EmmyLua)
- #4132: 支持 cppfront
- #4147: 添加 hlsl2spv 规则
- 添加 lib.lua.package 模块
- #4226: 新增 asan 相关策略和对包的支持
- 添加
run.autobuild
策略开启运行前自动构建 - 添加全局策略
xmake g --policies=
改进
- #4119: 改进支持 emcc 工具链和 emscripten 包的整合
- #4154: 添加
xmake -r --shallow target
去改进重建目标,避免重建所有依赖目标 - 添加全局 ccache 存储目录
- #4137: 改进 Qt,支持 Qt6 for Wasm
- #4173: 添加 recheck 参数到 on_config
- #4200: 改进远程构建,支持调试本地 xmake 源码
- #4209: 添加 extra 和 pedantic 警告
Bugs 修复
- #4110: 修复 extrafiles
- #4115: 修复 compile_commands 生成器
- #4199: 修复 compile_commands 生成器对 c++ modules 的支持
- 修复 os.mv 在 windows 上跨驱动盘失败问题
- #4214: 修复 rust workspace 构建问题
https://tboox.org/cn/2023/09/26/xmake-update-v2.8.3/
相关文章:

Xmake v2.8.3 发布,改进 Wasm 并支持 Xmake 源码调试
Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好&#x…...

Serverless 数仓技术与挑战(内含 PPT 下载)
近期,Databend Labs 联合创始人张雁飞发表了题为「Serverless 数仓技术与挑战」的主题分享。以下为本次分享的精彩内容: 主题: 「Serverless 数仓技术与挑战」 演讲嘉宾: 张雁飞 嘉宾介绍: Databend Labs 联合创始人…...

九牧小牧携手国家队!一场“中国卫浴“和“中国体育”的双向奔赴
文 | 螳螂观察 作者 | 余一 1990年中国第一次举办了综合性国际体育大赛——北京亚运会,来自37个国家和地区,共计6578人的体育代表团参加了那届亚运会,一首《亚洲雄风》成为无数人记忆中的经典。 2023年杭州亚运会于近日正式拉开了帷幕&…...

crypto:Quoted-printable
题目 解压文件后可得到提示文本 好了这个没接触过,参考别的大佬wp QP为可打印字符编码,根据加密方式任何一个8位的字节值可编码为3个字符:一个等号“”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值。 利用网…...
【六级】作文模板-议论文-问题解决
视频来源: https://www.bilibili.com/video/BV1vK4y1e7A6/?spm_id_from333.880.my_history.page.click&vd_sourcefb8dcae0aee3f1aab700c21099045395 1、前言 两类作文: 议论文 (how to 问题解决型) what 某种现象 漫画 &…...

leetcodetop100 (22) 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 简单的用一个动态数组Arraylist记录,然后倒序遍历赋值给一个新的链表,这种空间复杂度是o(n),估计需要优化。 采用双指针; 我们可以申请两个指针…...
RabbitMQ配置文件_修改RabbitMQ MQTT的1883端口
Centos离线安装RabbitMQ并开启MQTT Docker安装rabbitMQ RabbitMQ集群搭建和测试总结_亲测 Docker安装RabbitMQ集群_亲测成功 rabbitmq.conf 默认没有配置文件,可以手动创建: /etc/rabbitmq/rabbitmq.conf # # RabbitMQ broker section # ## Related doc guide: https://…...

【Graph Net学习】LINE实现Graph Embedding
一、简介 LINE (Large-scale Information Network Embedding,2015) 是一种设计用于处理大规模信息网络的算法。它主要的目标是在给定的大规模信息网络中学习高质量的节点嵌入,并尽量保留网络中信息的丰富性。其具体的表现为在一个低 维空间里以向量形式表示网络中的…...

docker安装使用xdebug
docker安装使用xdebug 1、需要先安装PHP xdebug扩展 1.1 到https://pecl.php.net/package/xdebug下载tgz文件,下载当前最新稳定版本的文件。然后把这个tgz文件放到php/extensions目录下,记得install.sh中要替换解压的文件名: installExtensio…...

(1) ESP32获取图像,并通过电脑端服务器显示图像
目录 一、所需器件工具 二、客户端与服务器进行UDP通信 1、客户端代码 2、服务器端代码 3、效果展示 三、客户端拍照,通过UDP传输到服务器进行显示 1、客户端获取图像并UDP传输 2、电脑端服务器显示图像 3、效果展示 四、代码链接 一、所需器件工具 1.ESP3…...

乐鑫科技全球首批支持蓝牙 Mesh Protocol 1.1 协议
乐鑫科技 (688018.SH) 非常高兴地宣布,其自研的蓝牙 Mesh 协议栈 ESP-BLE-MESH 现已支持最新蓝牙 Mesh Protocol 1.1 协议的全部功能,成为全球首批在蓝牙技术联盟 (Bluetooth SIG) 正式发布该协议之前支持该更新的公司之一。这意味着乐鑫在低功耗蓝牙无线…...

1.算法——数据结构学习
算法是解决特定问题求解步骤的描述。 从1加到100的结果 # include <stdio.h> int main(){ int i, sum 0, n 100; // 执行1次for(i 1; i < n; i){ // 执行n 1次sum sum i; // 执行n次} printf("%d", sum); // 执行1次return 0; }高斯求和…...
信息论基础第二章阅读笔记
信息很难用一个简单的定义准确把握。 对于任何一个概率分布,可以定义一个熵(entropy)的量,它具有许多特性符合度量信息的直观要求。这个概念可以推广到互信息(mutual information),互信息是一种…...
Content-Type的取值
接口发送参数、接收响应数据,都需要双方约定好使用什么格式的数据,例如 json、xml。只有双方按照约定好的格式去解析数据才能正确的收发数据。而 Content-Type 就是用来告诉你数据的格式,这样我们才能知道怎么解析参数。 常见的 Content-Typ…...

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!
🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞…...
Python中的接口是什么?
在Python中,接口是一种约定或协议,用于定义类应该实现哪些方法或属性。接口并不会提供实际的实现,而是只定义了类应该具有哪些方法和属性的签名。 Python中的接口通常通过抽象基类(Abstract Base Class,简称ABC&#…...

自学WEB后端01-安装Express+Node.js框架完成Hello World!
一、前言,网站开发扫盲知识 1.网站搭建开发包括什么? 前端 前端开发主要涉及用户界面(UI)和用户体验(UX),负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…...

从C语言到C++:C++入门知识(1)
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C语言的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…...

服务器(Windows系统)自建filebrowser网盘服务器超详细教程
需要依赖(工具) 轻量服务器(云服务器)一台 —— 环境Windows Server 2019filebrowser安装包(https://github.com/filebrowser/filebrowser/releases) 下载安装filebrowser 进入链接下载:https:/…...
扩展欧几里得
扩展欧几里得算法 求 a x b y d axbyd axbyd 的一组解, d gcd ( a , b ) d \gcd(a,b) dgcd(a,b)。 辗转相除递归求解。 假设已经求出 b x ( b m o d a ) y d bx (b \bmod a)y d bx(bmoda)yd 的一组解。 a x b y b x ′ ( b m o d a ) y ′ b x …...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...