但是之前的版本中,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
具体使用效果如下:
文章插图
新增 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 。
推荐阅读
- vivox60的缺点_vivox60优缺点
- 一加9垃圾_一加9严重缺点
- Java 超新星开源项目 Solon v1.10.10 发布
- ipadpro2021款什么时候发布的_苹果ipadpro2021款发布
- 摩托罗拉edge s充电
- macbookpro2021款几月上市_macbookpro2021预计发布时间
- 大疆Action2上市时间_大疆Action2即将发布
- 2021华为p50发布会时间_华为p50发布会2021时间表
- Hugging Face发布diffuser模型AI绘画库初尝鲜!
- Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式