xmake v2.3.7 釋出, 新增 tinyc 和 emscripten 工具鏈支援
阿新 • • 發佈:2020-09-15
[xmake](https://github.com/xmake-io/xmake) 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護專案構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內就能快速入門,能夠讓使用者把更多的精力集中在實際的專案開發上。
隨著 xmake 最近幾年不斷的迭代發展,xmake 已經在 Github 收穫 2.9K star,300+ fork,30+ 貢獻者,並且處理了 900+ issues,5400+ Commits,活躍使用者也在不斷增長。
![](https://tboox.org/static/img/xmake/star-history.png)
現在,xmake v2.3.7 版本釋出了,在新版本中,我們主要完善了 xmake 自身的穩定性和相容性,通過兩個月的不斷迭代,修復了很多使用者反饋的各種使用問題,使用體驗和穩定性有了很大的提升。
另外,我們在這個版本中也新增對 TinyC 和 Emscripten (WebAssembly) 編譯工具鏈的支援。
尤其是針對 windows 平臺,我們提供了額外的 xmake-tinyc 安裝包,裡面內建了 tinyc 編譯器,使得使用者可以完全脫離臃腫的 vs 環境,一鍵安裝,開箱即用,只需要 5M 的安裝包即可開發簡單的 C 程式,同時還自帶了整套 winapi 標頭檔案。
最後,我們還改進了 trybuild 模式編譯,通過 xmake 可以快速編譯 autotools/cmake 維護的第三方專案,並且可以快速對接 android/ios/mingw等交叉編譯環境,實現快速移植編譯。
* [專案原始碼](https://github.com/xmake-io/xmake)
* [官方文件](https://xmake.io/#/zh-cn/)
## 新特性介紹
### 更加多樣的安裝方式
新版本中,我們將 xmake 安裝包提交到了 windows winget 以及 ubuntu ppa 倉庫,我們可以更加方便快捷地安裝 xmake。
#### Winget 安裝
```bash
winget install
```
#### Ubuntu PPA 安裝
```bash
sudo add-apt-repository ppa:xmake-io/xmake
sudo apt update
sudo apt install xmake
```
當然,我們還支援很多其他的安裝方式,對於其他平臺的詳細安裝方式見:[安裝文件](https://xmake.io/#/zh-cn/guide/installation)。
### 更加豐富的工具鏈支援
當前我們已經支援非常多的工具鏈環境,而在這個版本中,我們又新增了 TinyC 和 Emscripten (WebAssembly) 編譯工具鏈的支援,我們可以通過下面的命令快速切換到對應的工具鏈來編譯。
```bash
xmake f --toolchain=[tinyc|emscripten]
xmake
```
我們還在新版本中,額外提供了兩個安裝包,內建集成了 TinyC 編譯環境,整個安裝包只需要 5M,還包含了 winsdk api。
通過這個安裝包,我們編譯開發 C 程式就可以完全擺脫臃腫的 vs 開發環境(好幾個 G),實現一鍵安裝,開箱即用,對於我們平常刷刷 leetcode,寫點 C 測試程式碼還是非常有用的,沒必要為此特定安裝整個 vs 進來。
另外,如果我們要檢視 xmake 支援的所有工具鏈,可以執行下面的命令,另外 `xmake f -p cross --sdk=/xxx` 的編譯配置可以支援更多通用的交叉工具鏈。
```bash
$ 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 這一個命令就可以完成編譯,例如:
```bash
$ 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 平臺得這樣搞:
```bash
$ 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 程式:
```bash
xmake f -p android --trybuild=cmake --ndk=/xxx
xmake
```
編譯 ios 程式:
```bash
xmake f -p iphoneos --trybuild=cmake
xmake
```
編譯 mingw 程式:
```bash
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 等工具了,例如:
```bash
xmake f -p iphoneos
xmake
```
或者
```bash
xmake f -p android --ndk=/xxx
xmake
```
可以看到,這回我們省去了 `--trybuild=cmake` 引數,因為不需要了,我們是直接編譯的,這個時候 xmake 相當於獨立的 make/ninja,並且完全不依賴 make,編譯速度也可以完全媲美 ninja。
### 改進遠端依賴包的整合
#### 交叉編譯支援
xmake 不僅對 trybuild 支援了 mingw/autotools 的交叉編譯支援,還對遠端包倉庫中使用 cmake/autotools 維護的第三方也支援上了交叉編譯安裝和整合。
例如:
```lua
add_requires("pcre2")
target("test")
set_kind("binary")
add_files("src/*.cpp")
add_packages("pcre2")
```
然後通過切換到 iphoneos 平臺,就可以快速整合安裝 iphoneos 平臺的 pcre2 包,然後編譯連結它,哪怕這個 pcre2 包是通過 autotools/cmake 維護的。
```bash
xmake f -p iphoneos
xmake
```
#### 私有網路包倉庫
這個版本中,我們對遠端依賴包的整合也稍微做了一些改進,比如可以通過配置 `xmake g --network=private` 切到私有網路模式。
這個主要用於一些公司內部網路通過 xmake 自建的包管理倉庫,實現封閉式的 C/C++ 依賴包整合,完全不會從 xmake 提供的官方倉庫下來依賴包。
#### 遞迴匯出安裝的包
xmake 之前提供了一個命令,可以匯出通過 xmake 安裝的所有第三方依賴包。
```bash
xmake require --export
```
但是,之前的版本對應一些存在依賴的包,匯出時候只會匯出自身,它的所有依賴是不會被匯出的,而這個版本中,我們對其進行了改進,將對應的所有依賴包也進行了匯出。
### 改進對 Qt SDK 環境的支援
另外,這個版本我們還對 Qt SDK 的工具鏈環境進行了更好的支援,比如 ubuntu 系統下通過 apt 命令安裝的 Qt SDK 工具鏈也進行了支援,而之前的版本只能支援從 Qt 官網下載安裝的 Qt SDK 環境。
## 更新內容
### 新特性
* [#2941](https://github.com/microsoft/winget-pkgs/pull/2941): 支援通過 winget 來安裝 xmake
* 新增 xmake-tinyc 安裝包,內建tinyc編譯器,支援windows上無msvc環境也可直接編譯c程式碼
* 新增 tinyc 編譯工具鏈
* 新增 emcc (emscripten) 編譯工具鏈去編譯 asm.js 和 WebAssembly
* [#947](https://github.com/xmake-io/xmake/issues/947): 通過 `xmake g --network=private` 配置設定私有網路模式,避免遠端依賴包下載訪問外網導致編譯失敗
### 改進
* [#907](https://github.com/xmake-io/xmake/issues/907): 改進msvc的連結器優化選項,生成更小的可執行程式
* 改進ubuntu下Qt環境的支援
* [#918](https://github.com/xmake-io/xmake/pull/918): 改進cuda11工具鏈的支援
* 改進Qt支援,對通過 ubuntu/apt 安裝的Qt sdk也進行了探測支援,並且檢測效率也優化了下
* 改進 CMake 工程檔案生成器
* [#931](https://github.com/xmake-io/xmake/issues/931): 改進匯出包,支援匯出所有依賴包
* [#930](https://github.com/xmake-io/xmake/issues/930): 如果私有包定義沒有版本定義,支援直接嘗試下載包
* [#927](https://github.com/xmake-io/xmake/issues/927): 改進android ndk,支援arm/thumb指令模式切換
* 改進 trybuild/cmake 支援 Android/Mingw/iPhoneOS/WatchOS 工具鏈
### Bugs修復
* [#903](https://github.com/xmake-io/xmake/issues/903): 修復vcpkg包安裝失敗問題
* [#912](https://github.com/xmake-io/xmake/issues/912): 修復自定義工具鏈
* [#914](https://github.com/xmake-io/xmake/issues/914): 修復部分aarch64裝置上執行lua出現bad light userdata point