(筆記)如何在 CLion 上調(diào)試編譯 xmake 項目

本文用于記錄我個人在學(xué)習(xí)使用 xmake 過程中的一些使用技巧,在后續(xù)再次遇到類似問題時可以用來快速上手。因此不能保證是最好的解決方法,如果有更好的方法歡迎各位提出。

為何使用 xmake?
可以參考?xmake 作者的說法,對我來說最重要的是 xmake 擁有完整一體的包管理機制,使用 xmake 構(gòu)建的項目可以通過簡單的在命令行運行?“xmake” 來進行構(gòu)建而不需要考慮它依賴的第三方庫,并且自己需要引入第三方庫時也只需要通過在 “xmake.lua" 文件中添加 "add_requires("xxx")" 就可以自動安裝,不需要手動配置。
為何使用 CLion?
這個主要是使用習(xí)慣的原因,因為我習(xí)慣了使用 Jetbrains 系列的軟件進行開發(fā),因此如果非必要,或者其他軟件明顯更加方便,我是不會考慮改用其他軟件的。當(dāng)然也希望 xmake 能越做越好,讓 CLion 可以官方支持 xmake 項目。

原理
由于 CLion 中的 xmake 插件并不好用(是通過生成 cmake 文件來進行調(diào)試,而有很多邏輯并不能很好的生成對應(yīng)的 cmake 文件,并且當(dāng)項目大了后,并不能保證 cmake 調(diào)試通過了而 xmake 一定能通過,并且實際往往是 xmake 能通過而轉(zhuǎn)成 cmake 后會有各種各樣的問題)。這里使用生成 compile_commands 的方式來實現(xiàn)對 xmake 項目的調(diào)試。
安裝 xmake
參考官網(wǎng)(https://xmake.io/#/zh-cn/)這里不進行贅述。需要注意的是,一定要將 xmake 添加到系統(tǒng)的環(huán)境變量,也就是在命令行輸入 "xmake --version" 后,會出現(xiàn):

創(chuàng)建一個 xmake 項目
可以參考我在 github 上創(chuàng)建的例子(https://github.com/CHanzyLazer/xmake-example)以及官網(wǎng)的例子(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 文件(可能需要電腦中已經(jīng)安裝好了 VS),點擊出現(xiàn)的 “加載 編譯數(shù)據(jù)庫 項目” 即可實現(xiàn)在?clion 中添加這個項目。詳細(xì)參考下圖:



加載完成后打開 scr/main.cpp,可以發(fā)現(xiàn)代碼已經(jīng)能夠高亮了:

運行和調(diào)試
這里稍微有些復(fù)雜,需要先在 CLion 的 “文件 →?設(shè)置 →?構(gòu)建、執(zhí)行、部署?→ 自定義構(gòu)建目標(biāo)” 中添加目標(biāo),如下圖添加 xmake 的構(gòu)建和清理工具并在構(gòu)建目標(biāo)中設(shè)置好:





然后需要設(shè)置幾個全局的外部工具用于設(shè)置平臺和構(gòu)建模式(用于快速切換 release 和 debug 模式)。如下圖,在?CLion?的 “文件?→?設(shè)置?→ 工具?→ 外部工具” 中添加兩個外部工具分別用來設(shè)置當(dāng)前的模式為 release 和 debug:


最后在 clion 的右上角添加配置,設(shè)置好之前設(shè)置的構(gòu)建目標(biāo),并在構(gòu)建之前添加運行之前添加的外部工具用來設(shè)置構(gòu)建的模式。這里將 release 模式和 debug 模式分別添加了兩個配置,從而可以方便的進行切換。





添加完成后就可以直接在右上角選擇 release 或 debug 模式,直接運行項目了:




自動更新 compile_command 文件
可能會注意到,在通過右上角配置切換 release 和 debug 模式并運行后,雖然程序已經(jīng)切換了模式,但是代碼高亮并沒有切換:

需要再次在命令行中輸入??"xmake project -k compile_commands" 來重新生成?compile_commands 文件才能實現(xiàn)高亮更新:


并且也可能會希望能夠在更新 xmake.lua 文件后能夠自動更新 compile_command 文件,這里需要借助 File Watcher 這個插件來實現(xiàn)這個功能:

并且由于 xmake 在更新?compile_command 文件后會改變自己的某些配置文件,從而導(dǎo)致可能被再次檢測到修改,導(dǎo)致死循環(huán),因此需要使用外置的 .lua 文件來重新實現(xiàn)不修改自身配置文件的方式來更新?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)。
如下圖,在 “文件?→?設(shè)置?→ 工具?→ File Watcher” 中設(shè)置監(jiān)控 xmake 相關(guān)文件的變化后自動執(zhí)行?gen_cc.lua 來更新?compile_command 文件:

設(shè)置完成后就可以自動更新?compile_command 文件了。

參考:
【CLion開發(fā)編譯調(diào)試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 的設(shè)置來變化自動更新 compile_command.json 時出現(xiàn)死循環(huán)】:https://github.com/xmake-io/xmake/issues/2843