XMake基于 Lua 的跨平台构建工具
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
虽然,简单易用是 xmake 的一大特色,但 xmake 的功能也是非常强大的,既能够像 Make/Ninja 那样可以直接编译项目,也可以像 CMake/Meson 那样生成工程文件,还有内置的包管理系统来帮助用户解决 C/C++依赖库的集成使用问题。
目前,xmake主要用于C/C++项目的构建,但是同时也支持其他native语言的构建,可以实现跟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
构建工程
$ xmake
运行目标
$ xmake run console
调试程序
$ xmake run -d console
配置平台
$ xmake f -p [windows|linux|macosx|android|iphoneos ..] -a [x86|arm64 ..] -m [debug|release]
$ xmake
图形化菜单配置
$ xmake f --menu
跟ninja一样快的构建速度
测试工程: xmake-core
多任务并行编译测试
| 构建系统 | Termux (8core/-j12) | 构建系统 | 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 |
单任务编译测试
| 构建系统 | Termux (-j1) | 构建系统 | 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 |
包依赖管理
下载和编译
架构和流程
支持的包管理仓库
- 官方自建仓库 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/bytes@0.0.4)
- 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)
支持特性
- 简洁的配置语法
- 直接构建支持,不依赖任何第三方后端 make 工具
- 跨平台支持,不同平台可方便快速地切换
- 交叉编译支持,智能分析交叉工具链信息
- 多任务并行编译支持
- C++20 Module-TS 支持
- 支持跨平台的 C/C++ 依赖包快速集成
- 自建分布式包仓库,第三方包仓库支持
- 多语言混合编译支持
- 灵活的 lua 脚本,丰富的扩展模块,可实现高度定制化
- 丰富的插件支持,内置 vs/cmake/makefile/compile_commands 等生成插件
- REPL 交互式执行支持
- 增量编译支持,头文件依赖自动分析
- 工具链的快速切换、定制化支持
工程类型
- 静态库程序
- 动态库类型
- 控制台程序
- Cuda程序
- Qt应用程序
- WDK驱动程序
- WinSDK应用程序
- MFC应用程序
- iOS/MacOS应用程序
- 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 应用程序
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 驱动程序
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驱动程序例子(umdf/kmdf/wdm),见:WDK工程例子
iOS/MacOS 应用程序
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
}
更多内置插件见相关文档:内置插件文档
其他扩展插件,请到插件仓库进行下载安装: 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插件被应用生效后,xmakeBuild任务会自动注入到现有的assemble任务中去,自动执行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
评论
