name: feature
long_name: Feature option object
since: 0.47.0
description: Meson object representing a [`feature` options](Build-options.md#features)

methods:
- name: enabled
  returns: bool
  description: Returns whether the feature was set to `'enabled'`

- name: disabled
  returns: bool
  description: Returns whether the feature was set to `'disabled'`

- name: auto
  returns: bool
  description: Returns whether the feature was set to `'auto'`

- name: allowed
  since: 0.59.0
  returns: bool
  description: Returns whether the feature was set to `'enabled'` or `'auto'`

- name: disable_auto_if
  since: 0.59.0
  returns: feature
  description: |
    Returns the feature, with `'auto'` converted to `'disabled'` if value is true.

    | Feature  | `value = true` | `value = false` |
    | -------- | -------------- | --------------- |
    | Auto     | Disabled       | Auto            |
    | Enabled  | Enabled        | Enabled         |
    | Disabled | Disabled       | Disabled        |

  example: |
    `disable_auto_if` is useful to give precedence to mutually exclusive dependencies
    (that provide the same API) if either or both are available:

    ```
    # '-Dfoo=auto -Dbar=enabled' will not pick foo even if installed.
    use_bar = get_option('bar')
    use_foo = get_option('foo').disable_auto_if(use_bar.enabled())
    dep_foo = dependency('foo', required: use_foo)
    if not dep_foo.found()
      dep_foo = dependency('bar', required: use_bar)
    endif
    ```

  posargs:
    value:
      type: bool
      description: See the table above

- name: enable_auto_if
  since: 1.1.0
  returns: feature
  description: |
    Returns the feature, with `'auto'` converted to `'enabled'` if value is true.

    | Feature  | `value = true` | `value = false` |
    | -------- | -------------- | --------------- |
    | Auto     | Enabled        | Auto            |
    | Enabled  | Enabled        | Enabled         |
    | Disabled | Disabled       | Disabled        |

  posargs:
    value:
      type: bool
      description: See the table above

- name: require
  returns: feature
  since: 0.59.0
  description: |
    Returns the object itself if the value is true; an error if the object is
    `'enabled'` and the value is false; a disabled feature if the object
    is `'auto'` or `'disabled'` and the value is false.

    | Feature  | `value = true` | `value = false` |
    | -------- | -------------- | --------------- |
    | Auto     | Auto           | Disabled        |
    | Enabled  | Enabled        | Error           |
    | Disabled | Disabled       | Disabled        |

  example: |
    `require` is useful to restrict the applicability of `'auto'` features,
    for example based on other features or on properties of the host machine:

    ```
    if get_option('directx').require(host_machine.system() == 'windows',
          error_message: 'DirectX only available on Windows').allowed() then
      src += ['directx.c']
      config.set10('HAVE_DIRECTX', true)
    endif
    ```

  posargs:
    value:
      type: bool
      description: The value to check

  kwargs:
    error_message:
      type: str
      default: "''"
      description: The error message to print if the check fails

- name: enable_if
  returns: feature
  since: 1.1.0
  description: |
    Returns the object itself if the value is false; an error if the object is
    `'disabled'` and the value is true; an enabled feature if the object
    is `'auto'` or `'enabled'` and the value is true.

    | Feature  | `value = true` | `value = false` |
    | -------- | -------------- | --------------- |
    | Auto     | Enabled        | Auto            |
    | Enabled  | Enabled        | Enabled         |
    | Disabled | Error          | Disabled        |

  example: |
    `enable_if` is useful to restrict the applicability of `'auto'` features,
    particularly when passing them to [[dependency]]:

    ```
    use_llvm = get_option('llvm').enable_if(with_clang).enable_if(with_llvm_libs)
    dep_llvm = dependency('llvm', required: use_llvm)
    ```

  posargs:
    value:
      type: bool
      description: The value to check

  kwargs:
    error_message:
      type: str
      default: "''"
      description: The error message to print if the check fails

- name: disable_if
  returns: feature
  since: 1.1.0
  description: |
    Returns the object itself if the value is false; an error if the object is
    `'enabled'` and the value is true; a disabled feature if the object
    is `'auto'` or `'disabled'` and the value is true.

    | Feature  | `value = true` | `value = false` |
    | -------- | -------------- | --------------- |
    | Auto     | Disabled       | Auto            |
    | Enabled  | Error          | Enabled         |
    | Disabled | Disabled       | Disabled        |

    This is equivalent to `feature_opt.require(not condition)`, but may make
    code easier to reason about, especially when mixed with `enable_if`

  example: |
    `disable_if` is useful to restrict the applicability of `'auto'` features,
    particularly when passing them to [[dependency]]:

    ```
    use_os_feature = get_option('foo') \
      .disable_if(host_machine.system() == 'darwin', error_message : 'os feature not supported on MacOS')
    dep_os_feature = dependency('os_feature', required: use_os_feature)
    ```

  posargs:
    value:
      type: bool
      description: The value to check

  kwargs:
    error_message:
      type: str
      default: "''"
      description: The error message to print if the check fails
