条件判断的api,一般用于必须要处理特定平台的编译逻辑的场合。。通常跟lua的if语句配合使用。

接口 描述 支持版本
is_os 判断当前构建目标的操作系统 >= 2.0.1
is_arch 判断当前编译架构 >= 2.0.1
is_plat 判断当前编译平台 >= 2.0.1
is_host 判断当前主机环境操作系统 >= 2.1.4
is_mode 判断当前编译模式 >= 2.0.1
is_kind 判断当前编译类型 >= 2.0.1
is_option 判断选项是否启用 >= 2.0.1 < 2.2.2 已废弃
is_config 判断指定配置是否为给定的值 >= 2.2.2
has_config 判断配置是否启用或者存在 >= 2.2.2
has_package 判断依赖包是否被启用或者存在 >= 2.2.3

is_os

判断当前构建目标的操作系统

  1. -- 如果当前操作系统是ios
  2. if is_os("ios") then
  3. add_files("src/xxx/*.m")
  4. end

目前支持的操作系统有:

  • windows
  • linux
  • android
  • macosx
  • ios

is_arch

判断当前编译架构

用于检测编译配置:xmake f -a armv7

  1. -- 如果当前架构是x86_64或者i386
  2. if is_arch("x86_64", "i386") then
  3. add_files("src/xxx/*.c")
  4. end
  5. -- 如果当前平台是armv7, arm64, armv7s, armv7-a
  6. if is_arch("armv7", "arm64", "armv7s", "armv7-a") then
  7. -- ...
  8. end

如果像上面那样一个个去判断所有arm架构,也许会很繁琐,毕竟每个平台的架构类型很多,xmake提供了类似add_files中的通配符匹配模式,来更加简洁的进行判断:

  1. --如果当前平台是arm平台
  2. if is_arch("arm*") then
  3. -- ...
  4. end

*就可以匹配所有了。。

is_plat

判断当前编译平台

用于检测编译配置:xmake f -p iphoneos

  1. -- 如果当前平台是android
  2. if is_plat("android") then
  3. add_files("src/xxx/*.c")
  4. end
  5. -- 如果当前平台是macosx或者iphoneos
  6. if is_plat("macosx", "iphoneos") then
  7. add_frameworks("Foundation")
  8. end

目前支持的平台有:

  • windows
  • cross
  • linux
  • macosx
  • android
  • iphoneos
  • watchos

当然你也可以自己扩展添加自己的平台,甚至直接指定自己的平台名:

  1. $ xmake f -p other --sdk=...

如果指定的平台名不存在,就会自动切到cross平台进行交叉编译,但是缺可以通过is_plat("other")来判断自己的平台逻辑。

is_host

判断当前主机环境的操作系统

有些编译平台是可以在多个不同的操作系统进行构建的,例如:android的ndk就支持linux,macOS还有windows环境。

这个时候就可以通过这个接口,区分当前是在哪个系统环境下进行的构建。

  1. -- 如果当前主机环境是windows
  2. if is_host("windows") then
  3. add_includedirs("C:\\includes")
  4. else
  5. add_includedirs("/usr/includess")
  6. end

目前支持的主机环境有:

  • windows
  • linux
  • macosx

你也可以通过$(host)内置变量或者os.host接口,来进行获取

is_mode

判断当前编译模式

用于检测编译配置:xmake f -m debug

编译模式的类型并不是内置的,可以自由指定,一般指定:debug, release, profile 这些就够用了,当然你也可以在xmake.lua使用其他模式名来判断。

  1. -- 如果当前编译模式是debug
  2. if is_mode("debug") then
  3. -- 添加DEBUG编译宏
  4. add_defines("DEBUG")
  5. -- 启用调试符号
  6. set_symbols("debug")
  7. -- 禁用优化
  8. set_optimize("none")
  9. end
  10. -- 如果是release或者profile模式
  11. if is_mode("release", "profile") then
  12. -- 如果是release模式
  13. if is_mode("release") then
  14. -- 隐藏符号
  15. set_symbols("hidden")
  16. -- strip所有符号
  17. set_strip("all")
  18. -- 忽略帧指针
  19. add_cxflags("-fomit-frame-pointer")
  20. add_mxflags("-fomit-frame-pointer")
  21. -- 如果是profile模式
  22. else
  23. -- 启用调试符号
  24. set_symbols("debug")
  25. end
  26. -- 添加扩展指令集
  27. add_vectorexts("sse2", "sse3", "ssse3", "mmx")
  28. end

