虽然 xmake 提供了默认的编译模式规则可以让大家很方便的通过 xmake f -m debug 切换各种编译模式,不过有时候内置的 mode.debug,mode.release 等编译模式不一定完全满足需求。这个时候,就需要大家自己来判断当前处于什么编译模式,然后自己去控制编译优化、调试符号等各种编译选项的开启和关闭。
下面,我们将尝试完全使用 is_mode() 来自定义判断配置 debug 和 release 编译模式下的一些特定编译选项,实现和内置的 add_rules("mode.release", "mode.debug") 编译规则一样的控制效果。
继续修改 condition/xmake.lua 文件的配置为如下所示。
if is_mode("release") then
set_symbols("hidden")
set_optimize("fastest")
set_strip("all")
elseif is_mode("debug") then
set_symbols("debug")
set_optimize("none")
end
target("test")
set_kind("binary")
add_files("src/*.cpp")
这次我们通过 is_mode() 来条件判断当前编译模式是否为 debug 还是 release,然后分别设置不同的编译选项,并且把这些选项设置到全局根域,这样可以对所有 target 生效,也就避免了每个 target 都去重复设置一遍。
如果是 release 编译,也就是 xmake 默认的编译模式,那么配置中,我们启用了 fastest 优化编译,并且去除了所有调试符号信息,相对于 gcc 编译选项就是 -fvisibility=hidden -fvisibility-inlines-hidden -O3。
执行如下命令切换到 release 编译模式进行验证。
xmake f -m release
xmake -rv
而如果启用了 debug 编译模式,那么我们会开启调试符号信息,并且禁用所有优化编译,也就是相对于 gcc 中的 -g -O0 编译选项。
执行如下命令切到 debug 编译模式进行验证。
xmake f -m debug
xmake -rv

判断自定义配置选项
除了使用 xmake 提供的一些内置条件判断接口来做条件外,为了更加灵活的扩展性,xmake 提供了一种可以让大家自由扩展配置选项的方式,使得在 xmake.lua 中更加定制化的判断配置项。
例如,我们自定义一个配置项 --myopt 到命令行。
xmake f --myopt=hello
当然,现在直接执行肯定会报错的,因为我们还没有去定义这个选项。
首先,我们在 condition/xmake.lua 文件开头的全局作用域部分加入下面的配置。
option("myopt")
set_showmenu(true)
set_description("The test config option")
option_end()
其中,set_showmenu(true) 用于启用对外导出,这样 help 帮助菜单中才能看到这个选项,用户才能在命令下使用。
执行如下命令,查看是否已经有了这个选项。用 grep myopt 来快速定位新创建的配置选项。
xmake f --help | grep myopt
现在能够在帮助菜单中看到自定义选项了,接下来我们就可以在 xmake.lua 中去判断定义的配置选项来控制编译了。例如我们判断 myopt 的配置值如果是 hello,那么就添加 -DHELLO 的宏定义参与编译。
option("myopt")
set_showmenu(true)
set_description("The test config option")
option_end()
target("test")
set_kind("binary")
add_files("src/*.cpp")
if is_config("myopt", "hello") then
add_defines("HELLO")
end
上面就是我们的完整配置,通过 is_config("myopt", "hello") 来判断自定义选项配置 myopt 当前是否为 hello,如果是就会自动追加 -DHELLO 宏定义。
执行如下命令,设置 myopt 配置值后,查看编译输出。
xmake f --myopt=hello
xmake -rv
如果一切顺利,那么就会看到红线位置的 -DHELLO 已经被传入了 gcc 编译器。
而如果我们清除 myopt 配置,那么 -DHELLO 宏定义也就不会被设置上。
xmake f -c
xmake -rv
可以看到下图中已经没有 -DHELLO 了。
在本节实验中,我们学习了如何去判断条件语句控制编译逻辑,也了解了一些 xmake 内置的平台、架构判断接口,另外还学会了如何判断自定义的选项开关。
本实验的参考代码可以使用如下命令下载:
wget https://labfile.oss-internal.aliyuncs.com/courses/2764/code7.zip
本文介绍了如何使用Xmake自定义编译模式,通过条件判断配置debug和release模式下的编译选项,以及如何扩展配置选项,实现更灵活的编译控制。示例中详细展示了设置不同编译选项、宏定义的方法,并提供了实验代码。
1563

被折叠的 条评论
为什么被折叠?



