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

這個版本沒啥太大新特性,主要對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之前的版本其實有`addtoolssettools`兩個接口來處理相同的事情,不過這兩接口命名和使用上和規範不是很一致,因此做了些調整改動,用這個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.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檢測

https://tboox.org/cn/2019/12/21/xmake-update-v2.2.9/

個人主頁

個人項目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章