is_kind

判断当前编译类型

判断当前是否编译的是动态库还是静态库,用于检测编译配置:xmake f -k [static|shared]

一般用于如下场景:

  1. target("test")
  2. -- 通过配置设置目标的kind
  3. set_kind("$(kind)")
  4. add_files("src/*c")
  5. -- 如果当前编译的是静态库,那么添加指定文件
  6. if is_kind("static") then
  7. add_files("src/xxx.c")
  8. end

编译配置的时候,可手动切换,编译类型:

  1. # 编译静态库
  2. $ xmake f -k static
  3. $ xmake
  1. # 编译动态库
  2. $ xmake f -k shared
  3. $ xmake

is_option

判断选项是否启用

此接口在2.2.2版本之后已经弃用,请使用has_config来代替。

用于检测自定义的编译配置选型:xmake f --xxxx=y

如果某个自动检测选项、手动设置选项被启用,那么可以通过is_option接口来判断,例如:

  1. -- 如果手动启用了xmake f --demo=y 选项
  2. if is_option("demo") then
  3. -- 编译demo目录下的代码
  4. add_subdirs("src/demo")
  5. end

is_config

判断指定配置是否为给定的值

此接口从2.2.2版本开始引入,用于判断指定配置是否为给定的值,可用于描述域。

例如:

  1. $ xmake f --test=hello1
  1. -- 自定义一个配置选项到命令行菜单
  2. option("test")
  3. set_showmenu("true")
  4. set_description("The test config option")
  5. option_end()
  6. -- 如果自定义的test配置值是hello1或者hello2
  7. if is_config("test", "hello1", "hello2") then
  8. add_defines("HELLO")
  9. end

不仅如此,我们还可以设置模式匹配规则去判断值,例如:

  1. -- 如果自定义的test配置值带有hello前缀
  2. if is_config("test", "hello.*") then
  3. add_defines("HELLO")
  4. end

此接口不仅能够判断通过option定义的自定义配置选项,同时还能判断内置的全局配置、本地配置。

has_config

判断配置是否启用或者存在

此接口从2.2.2版本开始引入,用于检测自定义或者内置的编译配置是否存在或启用,可用于描述域。

例如以下配置情况,都会返回true:

  1. # 启用某个配置选项(如果是boolean类型配置)
  2. $ xmake f --test1=y
  3. $ xmake f --test1=yes
  4. $ xmake f --test1=true
  5. # 设置某个配置选项的值
  6. $ xmake f --test2=value
  1. -- 如果test1或者test2被设置或者启用
  2. if has_config("test1", "test2") then
  3. add_defines("TEST")
  4. end

而下面的情况则会禁用配置,返回false:

  1. # 禁用配置(如果是boolean类型配置)
  2. $ xmake f --test1=n
  3. $ xmake f --test1=no
  4. $ xmake f --test1=false

此接口不仅能够判断内置的全局配置、本地配置,同时还可以判断通过option定义的自定义配置选项。

has_package

判断依赖包是否启用或者存在

此接口从2.2.3版本开始引入,用于检测远程依赖包是否存在或启用,可用于描述域。

一般配合add_requires一起使用,例如:

  1. add_requires("tbox", {optional = true})
  2. target("test")
  3. set_kind("binary")
  4. add_files("src/*.c")
  5. add_packages("tbox")
  6. if has_package("tbox") then
  7. add_defines("HAVE_TBOX")
  8. end

如果通过add_requires添加的可选依赖包,远程下载安装失败,或者当前平台不支持导致实际上没有被正常安装上,那么has_package就会返回false,表示不存在,然后对其他flags定义甚至源文件编译控制做一些特殊处理。

此接口跟has_config的区别在于,has_config用于option,而它用于add_requires