xmake v2.3.7 釋出, 新增 tinyc 和 emscripten 工具鏈支援

waruqi發表於2020-09-15

xmake 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護專案構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內就能快速入門,能夠讓使用者把更多的精力集中在實際的專案開發上。

隨著 xmake 最近幾年不斷的迭代發展,xmake 已經在 Github 收穫 2.9K star,300+ fork,30+ 貢獻者,並且處理了 900+ issues,5400+ Commits,活躍使用者也在不斷增長。

現在,xmake v2.3.7 版本釋出了,在新版本中,我們主要完善了 xmake 自身的穩定性和相容性,通過兩個月的不斷迭代,修復了很多使用者反饋的各種使用問題,使用體驗和穩定性有了很大的提升。

另外,我們在這個版本中也新增對 TinyC 和 Emscripten (WebAssembly) 編譯工具鏈的支援。

尤其是針對 windows 平臺,我們提供了額外的 xmake-tinyc 安裝包,裡面內建了 tinyc 編譯器,使得使用者可以完全脫離臃腫的 vs 環境,一鍵安裝,開箱即用,只需要 5M 的安裝包即可開發簡單的 C 程式,同時還自帶了整套 winapi 標頭檔案。

最後,我們還改進了 trybuild 模式編譯,通過 xmake 可以快速編譯 autotools/cmake 維護的第三方專案,並且可以快速對接 android/ios/mingw等交叉編譯環境,實現快速移植編譯。

新特性介紹

更加多樣的安裝方式

新版本中,我們將 xmake 安裝包提交到了 windows winget 以及 ubuntu ppa 倉庫,我們可以更加方便快捷地安裝 xmake。

Winget 安裝

winget install

Ubuntu PPA 安裝

sudo add-apt-repository ppa:xmake-io/xmake
sudo apt update
sudo apt install xmake

當然,我們還支援很多其他的安裝方式,對於其他平臺的詳細安裝方式見:安裝文件

更加豐富的工具鏈支援

當前我們已經支援非常多的工具鏈環境,而在這個版本中,我們又新增了 TinyC 和 Emscripten (WebAssembly) 編譯工具鏈的支援,我們可以通過下面的命令快速切換到對應的工具鏈來編譯。

xmake f --toolchain=[tinyc|emscripten]
xmake

我們還在新版本中,額外提供了兩個安裝包,內建整合了 TinyC 編譯環境,整個安裝包只需要 5M,還包含了 winsdk api。

通過這個安裝包,我們編譯開發 C 程式就可以完全擺脫臃腫的 vs 開發環境(好幾個 G),實現一鍵安裝,開箱即用,對於我們平常刷刷 leetcode,寫點 C 測試程式碼還是非常有用的,沒必要為此特定安裝整個 vs 進來。

另外,如果我們要檢視 xmake 支援的所有工具鏈,可以執行下面的命令,另外 xmake f -p cross --sdk=/xxx 的編譯配置可以支援更多通用的交叉工具鏈。

$ xmake show -l toolchains
xcode         Xcode IDE
vs            VisualStudio IDE
yasm          The Yasm Modular Assembler
clang         A C language family frontend for LLVM
go            Go Programming Language Compiler
dlang         D Programming Language Compiler
gfortran      GNU Fortran Programming Language Compiler
zig           Zig Programming Language Compiler
sdcc          Small Device C Compiler
cuda          CUDA Toolkit
ndk           Android NDK
rust          Rust Programming Language Compiler
llvm          A collection of modular and reusable compiler and toolchain technologies
cross         Common cross compilation toolchain
nasm          NASM Assembler
gcc           GNU Compiler Collection
mingw         Minimalist GNU for Windows
gnu-rm        GNU Arm Embedded Toolchain
envs          Environment variables toolchain
fasm          Flat Assembler
tinyc         Tiny C Compiler
emcc          A toolchain for compiling to asm.js and WebAssembly

TryBuild 編譯模式改進

所謂 trybuild 模式,就是 xmake 推出的一個適配現有第三方構建系統的特性,因為現在大部分已有的第三方專案都是用 autotools/cmake 等第三方構建系統維護的,如果將它們遷移到 xmake 配置那麼遷移成本還是比較高的。

