xmake 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護項目構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手很是友好,短期內就能快速入門,可以讓用戶把更多的精力集中在實際的項目開發上。linux
隨着 xmake 最近幾年不斷的迭代發展,xmake 已經在 Github 收穫 2.9K star,300+ fork,30+ 貢獻者,而且處理了 900+ issues,5400+ Commits,活躍用戶也在不斷增加。android
如今,xmake v2.3.7 版本發佈了,在新版本中,咱們主要完善了 xmake 自身的穩定性和兼容性,經過兩個月的不斷迭代,修復了不少用戶反饋的各類使用問題,使用體驗和穩定性有了很大的提高。ios
另外,咱們在這個版本中也新增對 TinyC 和 Emscripten (WebAssembly) 編譯工具鏈的支持。git
尤爲是針對 windows 平臺,咱們提供了額外的 xmake-tinyc 安裝包,裏面內置了 tinyc 編譯器,使得用戶能夠徹底脫離臃腫的 vs 環境,一鍵安裝,開箱即用,只須要 5M 的安裝包便可開發簡單的 C 程序,同時還自帶了整套 winapi 頭文件。github
最後,咱們還改進了 trybuild 模式編譯,經過 xmake 能夠快速編譯 autotools/cmake 維護的第三方項目,而且能夠快速對接 android/ios/mingw等交叉編譯環境,實現快速移植編譯。ubuntu
新版本中,咱們將 xmake 安裝包提交到了 windows winget 以及 ubuntu ppa 倉庫,咱們能夠更加方便快捷地安裝 xmake。windows
winget install
複製代碼
sudo add-apt-repository ppa:xmake-io/xmake
sudo apt update
sudo apt install xmake
複製代碼
固然,咱們還支持不少其餘的安裝方式,對於其餘平臺的詳細安裝方式見:安裝文檔。api
當前咱們已經支持很是多的工具鏈環境,而在這個版本中,咱們又新增了 TinyC 和 Emscripten (WebAssembly) 編譯工具鏈的支持,咱們能夠經過下面的命令快速切換到對應的工具鏈來編譯。xcode
xmake f --toolchain=[tinyc|emscripten]
xmake
複製代碼
咱們還在新版本中,額外提供了兩個安裝包,內置集成了 TinyC 編譯環境,整個安裝包只須要 5M,還包含了 winsdk api。bash
經過這個安裝包,咱們編譯開發 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 模式,就是 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
實現統一的詳細編譯命令的查看。
若是隻是當前主機平臺的編譯,也許大家會說,這有啥,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 工具鏈配置,很複雜:github.com/leetal/ios-…
對於 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 的工具鏈環境進行了更好的支持,好比 ubuntu 系統下經過 apt 命令安裝的 Qt SDK 工具鏈也進行了支持,而以前的版本只能支持從 Qt 官網下載安裝的 Qt SDK 環境。
xmake g --network=private
配置設置私有網絡模式,避免遠程依賴包下載訪問外網致使編譯失敗