[转]:xmake工程描述编写之选择性编译

xmake 提供了一些内置的条件判断api,用于在选择性编译时,获取到一些工程状态的相关信息,来调整编译逻辑。。linux

例如:is_os, is_plat, is_arch, is_kind, is_mode, is_optionandroid

is_mode

咱们先拿最经常使用的is_mode来说讲如何使用,这个api主要用来判断当前的编译模式,例如日常编译配置的时候,会执行:ios

$ xmake f -m debug
$ xmake

来编译debug版本,那么模式就是debug,那么release版本,也就是releasegit

$ xmake f -m release
$ xmake

可是若是仅仅只是这么配置,xmake仍是不知道若是为debug进行编译,如何编译release版本,由于这些模式的值不是内置的github

咱们能够随便设置,例如:profile, checking等等,用来编译性能模式,检测模式,这些就看我们项目实际的需求了。。macos

通常状况下只须要debugrelease就好了,那如何区分呢,这就须要在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

相关文章
相关标签/搜索