共计 4303 个字符,预计需要花费 11 分钟才能阅读完成。
Xmake 是一个基于 Lua 的轻量级跨平台构建工具。
它十分的轻量,没有任何依赖,因为它内置了 Lua 运行时。
它应用 xmake.lua 保护我的项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对老手十分敌对,短时间内就能疾速入门,可能让用户把更多的精力集中在理论的我的项目开发上。
咱们可能应用它像 Make/Ninja 那样能够间接编译我的项目,也能够像 CMake/Meson 那样生成工程文件,另外它还有内置的包管理系统来帮忙用户解决 C/C++ 依赖库的集成应用问题。
目前,Xmake 次要用于 C/C++ 我的项目的构建,然而同时也反对其余 native 语言的构建,能够实现跟 C/C++ 进行混合编译,同时编译速度也是十分的快,能够跟 Ninja 持平。
Xmake = Build backend + Project Generator + Package Manager
- 我的项目源码
- 官网文档
- 入门课程
新个性介绍
更灵便的包扩大
当初,咱们能够通过 set_base
接口去继承一个已有的包的全副配置,而后在此基础上重写局部配置。
这通常在用户本人的我的项目中,批改 xmake-repo 官网仓库的内置包比拟有用,比方:修复改 urls,批改版本列表,装置逻辑等等。
例如,批改内置 zlib 包的 url,切到本人的 zlib 源码地址。
package("myzlib")
set_base("zlib")
set_urls("https://github.com/madler/zlib.git")
package_end()
add_requires("myzlib", {system = false, alias = "zlib"})
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("zlib")
咱们也能够用来单纯增加一个别名包。
package("onetbb")
set_base("tbb")
咱们能够通过 add_requires("onetbb")
集成装置 tbb 包,只是包名不同而已。
包治理反对工具链切换
之前,咱们限度了只能在 cross 平台下切换包装置的工具链,新版本中,咱们能够反对更多平台下,对工具链的切换。
例如:
$ xrepo install --toolchains=clang zlib
咱们能够在 linux 等平台上,疾速切换到 clang 工具链编译装置 zlib 库。
咱们也能够在 xmake.lua 的配置文件中去切换他们。
add_requires("zlib", {configs = {toolchains = "gcc-11"}})
不同的工具链装置的 zlib 包,会被别离存储在不同目录,互不烦扰,不会存在编译器差别导致的链接兼容问题。
内置的包虚拟环境
Xrepo 命令之前曾经很好的反对了包虚拟环境治理,xrepo env shell
,然而对于简单的包环境,还是须要用户本人配置一个 xmake.lua 文件,用于治理本人的包环境。
例如,咱们须要一个罕用的开发环境 shell,默认带有 cmake, python 和 vs/autoconf 等罕用的开发工具链,咱们须要本人起一个配置文件 devel.lua。
add_requires("cmake")
add_requires("python")
if is_host("linux", "bsd", "macosx") then
add_requires("pkg-config", "autoconf", "automake", "libtool")
elseif is_host("windows") then
set_toolchains("msvc")
end
而后,执行上面的命令去导入到全局配置。
$ xrepo env --add devel.lua
这样,咱们能够通过上面的命令,去加载 shell 绑定这个环境:
$ xrepo env -b devel shell
> cmake --version
cmake version 3.19.3
而在新版本中,咱们内置了一些罕用的环境,能够通过 xrepo env -l
查看:
$ xrepo env -l
- msvc
- llvm-mingw
- llvm
- mingw-w64
- devel
- python3
- depot_tools
- python2
其中 devel 也在外面,所以,咱们只须要执行 xrepo env -b devel shell
就能够带起一个 devel 开发环境,而不须要本人配置它们。
像 python, msvc 等也都是一些比拟罕用的环境,都能够间接应用。
当然,咱们也反对长期在本地创立一个 xmake.lua 来配置加载包环境,而不搁置到全局配置中去。
自定义安装包下载
咱们能够通过新增的 on_download
接口,自定义包的下载逻辑,通常用不到,应用 Xmake 的内置下载就足够了。
如果用户自建公有仓库,对包的下载有更简单的鉴权机制,非凡解决逻辑,那么能够重写外部的下载逻辑来实现。
on_download(function (package, opt)
-- download packages:urls() to opt.sourcedir
end)
opt 参数外面,能够获取到下载包的目标源码目录 opt.sourcedir
,咱们只须要从 package:urls()
获取到包地址,下载下来就能够了。
而后,依据须要,增加一些自定义的解决逻辑。另外,本人能够增加下载缓存解决等等。
ASN.1 程序构建反对
ASN.1 程序,须要借助 ASN.1 Compiler 去生成相干的 .c 文件参加我的项目编译。
而 Xmake 内置提供了 add_rules("asn1c")
规定去解决 .c
文件生成,add_requires("asn1c")
主动拉取集成 ASN.1 编译器工具。
上面是一个根底的配置例子:
add_rules("mode.debug", "mode.release")
add_requires("asn1c")
target("test")
set_kind("binary")
add_files("src/*.c")
add_files("src/*.asn1")
add_rules("asn1c")
add_packages("asn1c")
具体见 残缺例子工程。
反对全平台构建 Swift 程序
之前,Xmake 仅反对 macOS 下借助 Xcode 工具链实现对 Swift 程序的构建,新版本中,咱们也进行了改良,能够独立应用 swift 工具链,反对在 linux/windows 上构架 swift 程序,用法跟之前雷同。
反对指定符号列表导出
在之前的版本中,咱们提供了 utils.symbols.export_all
对 windows 的 dll 库实现主动的残缺符号导出。
这只管很不便,但只能反对 windows 程序,并且全量导出对生成的 dll 大小不好管制,有可能会存在不少基本不须要的外部符号被导出。
而,咱们新版本提供的 utils.symbols.export_list
规定,能够在 xmake.lua 外面间接定义导出的符号列表,例如:
target("foo")
set_kind("shared")
add_files("src/foo.c")
add_rules("utils.symbols.export_list", {symbols = {
"add",
"sub"}})
或者,在 *.export.txt
文件中增加导出的符号列表。
target("foo2")
set_kind("shared")
add_files("src/foo.c")
add_files("src/foo.export.txt")
add_rules("utils.symbols.export_list")
残缺的工程例子见:导出符号例子
通过指定符号导出,咱们能够使得生成的动静库尽可能的小,无关的外部符号齐全不去导出它们,另外这个规定反对 linux, macOS 和 windows,更加的通用。
它外部会主动应用 .def, version scripts 和 --exported_symbols_list
去解决符号导出。
内置反对 linker scripts
新版中,咱们也内置了 对 linker scripts 和 version scripts 文件的反对,咱们能够应用 add_files
间接增加它们,而不须要配置 add_ldflags("-Txxx.lds")
。
以后反对 .ld
和 .lds
作为 linker scripts 配置文件来增加:
add_rules("mode.debug", "mode.release")
target("test")
add_deps("foo")
set_kind("binary")
add_files("src/main.c")
add_files("src/main.lds")
咱们也反对 .ver
, .map
后缀文件作为 version script 来增加。
target("foo")
set_kind("shared")
add_files("src/foo.c")
add_files("src/foo.map")
foo.map 文件内容如下:
{
global:
foo;
local:
*;
};
更新内容
新个性
- #2011: 反对继承和部分批改官网包,例如对现有的包更换 urls 和 versions
- 反对在 sparc, alpha, powerpc, s390x 和 sh4 上编译运行 xmake
- 为 package() 增加 on_download 自定义下载
- #2021: 反对 Linux/Windows 下构建 Swift 程序
- #2024: 增加 asn1c 反对
- #2031: 为 add_files 减少 linker scripts 和 version scripts 反对
- #2033: 捕捉 ctrl-c 去打印以后运行栈,用于调试剖析卡死问题
- #2059: 增加
xmake update --integrate
命令去整合 shell - #2070: 增加一些内置的 xrepo env 环境配置
- #2117: 反对为任意平台传递工具链到包
- #2121: 反对导出指定的符号列表,可用于缩小动静库的大小
改良
- #2036: 改良 xrepo 反对从配置文件批量安装包,例如:
xrepo install xxx.lua
- #2039: 改良 vs generator 的 filter 目录展现
- #2025: 反对为 phony 和 headeronly 指标生成 vs 工程
- 优化 vs 和 codesign 的探测速度
- #2077: 改良 vs 工程生成器去反对 cuda
Bugs 修复
- #2005: 修复 path.extension
- #2008: 修复 windows manifest 文件编译
- #2016: 修复 vs project generator 里,对象文件名抵触导致的编译失败