這個版本沒啥太大新特性,主要對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接口改動
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的傳參處理方式進行編譯。
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
風格傳參