這個版本沒啥太大新特性,主要對c++20 modules進行了實驗性支持,目前支持clang/msvc編譯器,除此以外改進了很多使用體驗,而且提升了一些穩定性。ios
另外,這個版本新增了socket.io支持以及對應協程io的調度支持,爲下個版本的遠程編譯,以及後續的分佈式編譯作準備。c++
c++ modules已經正式歸入了c++20草案,msvc和clang也已經基本實現了對modules-ts的支持,隨着c++20的腳步離咱們愈來愈近,xmake也開始對c++modules提早作好了支持。git
目前xmake已經徹底支持了msvc/clang的modules-ts構建實現,而對於gcc,因爲它的cxx-modules分支還在開發中,尚未正式進入master,我看了下里面的changelog,相關flags還在不斷變更,感受還沒穩定下來,所以這裏暫時還沒對其進行支持。github
關於xmake對c++modules的相關進展見:https://github.com/xmake-io/xmake/pull/569併發
關於c++modules的相關介紹我就很少說了,這邊主要仍是介紹下xmake下如何去構建c++modules項目,咱們先來看一個簡單的例子:app
target("hello") set_kind("binary") add_files("src/*.cpp", "src/*.mpp")
上面是一個支持構建c++modules文件的xmake.lua描述,其中hello.mpp
就是模塊文件:socket
#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這個接口主要用於針對target設置不一樣的編譯工具鏈,2.2.9以前的版本其實有add_tools
和set_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的傳參處理方式進行編譯。
這塊的接口初步已經實現,支持lua協程的io調度,實現高併發的io讀寫(後期還會同時支持進程、pipe的調度支持),目前主要用於xmake自身的使用,用於爲後續的遠程編譯和分佈式編譯作準備,因此暫時不開放用戶本身使用,不過等後續完善後,會開放出來,用戶也能夠在本身的插件裏面經過socket io作一些服務程序。
不過可能用戶用到的場景不是不少,畢竟xmake只是個構建工具,不多會讓用戶本身去作io通訊。
xmake project -k xmakefile
生成器~/.xmakerc.lua
配置文件,對全部本地工程生效.core.base.socket
模塊,爲下一步遠程編譯和分佈式編譯作準備。qt.application
拆分紅qt.widgetapp
和qt.quickapp
兩個構建規則set_toolchain
替代add_tools
和set_tools
,解決老接口使用歧義,提供更加易理解的設置方式xmake create
建立模板工程find_package
支持在macOS上對.tbd系統庫文件的查找-jN
風格傳參