xmake 提供了一些内置的条件判断api,用于在选择性编译时,获取到一些工程状态的相关信息,来调整编译逻辑。。linux
例如:is_os
, is_plat
, is_arch
, is_kind
, is_mode
, is_option
android
is_mode
咱们先拿最经常使用的is_mode
来说讲如何使用,这个api主要用来判断当前的编译模式,例如日常编译配置的时候,会执行:ios
$ xmake f -m debug $ xmake
来编译debug
版本,那么模式就是debug
,那么release
版本,也就是release
了git
$ xmake f -m release $ xmake
可是若是仅仅只是这么配置,xmake仍是不知道若是为debug进行编译,如何编译release版本,由于这些模式的值不是内置的github
咱们能够随便设置,例如:profile, checking等等,用来编译性能模式,检测模式,这些就看我们项目实际的需求了。。macos
通常状况下只须要debug
和release
就好了,那如何区分呢,这就须要在xmake.lua
进行配置了,通常可参考以下配置:windows
-- 若是当前编译模式是debug if is_mode("debug") then -- 添加DEBUG编译宏 add_defines("DEBUG") -- 启用调试符号 set_symbols("debug") -- 禁用优化 set_optimize("none") -- 若是是release模式 elseif is_mode("release") then -- 隐藏符号 set_symbols("hidden") -- strip全部符号 set_strip("all") -- 开启优化为:最快速度模式 set_optimize("fastest") -- 忽略帧指针 add_cxflags("-fomit-frame-pointer") add_mxflags("-fomit-frame-pointer") end
经过判断是否在编译debug版本,来启用和禁用调试符号信息,而且判断是否禁用和启用优化。api
固然,若是咱们的项目还设置了其余模式,例如性能分析模式:profile,那么还能够经过这个来判断是否须要添加一些分析分析上的编译选项。bash
is_plat
接下来咱们讲讲这个编译平台的判断,这个也很是实用哦,虽然咱们的工具是为了跨平台开发,一般的配置确定都是通用的架构
可是毕竟项目成千上万,需求各不相同,总归会有些项目须要针对不一样的平台作些编译上的特殊处理
这个时候,咱们就须要这个api了,例如:
-- 若是当前平台是android if is_plat("android") then add_files("src/xxx/*.c") end --若是当前平台是macosx或者iphoneos if is_plat("macosx", "iphoneos") then add_mxflags("-framework Foundation") add_ldflags("-framework Foundation") end
这里针对android平台,增长了一些特殊代码的编译,针对macosx和iphoneos平台,增长了Foundation框架的连接。
这里还有个比较实用的小技巧,is_xxx
系列接口,都是能够同时传递多个参数的,逻辑上是or的关系
咱们能够像上面那么写法:
if is_plat("macosx", "iphoneos", "android", "linux") then end
不然若是用lua的原生语法的话,虽然也能够,可是会很臃肿,例如:
if is_plat("macosx") or is_plat("iphoneos") or is_plat("android") or is_plat("linux") then end
除了is_xxx
系列,像:add_xxxs
这种后缀有s
的复数api,都是能够传递多个参数的哦,例如add_files
:
add_files("src/*.c", "test.c", "hello.cpp")
等等,这里就不一一介绍了。。。
is_arch
这个跟is_plat
相似,不过是用来判断当前编译的目标架构的,也就是:
xmake f --arch=x86_64
而后,咱们在工程描述中,进行判断:
-- 若是当前架构是x86_64或者i386 if is_arch("x86_64", "i386") then add_files("src/xxx/*.c") end --若是当前平台是armv7, arm64, armv7s, armv7-a if is_arch("armv7", "arm64", "armv7s", "armv7-a") then -- ... end
若是像上面那样一个个去判断全部arm架构,也许会很繁琐,毕竟每一个平台的架构类型不少,xmake提供了相似add_files
中的通配符匹配模式,来更加简洁的进行判断:
--若是当前平台是arm平台 if is_arch("arm*") then -- ... end
用*就能够匹配全部了。。
is_os
这个很简单,用来判断当前编译目标,例如:
-- 若是当前操做系统是ios if is_os("ios") then add_files("src/xxx/*.m") end
目前支持的操做系统有:windows、linux、android、macosx、ios
is_kind
用来判断当前是否编译的是动态库仍是静态库
通常用于以下场景:
target("test") -- 经过配置设置目标的kind set_kind("$(kind)") add_files("src/*c") -- 若是当前编译的是静态库,那么添加指定文件 if is_kind("static") then add_files("src/xxx.c") end
编译配置的时候,可手动切换,编译类型:
-- 编译静态库 xmake f -k static xmake -- 编译动态库 xmake f -k shared xmake
is_option
若是某个自动检测选项、手动设置选项被启用,那么能够经过is_option
接口来判断,例如:
-- 若是手动启用了xmake f --demo=y 选项 if is_option("demo") then -- 编译demo目录下的代码 add_subdirs("src/demo") end