xmake v2.2.9 發佈, 新增c++20 modules的實驗性支持

這個版本沒啥太大新特性,主要對c++20 modules進行了實驗性支持,目前支持clang/msvc編譯器,除此以外改進了很多使用體驗,而且提升了一些穩定性。ios

另外,這個版本新增了socket.io支持以及對應協程io的調度支持,爲下個版本的遠程編譯,以及後續的分佈式編譯作準備。c++

新特性介紹

c++20 modules

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併發

Hello Module

關於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接口改動

set_toolchain這個接口主要用於針對target設置不一樣的編譯工具鏈,2.2.9以前的版本其實有add_toolsset_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.widgetappqt.quickapp兩個構建規則
  • #576: 使用set_toolchain替代add_toolsset_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檢測
相關文章
相關標籤/搜索