這個版本沒啥太大新特性,主要對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接口改動
settoolchain這個接口主要用於針對target設置不同的編譯工具鏈,2.2.9之前的版本其實有`addtools和
settools`兩個接口來處理相同的事情,不過這兩接口命名和使用上和規範不是很一致,因此做了些調整改動,用這個settoolchain新接口更好的設置工具鏈。
對於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.widgetapp
和qt.quickapp
兩個構建規則 - #576: 使用
set_toolchain
替代add_tools
和set_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檢測
https://tboox.org/cn/2019/12/21/xmake-update-v2.2.9/