1. 程式人生 > >xmake v2.3.7 釋出, 新增 tinyc 和 emscripten 工具鏈支援

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

[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