XMake基于 Lua 的跨平臺構(gòu)建工具
xmake 是一個基于 Lua 的輕量級跨平臺構(gòu)建工具,使用 xmake.lua 維護項目構(gòu)建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內(nèi)就能快速入門,能夠讓用戶把更多的精力集中在實際的項目開發(fā)上。
雖然,簡單易用是 xmake 的一大特色,但 xmake 的功能也是非常強大的,既能夠像 Make/Ninja 那樣可以直接編譯項目,也可以像 CMake/Meson 那樣生成工程文件,還有內(nèi)置的包管理系統(tǒng)來幫助用戶解決 C/C++依賴庫的集成使用問題。
目前,xmake主要用于C/C++項目的構(gòu)建,但是同時也支持其他native語言的構(gòu)建,可以實現(xiàn)跟C/C++進行混合編譯,同時編譯速度也是非常的快,可以跟Ninja持平。
如果你想要了解更多,請參考:在線文檔, Github以及Gitee
課程
xmake 官方也推出了一些入門課程,帶你一步步快速上手 xmake,課程列表如下:
安裝
使用curl
bash <(curl -fsSL https://xmake.io/shget.text)
使用wget
bash <(wget https://xmake.io/shget.text -O -)
使用powershell
Invoke-Expression (Invoke-Webrequest 'https://xmake.io/psget.text' -UseBasicParsing).Content
簡單的工程描述
包依賴描述
官方的xmake包管理倉庫: xmake-repo
構(gòu)建工程
$ xmake
運行目標
$ xmake run console
調(diào)試程序
$ xmake run -d console
配置平臺
$ xmake f -p [windows|linux|macosx|android|iphoneos ..] -a [x86|arm64 ..] -m [debug|release] $ xmake
圖形化菜單配置
$ xmake f --menu
跟ninja一樣快的構(gòu)建速度
測試工程: xmake-core
多任務(wù)并行編譯測試
| 構(gòu)建系統(tǒng) | Termux (8core/-j12) | 構(gòu)建系統(tǒng) | MacOS (8core/-j12) |
|---|---|---|---|
| xmake | 24.890s | xmake | 12.264s |
| ninja | 25.682s | ninja | 11.327s |
| cmake(gen+make) | 5.416s+28.473s | cmake(gen+make) | 1.203s+14.030s |
| cmake(gen+ninja) | 4.458s+24.842s | cmake(gen+ninja) | 0.988s+11.644s |
單任務(wù)編譯測試
| 構(gòu)建系統(tǒng) | Termux (-j1) | 構(gòu)建系統(tǒng) | MacOS (-j1) |
|---|---|---|---|
| xmake | 1m57.707s | xmake | 39.937s |
| ninja | 1m52.845s | ninja | 38.995s |
| cmake(gen+make) | 5.416s+2m10.539s | cmake(gen+make) | 1.203s+41.737s |
| cmake(gen+ninja) | 4.458s+1m54.868s | cmake(gen+ninja) | 0.988s+38.022s |
包依賴管理
下載和編譯
架構(gòu)和流程
支持的包管理倉庫
- 官方自建倉庫 xmake-repo (tbox >1.6.1)
- 官方包管理器 Xrepo
- 用戶自建倉庫
- Conan (conan::openssl/1.1.1g)
- Vcpkg (vcpkg:ffmpeg)
- Homebrew/Linuxbrew (brew::pcre2/libpcre2-8)
- Pacman on archlinux/msys2 (pacman::libcurl)
- Clib (clib::clibs/[email protected])
- Dub (dub::log 0.4.3)
支持平臺
- Windows (x86, x64)
- macOS (i386, x86_64, arm64)
- Linux (i386, x86_64, cross-toolchains ..)
- *BSD (i386, x86_64)
- Android (x86, x86_64, armeabi, armeabi-v7a, arm64-v8a)
- iOS (armv7, armv7s, arm64, i386, x86_64)
- WatchOS (armv7k, i386)
- MSYS (i386, x86_64)
- MinGW (i386, x86_64, arm, arm64)
- Cygwin (i386, x86_64)
- Wasm (wasm32)
- Cross (cross-toolchains ..)
支持工具鏈
$ 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 icc Intel C/C++ Compiler ifort Intel Fortran Compiler musl The musl-based cross-compilation toolchains
支持語言
- C/C++
- Objc/Objc++
- Swift
- Assembly
- Golang
- Rust
- Dlang
- Fortran
- Cuda
- Zig (Experimental)
支持特性
- 簡潔的配置語法
- 直接構(gòu)建支持,不依賴任何第三方后端 make 工具
- 跨平臺支持,不同平臺可方便快速地切換
- 交叉編譯支持,智能分析交叉工具鏈信息
- 多任務(wù)并行編譯支持
- C++20 Module-TS 支持
- 支持跨平臺的 C/C++ 依賴包快速集成
- 自建分布式包倉庫,第三方包倉庫支持
- 多語言混合編譯支持
- 靈活的 lua 腳本,豐富的擴展模塊,可實現(xiàn)高度定制化
- 豐富的插件支持,內(nèi)置 vs/cmake/makefile/compile_commands 等生成插件
- REPL 交互式執(zhí)行支持
- 增量編譯支持,頭文件依賴自動分析
- 工具鏈的快速切換、定制化支持
工程類型
- 靜態(tài)庫程序
- 動態(tài)庫類型
- 控制臺程序
- Cuda程序
- Qt應(yīng)用程序
- WDK驅(qū)動程序
- WinSDK應(yīng)用程序
- MFC應(yīng)用程序
- iOS/MacOS應(yīng)用程序
- Framework和Bundle程序(iOS/MacOS)
更多例子
Debug 和 Release模式
add_rules("mode.debug", "mode.release") target("console") set_kind("binary") add_files("src/*.c") if is_mode("debug") then add_defines("DEBUG") end
自定義腳本
target("test") set_kind("binary") add_files("src/*.c") after_build(function (target) print("hello: %s", target:name()) os.exec("echo %s", target:targetfile()) end)
依賴包自動集成
下載和使用在 xmake-repo 和第三方包倉庫的依賴包:
add_requires("tbox >1.6.1", "libuv master", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8") add_requires("conan::openssl/1.1.1g", {alias = "openssl", optional = true, debug = true}) target("test") set_kind("binary") add_files("src/*.c") add_packages("tbox", "libuv", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8", "openssl")
另外,我們也可以使用 xrepo 命令來快速安裝依賴包。
Qt QuickApp 應(yīng)用程序
target("test") add_rules("qt.quickapp") add_files("src/*.cpp") add_files("src/qml.qrc")
Cuda 程序
target("test") set_kind("binary") add_files("src/*.cu") add_cugencodes("native") add_cugencodes("compute_35")
WDK/UMDF 驅(qū)動程序
target("echo") add_rules("wdk.driver", "wdk.env.umdf") add_files("driver/*.c") add_files("driver/*.inx") add_includedirs("exe") target("app") add_rules("wdk.binary", "wdk.env.umdf") add_files("exe/*.cpp")
更多WDK驅(qū)動程序例子(umdf/kmdf/wdm),見:WDK工程例子
iOS/MacOS 應(yīng)用程序
target("test") add_rules("xcode.application") add_files("src/*.m", "src/**.storyboard", "src/*.xcassets") add_files("src/Info.plist")
Framework 和 Bundle 程序(iOS/MacOS)
target("test") add_rules("xcode.framework") -- 或者 xcode.bundle add_files("src/*.m") add_files("src/Info.plist")
OpenMP 程序
add_requires("libomp", {optional = true}) target("loop") set_kind("binary") add_files("src/*.cpp") add_rules("c++.openmp") add_packages("libomp")
插件
生成IDE工程文件插件(makefile, vs2002 - vs2019, ...)
$ xmake project -k vsxmake -m "debug;release" # 新版vs工程生成插件(推薦) $ xmake project -k vs -m "debug;release" $ xmake project -k cmake $ xmake project -k ninja $ xmake project -k compile_commands
加載自定義lua腳本插件
$ xmake l ./test.lua $ xmake l -c "print('hello xmake!')" $ xmake l lib.detect.find_tool gcc $ xmake l > print("hello xmake!") > {1, 2, 3} < { 1, 2, 3 }
更多內(nèi)置插件見相關(guān)文檔:內(nèi)置插件文檔
其他擴展插件,請到插件倉庫進行下載安裝: xmake-plugins.
IDE和編輯器插件
XMake Gradle插件 (JNI)
我們也可以在Gradle中使用xmake-gradle插件來集成編譯JNI庫
plugins {
id 'org.tboox.gradle-xmake-plugin' version '1.0.6'
}
android {
externalNativeBuild {
xmake {
path "jni/xmake.lua"
}
}
}
當gradle-xmake-plugin插件被應(yīng)用生效后,xmakeBuild任務(wù)會自動注入到現(xiàn)有的assemble任務(wù)中去,自動執(zhí)行jni庫編譯和集成。
$ ./gradlew app:assembleDebug > Task :nativelib:xmakeConfigureForArm64 > Task :nativelib:xmakeBuildForArm64 >> xmake build [ 50%]: ccache compiling.debug nativelib.cc [ 75%]: linking.debug libnativelib.so [100%]: build ok! >> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/arm64-v8a > Task :nativelib:xmakeConfigureForArmv7 > Task :nativelib:xmakeBuildForArmv7 >> xmake build [ 50%]: ccache compiling.debug nativelib.cc [ 75%]: linking.debug libnativelib.so [100%]: build ok! >> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/armeabi-v7a > Task :nativelib:preBuild > Task :nativelib:assemble > Task :app:assembleDebug