雖然 xmake 的配置編寫非常簡單上手,但也沒必要對已經穩定維護的專案去大改構建系統,xmake 主要還是用於一些新專案的構建維護。

基於此背景,xmake 採用 trybuild 編譯模式,也就是所謂的嘗試編譯模式,通過自動探測第三方專案的構建系統,如果檢測到是 autotools 維護的專案,那麼自動呼叫 ./configure; make 來編譯。

如果檢測到是用 cmake 維護的專案,那麼自動呼叫 cmake 來生成 makefile/build.ninja 來編譯,對於使用 xmake 的使用者而言,始終只是執行 xmake 這一個命令就可以完成編譯,例如:

$ xmake
note: configure found, try building it or you can run `xmake f --trybuild=` to set buildsystem (pass -y or --confirm=y/n/d to skip confirm)?
please input: y (y/n)
y
  ...
  CC       src/pcre2grep-pcre2grep.o
  CC       src/libpcre2_8_la-pcre2_auto_possess.lo
  CC       src/libpcre2_8_la-pcre2_config.lo
  ...
build ok!

xmake檢測到 autotools 構建系統後,就會提示使用者是否需要嘗試呼叫 autotools 來編譯,輸入y確認後,就可以直接完成編譯,對於 cmake 的專案也是,只需要執行相同的 xmake 命令即可。

而不需要關心 autotools/cmake 需要如何去配置使用和編譯,畢竟 cmake 對於 windows 和 linux 平臺,需要生成不同的構建檔案,編譯方式也是不同的,一會呼叫 make,一會呼叫 msbuild,看著就頭大。

不僅如此,xmake 還對接了 xmake -r 來直接重新編譯,對接 xmake clean 實現統一的檔案清理,對接 xmake -v 實現統一的詳細編譯命令的檢視。

TryBuild 的交叉編譯支援

如果只是當前主機平臺的編譯,也許你們會說,這有啥,cmake 也有 cmake --build . 來直接編譯,並不怎麼麻煩麼。

那麼問題來了,交叉編譯怎麼搞?如果你們用過 autotools/cmake 去交叉編譯生成 mingw/android/ios 的目標程式,cmake 和 autotools 還能夠簡單一致的處理麼?

autotools 不多說,反正我是對它的交叉體驗是深惡痛絕的,每次交叉編譯移植一個帶有 autotools 專案的程式碼,都要折騰半天,經常要包各種錯誤,研究各種配置引數的傳遞,不同平臺的配置還不同。

而 cmake 我感覺用起來也不省事,比如對於 Android 平臺得這樣搞:

$ cmake \
    -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=$ABI \
    -DANDROID_NATIVE_API_LEVEL=$MINSDKVERSION \
    $OTHER_ARGS

而對於 ios 平臺,沒找到簡答的配置方式,就找到個第三方的 ios 工具鏈配置,很複雜:https://github.com/leetal/ios-cmake/blob/master/ios.toolchain.cmake

對於 mingw 又是另外一種方式,我又折騰了半天環境,很是折騰。

那如果使用 xmake 去對接 cmake 實現交叉編譯呢,只需要這樣。

編譯 android 程式:

xmake f -p android --trybuild=cmake --ndk=/xxx
xmake

編譯 ios 程式:

xmake f -p iphoneos --trybuild=cmake
xmake

編譯 mingw 程式:

xmake f -p mingw --trybuild=cmake --mingw=/sdk/xxx
xmake

我們只需要配置的時候,通過 --trybuild=cmake 啟用 cmake 的嘗試編譯模式,然後通過 -p android/iphoneos/mingw 切到對應的平臺,對接對應的sdk,就可以使用相同的方式來快速實現交叉編譯,哪怕這個專案是使用 cmake 來維護的。

使用者不需要關係如果使用 cmake 去傳遞不同工具鏈的配置,xmake 都幫你自動處理了,你只需要簡單的執行 xmake 來編譯,也可以執行 xmake -r 來重編,或者檢視編譯詳情 xmake -v

