title: Xmake v3.0.6 预览版,原生 Android 应用、Flang、CUDA 13、Qt 打包 tags: [xmake, android, flang, cuda, qt, packaging, msvc, binutils] date: 2025-12-17 author: Ruki
新版本对 Android 原生应用的构建支持进行了进一步改进。我们现在可以在 android.native_app 规则中配置更多参数,包括 android_sdk_version, android_manifest, android_res, keystore 等。
此外,对于需要自定义入口和事件循环的场景(例如游戏引擎集成),我们支持通过设置 native_app_glue = false 来禁用默认的 android_native_app_glue 库。
add_rules("mode.debug", "mode.release")
add_requires("raylib 5.5.0")
target("raydemo_custom_glue")
set_kind("binary")
set_languages("c++17")
add_files("src/main.cpp", "src/android_native_app_glue.c")
add_syslinks("log")
add_packages("raylib")
add_rules("android.native_app", {
android_sdk_version = "35",
android_manifest = "android/AndroidManifest.xml",
android_res = "android/res",
keystore = "android/debug.jks",
keystore_pass = "123456",
package_name = "com.raylib.custom_glue",
native_app_glue = false, -- 禁用默认 glue
logcat_filters = {"raydemo_custom_glue", "raylib"}
})
新增的 utils.bin2obj 规则相比 utils.bin2c 具有极快的构建速度。因为它跳过了 C 代码生成和编译步骤,直接生成对象文件(COFF, ELF, Mach-O)参与链接。
性能对比 (120MB 文件):
它支持多种架构(x86, ARM, RISC-V 等)和格式(Windows COFF, Linux/Android ELF, macOS/iOS Mach-O)。
基本用法
target("myapp")
set_kind("binary")
add_rules("utils.bin2obj", {extensions = {".bin", ".ico"}})
add_files("src/*.c")
-- 嵌入 data.bin,并确保以零结尾
add_files("assets/data.bin", {zeroend = true})
在 C/C++ 中访问数据
符号名称会根据文件名自动生成(例如 _binary_<filename>_start 和 _binary_<filename>_end)。
#include <stdio.h>
#include <stdint.h>
extern const uint8_t _binary_data_bin_start[];
extern const uint8_t _binary_data_bin_end[];
int main() {
// 计算大小
const uint32_t size = (uint32_t)(_binary_data_bin_end - _binary_data_bin_start);
// 访问数据
printf("Data size: %u bytes\n", size);
for (uint32_t i = 0; i < size; i++) {
printf("%02x ", _binary_data_bin_start[i]);
}
return 0;
}
此外,glsl2spv 和 hlsl2spv 规则也新增了对 bin2obj 的支持,可以直接将编译后的 SPIR-V 文件作为对象文件嵌入。
target("test")
set_kind("binary")
add_rules("utils.glsl2spv", {bin2obj = true})
add_files("src/*.c")
add_files("src/*.vert", "src/*.frag")
Xmake 现在支持 LLVM Flang 编译器,可以更方便地构建 Fortran 项目。通常情况下,Xmake 会自动检测并使用系统中可用的 Flang 编译器。
你也可以手动指定使用 Flang 工具链:
$ xmake f --toolchain=flang
$ xmake
或者在 xmake.lua 中配置:
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.f90")
XPack 打包模块现在支持生成 Qt 部署包,以及 Linux 下的 AppImage 和 macOS 下的 dmg 格式。这使得分发跨平台 GUI 应用变得更加简单。
例如,配置一个 Qt Widget 应用的打包:
includes("@builtin/xpack")
target("qtapp")
add_rules("qt.widgetapp")
add_files("src/*.cpp")
-- ... 其他配置
xpack("qtapp")
set_formats("nsis", "dmg", "appimage", "zip")
set_title("Qt Widget App")
add_targets("qtapp")
-- 根据格式设置图标
on_load(function (package)
local scriptdir = os.scriptdir()
if package:format() == "appimage" then
package:set("iconfile", path.join(scriptdir, "src/assets/xmake.png"))
else
package:set("iconfile", path.join(scriptdir, "src/assets/xmake.ico"))
end
end)
执行打包命令:
$ xmake pack
新增 xmake check syntax 命令,用于快速检测工程源代码的语法错误。
这通常用于在 CI 流程中,快速检测代码的语法合法性,而不需要进行完整的编译链接过程,因此速度非常快。
它的内部原理是:xmake 会向编译器传递 -fsyntax-only (GCC/Clang) 或 /Zs (MSVC) 等语法检测标志。
这使得编译器仅进行语法分析,不生成目标文件,也不进行链接操作,从而极大地提升了检测速度。
$ xmake check syntax
如果有语法错误,它会报告具体的文件和行号。
我们新增了对 MSVC 的 C++ 动态调试支持(需要 MSVC 工具集 14.44+,仅支持 x64)。
它与 LTCG/PGO/OPT-ICF 不兼容。
set_policy("build.c++.dynamic_debugging", true)
我们新增了 core.base.binutils 模块以及 utils.binary 扩展模块,用于处理二进制文件。
它们提供了 bin2c, bin2obj, readsyms, deplibs, extractlib 等功能接口,可用于从二进制文件生成代码、读取符号、获取依赖库以及解压静态库等。
import("utils.binary.deplibs")
import("utils.binary.readsyms")
import("utils.binary.extractlib")
-- 获取依赖库
local deps = deplibs("/path/to/bin")
-- 读取符号
local syms = readsyms("/path/to/obj")
-- 解压静态库
extractlib("/path/to/lib.a", "/path/to/outputdir")
此外,我们还改进了依赖库解析,静态库合并用到的对象文件抽取,以及符号导出功能。
/std:c++23preview 支持bin2obj 支持bin2obj 规则(快于 bin2c)xmake check syntax 支持xrepo env 增加 session IDpackage.download.http_headers 添加类型约束get_headerunit_key