xmake还能够支持一些自定义选项开关,使得工程支持可选编译,方便工程的模块化管理。c++
咱们拿一个实际的例子来讲:git
咱们想在本身的工程中增长一个新开关选项:hello, 若是这个开关被启用,会在target中添加特定的一些源码文件,可是这个开挂默认是不被启用的,须要经过配置xmake f --hello=true
才会被连接和使用github
而且使用的时候,须要定义一些特殊的宏定义:-DHELLO_TEST -DHELLO_ENABLE
api
那么咱们开始进行xmake.lua修改,过程并不复杂:bash
在xmake.lua的头部经过add_option接口定义一个名叫hello的开关选项模块化
--定义一个名叫hello的开关选项,这个接口跟add_target是同级的,不要在add_target里面使用(使用了也没什么问题,只是不大好看) add_option("hello") -- 默认禁用这个开关,须要手动xmake f --hello=true才会启用,固然你也能够默认启用它 set_option_enable(false) -- 定义一些宏开关,这个只有在hello被启用的时候才会被定义 add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST")
将定义好的hello开关选项,与你的target项目进行绑定布局
-- 添加一个test目标 add_target("test") -- 生成可执行程序 set_kind("binary") -- 绑定hello开关选项 add_options("hello") -- 添加一些hello才须要的源码文件 if options("hello") then add_files("hello/*.c") end
ok了,只要两步,接下来就是编译了:lua
-- 直接编译,默认是禁用hello的,因此hello的相关代码,都没有被编译进去 xmake -- 接下来咱们启用它,从新编译下,这个时候,hello/*.c的代码也被编译进去了,同时-DHELLO_TEST -DHELLO_ENABLE也被添加到编译选项中了 xmake f --hello=true xmake -r
很方便吧。。只需两步就行。。接下来,咱们再稍微修饰下:.net
add_option("hello") -- 默认禁用这个开关,须要手动xmake f --hello=true才会启用,固然你也能够默认启用它 set_option_enable(false) -- 定义一些宏开关,这个只有在hello被启用的时候才会被定义 add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST") -- 启用显示菜单,这样xmake f --help的时候,你这个新加的开关就会被显示出来 set_option_showmenu(true) -- 对菜单中开关进行分类,这样显示的时候 布局会更好看,这个不是必须的 set_option_category("module_xxx") -- 在菜单中,对这个开关进行详细描述 set_option_description("Enable or disable the hello module")
这个时候,你再敲下:code
xmake f --help
会显示以下菜单信息:
此处省略... --hello=HELLO Enable or disable the hello module (default: false) 此处省略...
这样给别人看的时候,也就更明了些。。。
接下来,咱们整的稍微复杂些,让这个hello被启用的时候,自动连接上libhello.a库,而且能够对libhello.a进行自动检测,若是不存在,就禁用hello开关。。
修改以下:
add_option("hello") -- 默认禁用这个开关,须要手动xmake f --hello=true才会启用,固然你也能够默认启用它 set_option_enable(false) -- 定义一些宏开关,这个只有在hello被启用的时候才会被定义 add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST") -- 启用显示菜单,这样xmake f --help的时候,你这个新加的开关就会被显示出来 set_option_showmenu(true) -- 在菜单中,对这个开关进行详细描述 set_option_description("Enable or disable the hello module") -- 添加连接库libhello.a,这个在xmake f 会去自动检测,若是检测连接不经过,那么这个开关就会被禁用掉 -- 若是ok,编译的时候会自动加上-lhello add_option_links("hello") -- 添加连接库检测搜索目录,若是路径不对,检测就会连接不经过,若是ok,在编译的时候,会自动加上-L./libs add_option_linkdirs("libs")
修改后,若是这个hello开关被手动启用,或者自动检测经过,会在编译链接的时候,自动加上-L./libs -lhello的链接选项。
针对自动检测,除了能够检测连接库,还能够增长一些其余的检测规则:
检测头文件是否可以正常包含
类型定义是否存在
接口api是否存在
检测连接库是否可以正常连接
例如:
add_option("hello") -- 默认禁用这个开关,须要手动xmake f --hello=true才会启用,固然你也能够默认启用它 set_option_enable(false) -- 定义一些宏开关,这个只有在hello被启用的时候才会被定义 add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST") -- 启用显示菜单,这样xmake f --help的时候,你这个新加的开关就会被显示出来 set_option_showmenu(true) -- 在菜单中,对这个开关进行详细描述 set_option_description("Enable or disable the hello module") -- 添加连接库libhello.a,这个在xmake f 会去自动检测,若是检测连接不经过,那么这个开关就会被禁用掉 -- 若是ok,编译的时候会自动加上-lhello add_option_links("hello") -- 添加连接库检测搜索目录,若是路径不对,检测就会连接不经过,若是ok,在编译的时候,会自动加上-L./libs add_option_linkdirs("libs") -- 检测在c代码中: include "hello/hello.h",是否成功,ok的话才启用hello -- 检测c++代码请使用:add_option_cxxincludes add_option_cincludes("hello/hello.h") -- 添加头文件检测路径,ok的话,会自动加上:-Iinc/xxx -I./inc的 编译选项 add_option_includedirs("inc/$(plat)", "inc") -- 检测对c代码类型wchar_t的支持,若是不存在这个类型,就检测失败 -- 检测会依赖add_option_cincludes中提供的头文件,若是给定的头文件中定义了这个类型,就能检测经过 -- 检测c++代码请使用:add_option_cxxtypes add_option_ctypes("wchar_t") -- 检测对c代码中是否存在接口api:hello_test() -- 检测会依赖add_option_cincludes中提供的头文件,若是给定的头文件中定义了这个类型,就能检测经过 -- 检测c++代码请使用:add_option_cxxfuncs add_option_cfuncs("hello_test")
须要注意的是,全部的检测都是and关系,必须所有经过,才会自动启用hello开关。
而且在检测ok或者被手动启用后,能够自动添加一些特殊的编译选项、宏定义,这些接口以下:
add_option_cflags:选项开关被启用后,自动添加c编译选项
add_option_cxflags:选项开关被启用后,自动添加c/c++编译选项
add_option_cxxflags:选项开关被启用后,自动添加c++编译选项
add_option_ldflags:选项开关被启用后,自动添加连接选项
add_option_vectorexts:选项开关被启用后,自动添加指令扩展选项,例如:mmx, sse ...
option不只能够在编译的时候,自动添加编译选项,还能够在启用后,自动生成各类宏开关到config.h文件中,方便咱们在代码里面控制编译逻辑
具体的使用说明,见:依赖包的添加和自动检测机制