(笔记)如何在 CLion 上调试编译 xmake 项目

本文用于记录我个人在学习使用 xmake 过程中的一些使用技巧,在后续再次遇到类似问题时可以用来快速上手。因此不能保证是最好的解决方法,如果有更好的方法欢迎各位提出。

为何使用 xmake?
可以参考 xmake 作者的说法,对我来说最重要的是 xmake 拥有完整一体的包管理机制,使用 xmake 构建的项目可以通过简单的在命令行运行 “xmake” 来进行构建而不需要考虑它依赖的第三方库,并且自己需要引入第三方库时也只需要通过在 “xmake.lua" 文件中添加 "add_requires("xxx")" 就可以自动安装,不需要手动配置。
为何使用 CLion?
这个主要是使用习惯的原因,因为我习惯了使用 Jetbrains 系列的软件进行开发,因此如果非必要,或者其他软件明显更加方便,我是不会考虑改用其他软件的。当然也希望 xmake 能越做越好,让 CLion 可以官方支持 xmake 项目。

原理
由于 CLion 中的 xmake 插件并不好用(是通过生成 cmake 文件来进行调试,而有很多逻辑并不能很好的生成对应的 cmake 文件,并且当项目大了后,并不能保证 cmake 调试通过了而 xmake 一定能通过,并且实际往往是 xmake 能通过而转成 cmake 后会有各种各样的问题)。这里使用生成 compile_commands 的方式来实现对 xmake 项目的调试。
安装 xmake
参考官网(https://xmake.io/#/zh-cn/)这里不进行赘述。需要注意的是,一定要将 xmake 添加到系统的环境变量,也就是在命令行输入 "xmake --version" 后,会出现:

创建一个 xmake 项目
可以参考我在 github 上创建的例子(https://github.com/CHanzyLazer/xmake-example)以及官网的例子(https://xmake.io/#/zh-cn/getting_started),项目目录中需要一个 "xmake.lua" 文件,并且一般会将 main.cpp 放到 src 目录下。
这里都以我在 github 上的这个项目作为例子。
在 CLion 中添加这个项目
直接在 clion 中打开这个文件夹即可,让 clion 可以识别此项目,需要在命令行中输入 "xmake project -k compile_commands" 来生成 compile_commands 文件,然后在 clion 中打开刚刚生成的 compile_commands 文件(可能需要电脑中已经安装好了 VS),点击出现的 “加载 编译数据库 项目” 即可实现在 clion 中添加这个项目。详细参考下图:



加载完成后打开 scr/main.cpp,可以发现代码已经能够高亮了:

运行和调试
这里稍微有些复杂,需要先在 CLion 的 “文件 → 设置 → 构建、执行、部署 → 自定义构建目标” 中添加目标,如下图添加 xmake 的构建和清理工具并在构建目标中设置好:





然后需要设置几个全局的外部工具用于设置平台和构建模式(用于快速切换 release 和 debug 模式)。如下图,在 CLion 的 “文件 → 设置 → 工具 → 外部工具” 中添加两个外部工具分别用来设置当前的模式为 release 和 debug:


最后在 clion 的右上角添加配置,设置好之前设置的构建目标,并在构建之前添加运行之前添加的外部工具用来设置构建的模式。这里将 release 模式和 debug 模式分别添加了两个配置,从而可以方便的进行切换。





添加完成后就可以直接在右上角选择 release 或 debug 模式,直接运行项目了:




自动更新 compile_command 文件
可能会注意到,在通过右上角配置切换 release 和 debug 模式并运行后,虽然程序已经切换了模式,但是代码高亮并没有切换:

需要再次在命令行中输入 "xmake project -k compile_commands" 来重新生成 compile_commands 文件才能实现高亮更新:


并且也可能会希望能够在更新 xmake.lua 文件后能够自动更新 compile_command 文件,这里需要借助 File Watcher 这个插件来实现这个功能:

并且由于 xmake 在更新 compile_command 文件后会改变自己的某些配置文件,从而导致可能被再次检测到修改,导致死循环,因此需要使用外置的 .lua 文件来重新实现不修改自身配置文件的方式来更新 compile_command 文件(这里参考了 vscode 的 xmake 插件的写法:https://github.com/xmake-io/xmake-vscode/blob/master/assets/update_intellisense.lua),在这里的例子里就是 gen_cc.lua 文件(https://github.com/CHanzyLazer/xmake-example/blob/main/gen_cc.lua)。
如下图,在 “文件 → 设置 → 工具 → File Watcher” 中设置监控 xmake 相关文件的变化后自动执行 gen_cc.lua 来更新 compile_command 文件:

设置完成后就可以自动更新 compile_command 文件了。

参考:
【CLion开发编译调试Makefile项目】:https://blog.csdn.net/lylwo317/article/details/86673912
【Custom build targets and applications】:https://www.jetbrains.com/help/clion/custom-build-targets.html
【clion 的 file watcher 插件检测 xmake 的设置来变化自动更新 compile_command.json 时出现死循环】:https://github.com/xmake-io/xmake/issues/2843