xmake 提供了一些内置的条件判断api,用于在选择性编译时,获取到一些工程状态的相关信息,来调整编译逻辑。。
例如:is_os
, is_plat
, is_arch
, is_kind
, is_mode
, is_option
is_mode
我们先拿最常用的is_mode
来讲讲如何使用,这个api主要用来判断当前的编译模式,例如平常编译配置的时候,会执行:
$ xmake f -m debug
$ xmake
来编译debug
版本,那么模式就是debug
,那么release
版本,也就是release
了
$ xmake f -m release
$ xmake
但是如果仅仅只是这么配置,xmake还是不知道如果为debug进行编译,如何编译release版本,因为这些模式的值不是内置的
我们可以随便设置,例如:profile, checking等等,用来编译性能模式,检测模式,这些就看咱们项目实际的需求了。。
一般情况下只需要debug
和release
就行了,那如何区分呢,这就需要在xmake.lua
进行配置了,一般可参考如下配置:
xmake 提供了方便灵活的交叉编译支持,大部分情况下,都不需要配置很复杂的toolchains前缀,例如:arm-linux-
什么的
只要这个toolchains目录满足如下结构(大部分的交叉工具链都是这个结构):
/home/toolchains_sdkdir
- bin
- arm-linux-gcc
- arm-linux-ld
- ...
- lib
- libxxx.a
- include
- xxx.h
那么,使用xmake进行交叉编译的时候,只需要进行如下配置和编译:
$ xmake f -p linux --sdk=/home/toolchains_sdkdir
$ xmake
虽然已经一年多没有维护gbox这个图形库项目了,最近确实时间不够用。。。
今年的重点是把xmake彻底正好,至少在架构和大功能(包依赖管理)上,要完全落实下来,后期就是零散的维护和插件功能扩展了。。
tbox我会陆陆续续一直进行一些小规模更新,明年上半年稍微重构一些模块后,就开始重点重新搞gbox了,这才是我一直最想做,也是最喜欢做的项目了
所以我宁愿开发的慢点,也要把它做精,做到最好。。
好了,回归正题,虽然现在gbox还处于早期开发中,并不能用到实际的项目中去,但是里面的一些算法,还是很有参考学习价值的。。
我这两天没事就拿出来分享下,如果有感兴趣的同学,可以直接阅读源码:monotone.c
毕竟这个算法我陆陆续续花了整整一年的时间,才把它彻底搞透,并且实现出来。。
为什么会花这么久呢,也许是我太笨了哈。。嘿嘿。。当然也有工作原因哈。。
闲话就不多说了,先晒晒,使用新算法三角化分割多边形后的效果:
xmake 在构建程序的时候,会去自动检测系统环境,工程描述等来创建最合适的编译配置来进行编译。。
一般情况下,我们只需要执行:
$ xmake
就行了,并且如果工程描述没有改变,就不会去重新检测和生成配置。。
但是有时候,我们的编译需求千奇百怪,不可能一行xmake
就能完全满足我们的需求,例如:我要在macosx上编译android程序了,怎么办
这个时候就需要手动修改配置:
$ xmake f -p android --ndk=~/file/android-ndk
上面是简写,这样会少敲些字符,如果要可读性更好些,可以写全:
$ xmake config --plat=android --ndk=~/file/android-ndk
然后我们继续执行编译即可:
$ xmake
如果每次编译都是相同配置的话,就不需要重新配置了
当然有时候系统环境发生改变,例如之前用的是 gcc, 现在gcc被卸载了,装了clang,那么缓存配置就无效了,这种情况下,xmake还没有那么智能,能够检测到进行重配,只能手动加上 -c
参数,强制清楚配置缓存,进行重新检测:
$ xmake f -c
如果有时候遇到些配置上的问题,都可以尝试加上这个参数,重试下,一般都能解决。。
xmake默认情况下是不会去生成pdb文件,就算是debug编译,启用了调试符号:
set_symbols("debug")
也是不会生成额外的pdb文件,它会把所有调试符号内置到程序里面,如果要独立生成pdb文件,可以对xmake.lua
进行如下修改:
-- 先禁用内置的调试符号开关
--set_symbols("debug")
-- 静态库目标
target("test")
set_kind("static")
-- 仅针对windows平台
if is_plat("windows") then
-- 启用pdb生成
add_cxflags("-ZI", "-Fd$(buildir)\\test.pdb")
add_ldflags("-pdb:$(buildir)\\test.pdb")
add_arflags("-pdb:$(buildir)\\test.pdb")
end
-- 可执行目标
target("demo")
set_kind("binary")
add_deps("test")
add_links("test")
-- 仅针对windows平台
if is_plat("windows") then
-- 启用pdb生成
add_cxflags("-ZI", "-Fd$(buildir)\\demo.pdb")
add_ldflags("-pdb:$(buildir)\\demo.pdb")
end