Conditions are generally used to handle some special compilation platforms. | Interfaces | Description | Support version | | ------------------------- | ---------------------------------------- | --------------------------- | | [is_os](#is_os) | Is the current compilation target system? | >= 2.0.1 | | [is_arch](#is_arch) | Is the current compilation architecture? | >= 2.0.1 | | [is_plat](#is_plat) | Is the current compilation platform? | >= 2.0.1 | | [is_host](#is_host) | Is the current compilation host system? | >= 2.1.4 | | [is_mode](#is_mode) | Is the current compilation mode? | >= 2.0.1 | | [is_kind](#is_kind) | Is the current target kind? | >= 2.0.1 | | [is_option](#is_option) | Is the given options enabled? | >= 2.0.1 < 2.2.2 deprecated | | [is_config](#is_config) | Is the given config values? | >= 2.2.2 | | [has_config](#has_config) | Is the given configs enabled? | >= 2.2.2 | | [has_package](#has_package) | Is the given dependent package enabled? | >= 2.2.3 | ### is_os #### Is the current compilation target system ```lua if is_os("ios") then add_files("src/xxx/*.m") end ``` Support operation systems: * windows * linux * android * macosx * ios ### is_arch #### Is the current compilation architecture You can this api to check the configuration command: `xmake f -a armv7` ```lua -- if the current architecture is x86_64 or i386 if is_arch("x86_64", "i386") then add_files("src/xxx/*.c") end -- if the current architecture is armv7 or arm64 or armv7s or armv7-a if is_arch("armv7", "arm64", "armv7s", "armv7-a") then -- ... end ``` And you can also use the wildchard: `*` to check all matched architectures. ```lua -- if the current architecture is arm which contains armv7, arm64, armv7s and armv7-a ... if is_arch("arm*") then -- ... end ``` ### is_plat #### Is the current compilation platform You can this api to check the configuration command: `xmake f -p iphoneos` ```lua -- if the current platform is android if is_plat("android") then add_files("src/xxx/*.c") end -- if the current platform is macosx or iphoneos if is_plat("macosx", "iphoneos") then add_frameworks("Foundation") end ``` Support platforms: * windows * linux * macosx * android * iphoneos * watchos ### is_host #### Is the current compilation host system Some compilation platforms can be built on multiple different operating systems, for example: android ndk (on linux, macOS and windows). So, we can use this api to determine the current host operating system. ```lua if is_host("windows") then add_includedirs("C:\\includes") else add_includedirs("/usr/includess") end ``` Support hosts: * windows * linux * macosx We can also get it from [$(host)](#var-host) or [os.host](#os-host). ### is_mode #### Is the current compilation mode You can this api to check the configuration command: `xmake f -m debug` The compilation mode is not builtin mode for xmake, so you can set the mode value by yourself. We often use these configuration values: `debug`, `release`, `profile`, etc. ```lua -- if the current compilation mode is debug? if is_mode("debug") then -- add macro: DEBUG add_defines("DEBUG") -- enable debug symbols set_symbols("debug") -- disable optimization set_optimize("none") end -- if the current compilation mode is release or profile? if is_mode("release", "profile") then if is_mode("release") then -- mark symbols visibility as hidden set_symbols("hidden") -- strip all symbols set_strip("all") -- fomit frame pointer add_cxflags("-fomit-frame-pointer") add_mxflags("-fomit-frame-pointer") else -- enable debug symbols set_symbols("debug") end -- add vectorexts add_vectorexts("sse2", "sse3", "ssse3", "mmx") end ``` ### is_kind #### Is the current target kind You can this api to check the configuration command: `xmake f -k [static|shared]` ```lua target("test") -- set target kind from the configuration command set_kind("$(kind)") add_files("src/*c") -- compile target for static? if is_kind("static") then add_files("src/xxx.c") end ``` You can switch the target kind by configuration command. ```bash # compile as static library $ xmake f -k static $ xmake ``` ```bash # compile as shared library $ xmake f -k shared $ xmake ``` ### is_option #### Is the given options enabled

This interface has been deprecated after v2.2.2, please use [has_config](#has_config) instead.

You can use this api to check the custom option configuration command:`xmake f --xxxx=y` For example, we want to enable the custom option: `xmake f --demo=y` and check it from `xmake.lua`. ```lua if is_option("demo") then add_subdirs("src/demo") end ``` ### is_config #### Is the given config values? This interface is introduced from version 2.2.2 to determine whether the specified configuration is a given value. For example: ```console $ xmake f --test=hello1 ``` ```lua option("test") set_showmenu("true") set_description("The test config option") option_end() if is_config("test", "hello1", "hello2") then add_defines("HELLO") end ``` Not only that, we can also set pattern matching rules to determine values, such as: ```lua if is_config("test", "hello.*") then add_defines("HELLO") end ```

This interface is not only able to determine the custom options defined through the [option](#option), but also to determine the built-in global and local configuration.

### has_config #### Is the given configs enabled? This interface is introduced from version 2.2.2 to detect whether a custom or built-in option/configuration exists or is enabled. For example, the following configuration will be true: ```console # enable the given config or option (if be boolean type) $ xmake f --test1=y $ xmake f --test1=yes $ xmake f --test1=true # set the config value $ xmake f --test2=value ``` ```lua if has_config("test1", "test2") then add_defines("TEST") end ``` And the following configuration will be false: ```console # disable config/option(if be boolean type) $ xmake f --test1=n $ xmake f --test1=no $ xmake f --test1=false ```

This interface can determine not only the built-in global and local configs, but also the custom options defined through the [option](#option).

### has_package #### Is the given dependent package enabled? This interface is introduced from version 2.2.3 to detect whether a dependent package exists or is enabled. It is usually used to [add_requires](#add_requires). ```lua add_requires("tbox", {optional = true}) target("test") set_kind("binary") add_files("src/*.c") add_packages("tbox") if has_package("tbox") then add_defines("HAVE_TBOX") end ``` If the remote dependencies are added via the optional add-on package added by `add_requires`, or the current platform does not support the actual installation, then `has_package` will return false. Indicates that it does not exist, and then does some special processing for other flags definitions and even source file compilation controls.

The difference between this interface and [has_config](#has_config) is that [has_config](#has_config) is used for [option](#option) whereas this is used for [add_requires](#add_requires).