Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持( 四 )


为特定编译器添加 flags使用 add_cflags, add_cxxflags 等接口配置的值,通常都是跟编译器相关的,尽管 Xmake 也提供了自动检测和映射机制,即使设置了当前编译器不支持的 flags,Xmake 也能够自动忽略它,但是还是会有警告提示 。
新版本中,我们改进了所有 flags 添加接口,可以仅仅对特定编译器指定 flags,来避免额外的警告,例如:
add_cxxflags("clang::-stdlib=libc++")add_cxxflags("gcc::-stdlib=libc++")或者:
add_cxxflags("-stdlib=libc++", {tools = "clang"})add_cxxflags("-stdlib=libc++", {tools = "gcc"})注:不仅仅是编译flags,对 add_ldflags 等链接 flags,也是同样生效的 。
renderdoc 调试器支持感谢 @SirLynix 贡献了这个很棒的特性,它可以让 Xmake 直接加载 renderdoc 去调试一些图形渲染程序 。
使用非常简单,我们先确保安装了 renderdoc,然后配置调试器为 renderdoc,加载调试运行:
$ xmake f --debugger=renderdoc$ xmake run -d具体使用效果如下:

Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持

文章插图
新增 C++ 异常接口配置Xmake 新增了一个 set_exceptions 抽象化配置接口,我们可以通过这个配置,配置启用和禁用 C++/Objc 的异常 。
通常,如果我们通过 add_cxxflags 接口去配置它们,需要根据不同的平台,编译器分别处理它们,非常繁琐 。
例如:
on_config(function (target)if (target:has_tool("cxx", "cl")) thentarget:add("cxflags", "/EHsc", {force = true})target:add("defines", "_HAS_EXCEPTIONS=1", {force = true})elseif(target:has_tool("cxx", "clang") or target:has_tool("cxx", "clang-cl")) thentarget:add("cxflags", "-fexceptions", {force = true})target:add("cxflags", "-fcxx-exceptions", {force = true})endend)而通过这个接口,我们就可以抽象化成编译器无关的方式去配置它们 。
开启 C++ 异常:
set_exceptions("cxx")禁用 C++ 异常:
set_exceptions("no-cxx")我们也可以同时配置开启 objc 异常 。
set_exceptions("cxx", "objc")或者禁用它们 。
set_exceptions("no-cxx", "no-objc")Xmake 会在内部自动根据不同的编译器,去适配对应的 flags 。
支持 ispc 编译规则Xmake 新增了 ipsc 编译器内置规则支持,非常感谢 @star-hengxing 的贡献,具体使用方式如下:
target("test")set_kind("binary")add_rules("utils.ispc", {header_extension = "_ispc.h"})set_values("ispc.flags", "--target=host")add_files("src/*.ispc")add_files("src/*.cpp")支持 msvc 的 armasm 编译器之前的版本,Xmake 增加了 Windows ARM 的初步支持,但是对 asm 编译还没有很好的支持,因此这个版本,我们继续完善 Windows ARM 的支持 。
对 msvc 的 armasm.exearmasm64.exe 都支持上了 。
另外,我们也改进了包对 Windows ARM 平台的交叉编译支持 。
新增 gnu-rm 构建规则Xmake 也新增了一个使用 gnu-rm 工具链去构建嵌入式项目的规则和例子工程,非常感谢 @JacobPeng 的贡献 。
add_rules("mode.debug", "mode.release")add_requires("gnu-rm")set_toolchains("@gnu-rm")set_plat("cross")set_arch("armv7")target("foo")add_rules("gnu-rm.static")add_files("src/foo/*.c")target("hello")add_deps("foo")add_rules("gnu-rm.binary")add_files("src/*.c", "src/*.S")add_files("src/*.ld")add_includedirs("src/lib/cmsis")完整工程见:Embed GNU-RM Example
新增 OpenBSD 系统支持之前的版本,Xmake 仅仅支持 FreeBSD 系统,而 OpenBSD 跟 FreeBSD 还是有不少差异的,导致 Xmake 无法在它上面正常编译安装 。
而新版本已经完全支持在 OpenBSD 上运行 Xmake 了 。

经验总结扩展阅读