另外,還可以通過 xmake f -p iphoneos -a arm64 --trybuild=cmake 快速的切換編譯架構。

最後,我們需要說明的是,雖然 trybuild 模式可以極大幫助使用者節省編譯和配置操作,但是如果條件執行,我們還是希望大家能夠直接使用 xmake.lua 來維護自己的專案。

這樣,就不需要走 trybuild 編譯了,xmake 會更加完美的支援交叉編譯,因為內部 xmake 會直接去編譯專案,而不需要在呼叫 cmake、autotools 等工具了,例如:

xmake f -p iphoneos
xmake

或者

xmake f -p android --ndk=/xxx
xmake

可以看到,這回我們省去了 --trybuild=cmake 引數,因為不需要了,我們是直接編譯的,這個時候 xmake 相當於獨立的 make/ninja,並且完全不依賴 make,編譯速度也可以完全媲美 ninja。

改進遠端依賴包的整合

交叉編譯支援

xmake 不僅對 trybuild 支援了 mingw/autotools 的交叉編譯支援,還對遠端包倉庫中使用 cmake/autotools 維護的第三方也支援上了交叉編譯安裝和整合。

例如:

add_requires("pcre2")

target("test")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("pcre2")

然後通過切換到 iphoneos 平臺,就可以快速整合安裝 iphoneos 平臺的 pcre2 包,然後編譯連結它,哪怕這個 pcre2 包是通過 autotools/cmake 維護的。

xmake f -p iphoneos
xmake

私有網路包倉庫

這個版本中,我們對遠端依賴包的整合也稍微做了一些改進,比如可以通過配置 xmake g --network=private 切到私有網路模式。

這個主要用於一些公司內部網路通過 xmake 自建的包管理倉庫,實現封閉式的 C/C++ 依賴包整合,完全不會從 xmake 提供的官方倉庫下來依賴包。

遞迴匯出安裝的包

xmake 之前提供了一個命令,可以匯出通過 xmake 安裝的所有第三方依賴包。

xmake require --export

但是,之前的版本對應一些存在依賴的包,匯出時候只會匯出自身,它的所有依賴是不會被匯出的,而這個版本中,我們對其進行了改進,將對應的所有依賴包也進行了匯出。

改進對 Qt SDK 環境的支援

另外,這個版本我們還對 Qt SDK 的工具鏈環境進行了更好的支援,比如 ubuntu 系統下通過 apt 命令安裝的 Qt SDK 工具鏈也進行了支援,而之前的版本只能支援從 Qt 官網下載安裝的 Qt SDK 環境。

更新內容

新特性

  • #2941: 支援通過 winget 來安裝 xmake
  • 新增 xmake-tinyc 安裝包,內建tinyc編譯器,支援windows上無msvc環境也可直接編譯c程式碼
  • 新增 tinyc 編譯工具鏈
  • 新增 emcc (emscripten) 編譯工具鏈去編譯 asm.js 和 WebAssembly
  • #947: 通過 xmake g --network=private 配置設定私有網路模式,避免遠端依賴包下載訪問外網導致編譯失敗

改進

  • #907: 改進msvc的連結器優化選項,生成更小的可執行程式
  • 改進ubuntu下Qt環境的支援
  • #918: 改進cuda11工具鏈的支援
  • 改進Qt支援,對通過 ubuntu/apt 安裝的Qt sdk也進行了探測支援,並且檢測效率也優化了下
  • 改進 CMake 工程檔案生成器
  • #931: 改進匯出包,支援匯出所有依賴包
  • #930: 如果私有包定義沒有版本定義,支援直接嘗試下載包
  • #927: 改進android ndk,支援arm/thumb指令模式切換
  • 改進 trybuild/cmake 支援 Android/Mingw/iPhoneOS/WatchOS 工具鏈

Bugs修復

  • #903: 修復vcpkg包安裝失敗問題
  • #912: 修復自定義工具鏈
  • #914: 修復部分aarch64裝置上執行lua出現bad light userdata pointer問題

相關文章