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


但是之前的版本中,Xmake 无法检测到这种情况,遇到循环依赖 , 编译就会卡死,没有任何提示信息,这对用户非常不友好 。
而新版本中,我们对这种情况做了改进 , 增加了模块的循环依赖检测,编译时候会出现以下错误提示,方便用户定位问题:
$ xmake[0%]: generating.cxx.module.deps Foo.mpp[0%]: generating.cxx.module.deps Foo2.mpp[0%]: generating.cxx.module.deps Foo3.mpp[0%]: generating.cxx.module.deps main.cpperror: circular modules dependency(Foo2, Foo, Foo3, Foo2) detected!-> module(Foo2) in Foo2.mpp-> module(Foo) in Foo.mpp-> module(Foo3) in Foo3.mpp-> module(Foo2) in Foo2.mpp更加 LSP 友好的语法格式我们默认约定的域配置语法 , 尽管非常简洁,但是对自动格式化缩进和 IDE 不是很友好,如果你格式化配置 , 缩进就完全错位了 。
target("foo")set_kind("binary")add_files("src/*.cpp")另外 , 如果两个 target 之间配置了一些全局的配置,那么它不能自动结束当前 target 作用域,用户需要显式调用 target_end()
target("foo")set_kind("binary")add_files("src/*.cpp")target_end()add_defines("ROOT")target("bar")set_kind("binary")add_files("src/*.cpp")虽然,上面我们提到,可以使用 do end 模式来解决自动缩进问题,但是需要 target_end() 的问题还是存在 。
target("foo") doset_kind("binary")add_files("src/*.cpp")endtarget_end()add_defines("ROOT")target("bar") doset_kind("binary")add_files("src/*.cpp")end因此,在新版本中,我们提供了一种更好的可选域配置语法 , 来解决自动缩进 , target 域隔离问题,例如:
target("foo", function ()set_kind("binary")add_files("src/*.cpp")end)add_defines("ROOT")target("bar", function ()set_kind("binary")add_files("src/*.cpp")end)foo 和 bar 两个域是完全隔离的 , 我们即使在它们中间配置其他设置,也不会影响它们,另外,它还对 LSP 非常友好 , 即使一键格式化,也不会导致缩进混乱 。
注:这仅仅只是一只可选的扩展语法,现有的配置语法还是完全支持的 , 用户可以根据自己的需求喜好 , 来选择合适的配置语法 。
为特定编译器添加 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 。

推荐阅读