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
配置设置私有网络模式,避免远程依赖包下载访问外网致使编译失败