name: meson
long_name: Meson object
description: |
  The `meson` object allows you to introspect various properties of the
  system. This object is always mapped in the `meson` variable.

methods:
  - name: add_dist_script
    returns: void
    since: 0.48.0
    description: |
      Causes the script given as argument to run during `dist`
      operation after the
      distribution source has been generated but before it is
      archived. Note that this runs the script file that is in the
      _staging_ directory, not the one in the source directory. If the
      script file cannot be found in the staging directory, it is a hard
      error. The `MESON_DIST_ROOT` environment variables is set when dist scripts is
      run.

      *(since 0.54.0)* The `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT`
      environment variables are set when dist scripts are run. They are path to the
      root source and build directory of the main project, even when the script
      comes from a subproject.

      *(since 0.58.0)* This command can be invoked from a subproject, it was a hard
      error in earlier versions. Subproject dist scripts will only be executed
      when running `meson dist --include-subprojects`. `MESON_PROJECT_SOURCE_ROOT`,
      `MESON_PROJECT_BUILD_ROOT` and `MESON_PROJECT_DIST_ROOT` environment
      variables are set when dist scripts are run. They are identical to
      `MESON_SOURCE_ROOT`, `MESON_BUILD_ROOT` and `MESON_DIST_ROOT` for main project
      scripts, but for subproject scripts they have the path to the root of the
      subproject appended, usually `subprojects/<subproject-name>`.

      *(since 1.4.0)* The `MESONREWRITE` environment variable contains the path
      to the rewrite command that corresponds to the `meson` executable that
      was used to configure the build. (This might be a different path than the
      first executable found in `PATH`.) It can be used to remove or replace
      any [[run_command]] that depends on the revision control system from the
      build configuration. Note that the value will contain many parts. For
      example, it may be `python3 /path/to/meson.py introspect`. The user is
      responsible for splitting the string to an array if needed by splitting
      lexically like a UNIX shell would. If your script uses Python,
      `shlex.split()` is the easiest correct way to do this.

    posargs:
      script_name:
        type: str | file | external_program
        description: |
          The script to execute.

          *(since 0.55.0)* The output of [[find_program]] as well as strings are accepted.

          *(since 0.57.0)* [[@file]] objects and the output of [[configure_file]] may be used.

    varargs:
      name: arg
      type: str | file | external_program
      since: 0.49.0
      description: |
        Additional arguments

        *(since 0.55.0)* The output of [[configure_file]], [[files]], and [[find_program]]
        as well as strings are accepted.

  - name: add_install_script
    returns: void
    description: |
      Causes the script given as an argument to be run during the install step,
      this script  will have the environment variables `MESON_SOURCE_ROOT`,
      `MESON_BUILD_ROOT`, `MESON_INSTALL_PREFIX`,
      `MESON_INSTALL_DESTDIR_PREFIX`, and `MESONINTROSPECT` set.
      All positional arguments are passed as parameters.

      *(since 0.54.0)* If `meson install` is called with the `--quiet` option, the
      environment variable `MESON_INSTALL_QUIET` will be set.

      *(since 1.1.0)* If `meson install` is called with the `--dry-run` option, the
      environment variable `MESON_INSTALL_DRY_RUN` will be set.

      Meson uses the `DESTDIR` environment variable as set by the
      inherited environment to determine the (temporary) installation
      location for files. Your install script must be aware of this while
      manipulating and installing files. The correct way to handle this is
      with the `MESON_INSTALL_DESTDIR_PREFIX` variable which is always set
      and contains `DESTDIR` (if set) and `prefix` joined together. This
      is useful because both are usually absolute paths and there are
      platform-specific edge-cases in joining two absolute paths.

      In case it is needed, `MESON_INSTALL_PREFIX` is also always set and
      has the value of the `prefix` option passed to Meson.

      `MESONINTROSPECT` contains the path to the introspect command that
      corresponds to the `meson` executable that was used to configure the
      build. (This might be a different path than the first executable
      found in `PATH`.) It can be used to query build configuration. Note
      that the value will contain many parts, f.ex., it may be `python3
      /path/to/meson.py introspect`. The user is responsible for splitting
      the string to an array if needed by splitting lexically like a UNIX
      shell would. If your script uses Python, `shlex.split()` is the
      easiest correct way to do this.

    posargs:
      script_name:
        type: str | file | external_program | exe | custom_tgt | custom_idx
        description: |
          The script to execute.

          *(since 0.55.0)* The output of [[find_program]], [[executable]],
          [[custom_target]], as well as strings are accepted.

          *(since 0.57.0)* [[@file]] objects and the output of [[configure_file]] may be used.

    varargs:
      name: arg
      type: str | file | external_program | exe | custom_tgt | custom_idx
      since: 0.49.0
      description: |
        Additional arguments

        *(since 0.55.0)* The output of [[find_program]], [[executable]],
        [[custom_target]], as well as strings are accepted.

    kwargs:
      skip_if_destdir:
        type: bool
        since: 0.57.0
        default: false
        description: |
          If `true` the script will not be run if DESTDIR is set during installation.
          This is useful in the case the script updates system wide
          cache that is only needed when copying files into final destination.

      install_tag:
        type: str
        since: 0.60.0
        description: |
          A string used by the `meson install --tags` command
          to install only a subset of the files.
          By default the script has no install tag which means it is not being run when
          `meson install --tags` argument is specified.
      
      dry_run:
        type: bool
        since: 1.1.0
        default: false
        description: |
          If `true` the script will be run even if `--dry-run` option is provided to
          the `meson install` command. The script can use the `MESON_INSTALL_DRY_RUN`
          variable to determine if it is in dry run mode or not.

  - name: add_postconf_script
    returns: void
    description: |
      Runs the given command after all project files have been generated.
      This script will have the environment variables
      `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT` set.

    posargs_inherit: meson.add_dist_script
    varargs_inherit: meson.add_dist_script

  - name: backend
    returns: str
    since: 0.37.0
    description: |
      Returns a string representing the current backend:

      - `ninja`
      - `vs2010`
      - `vs2012`
      - `vs2013`
      - `vs2015`
      - `vs2017`
      - `vs2019`
      - `vs2022`
      - `xcode`

  - name: build_options
    returns: str
    since: 1.1.0
    description: |
      Returns a string with the configuration line used to set the current project up.
    notes:
      - |
        **Do not try to parse this string!**

        You should use [[cfg_data.set_quoted]] to safely escape any embedded
        quotes prior to storing it into e.g. a C header macro.

        The contents returned by this function are the same as the
        "Build Options:" line reported in `<builddir>/meson-logs/meson-log.txt`.

  - name: build_root
    returns: str
    deprecated: 0.56.0
    description: |
      Returns a string with the absolute path to the build root directory.
      This function will return the
      build root of the parent project if called from a subproject, which is usually
      not what you want. Try using [[meson.current_build_dir]] or [[meson.project_build_root]].
      In the rare cases where the root of the main project is needed,
      use [[meson.global_build_root]] that has the same behaviour but with a more explicit
      name.

  - name: source_root
    returns: str
    deprecated: 0.56.0
    description: |
      Returns a string with the absolute path to the source root directory.

      This function will return the source root of the
      parent project if called from a subproject, which is usually not what you want.
      Try using [[meson.current_source_dir]] or [[meson.project_source_root]].
      In the rare cases where the root of the main project is needed,
      use [[meson.global_source_root]] that has the same behaviour but with a more explicit
      name.

    notes:
      - |
        You should use the [[files]] function
        to refer to files in the root source directory instead of
        constructing paths manually with [[meson.source_root]].

  - name: project_build_root
    returns: str
    since: 0.56.0
    description: Returns a string with the absolute path to the build root directory of the current (sub)project.

  - name: project_source_root
    returns: str
    since: 0.56.0
    description: Returns a string with the absolute path to the source root directory of the current (sub)project.

  - name: global_build_root
    returns: str
    since: 0.58.0
    description: |
      Returns a string with the absolute path to the build root directory.
      This function will return the build root of the
      main project if called from a subproject, which is usually not what you want.
      It is usually preferable to use [[meson.current_build_dir]] or [[meson.project_build_root]].

  - name: global_source_root
    returns: str
    since: 0.58.0
    description: |
      Returns a string with the absolute path to the source root directory.
      This function will return the source root of the
      main project if called from a subproject, which is usually not what you want.
      It is usually preferable to use [[meson.current_source_dir]] or [[meson.project_source_root]].

  - name: current_build_dir
    returns: str
    description: Returns a string with the absolute path to the current build directory.

  - name: current_source_dir
    returns: str
    description: Returns a string to the current source directory.
    notes:
      - |
        **You do not need to use this function!**

        When passing files from the current source directory to a function since
        that is the default. Also, you can use the [[files]] function to
        refer to files in the current or any other source directory instead
        of constructing paths manually with [[meson.current_source_dir]].

  - name: get_compiler
    returns: compiler
    description: Returns a [[@compiler]] object describing a compiler.

    posargs:
      language:
        type: str
        description: |
          The language of the compiler to return.

          See our [list of supported languages](Reference-tables.md#language-arguments-parameter-names).

    kwargs:
      native:
        type: bool
        default: false
        description: |
          When set to `true` Meson returns the compiler for the build
          machine (the "native" compiler) and when `false` it returns the host
          compiler (the "cross" compiler). If `native` is omitted, Meson
          returns the "cross" compiler if we're currently cross-compiling and
          the "native" compiler if we're not.

  - name: get_cross_property
    returns: any
    deprecated: 0.58.0
    description: |
      Returns the given property from a cross file, the optional fallback_value
      is returned if not cross compiling or the given property is not found.

      This method is replaced by [[meson.get_external_property]].

    arg_flattening: false
    posargs_inherit: meson.get_external_property
    optargs_inherit: meson.get_external_property

  - name: get_external_property
    returns: any
    since: 0.54.0
    description: |
      Returns the given property from a native or cross file.
      The optional fallback_value is returned if the given property is not found.

    arg_flattening: false

    posargs:
      propname:
        type: str
        description: Name of the property in the cross / native file.

    optargs:
      fallback_value:
        type: any
        description: Value to return if `propname` is not set in the machine file.

    kwargs:
      native:
        type: bool
        description: |
          Setting `native` to `true` forces retrieving a variable from the
          native file, even when cross-compiling.
          If `native: false` or not specified, the variable is retrieved from the
          cross-file if cross-compiling, and from the native-file when not cross-compiling.

  - name: has_external_property
    returns: bool
    since: 0.58.0
    description: Checks whether the given property exist in a native or cross file.
    posargs_inherit: meson.get_external_property
    kwargs_inherit: meson.get_external_property

  - name: can_run_host_binaries
    returns: bool
    since: 0.55.0
    description: |
      Returns true if the build machine can run binaries compiled for the host.
      This returns `true` unless you are
      cross compiling, need a helper to run host binaries, and don't have one.
      For example when cross compiling from Linux to Windows, one can use `wine`
      as the helper.

  - name: has_exe_wrapper
    returns: bool
    deprecated: 0.55.0
    description: Use [[meson.can_run_host_binaries]] instead.

  - name: install_dependency_manifest
    returns: void
    description: |
      Installs a manifest file
      containing a list of all subprojects, their versions and license names
      to the file name given as the argument.

      If license files are defined as well, they will be copied next to the
      manifest and referenced in it.

      If this function is not used, the builtin option `licensedir` can
      be used to install the manifest to a given directory with the name
      `depmf.json`.

    posargs:
      output_name:
        type: str
        description: Name of the manifest file to install

  - name: override_find_program
    returns: void
    since: 0.46.0
    description: |
      specifies that whenever [[find_program]] is used to find a program
      named `progname`, Meson should not look it up on the system but
      instead return `program`, which may either be the result of
      [[find_program]], [[configure_file]] or [[executable]].

      *(since 0.55.0)* If a version
      check is passed to [[find_program]] for a program that has been overridden with
      an executable, the current project version is used.

    posargs:
      progname:
        type: str
        description: The name of the program to override.

      program:
        type: exe | file | external_program
        description: The program to set as the override for `progname`.

  - name: override_dependency
    returns: void
    since: 0.54.0
    description: |
      Specifies that whenever [[dependency]] with `name` is used, Meson should not
      look it up on the system but instead return `dep_object`, which may either be
      the result of [[dependency]] or [[declare_dependency]].

      Doing this in a subproject allows the parent
      project to retrieve the dependency without having to know the dependency
      variable name: `dependency(name, fallback : subproject_name)`.

    posargs:
      name:
        type: str
        description: The name of the dependency to override.

      dep_object:
        type: dep
        description: The dependency to set as the override for `name`.

    kwargs:
      native:
        type: bool
        default: false
        description: |
          If set to `true`, the dependency is always overwritten for the build machine.
          Otherwise, the dependency is overwritten for the host machine, which
          differs from the build machine when cross-compiling.

      static:
        type: bool
        since: 0.60.0
        description: |
          Used to override static and/or shared dependencies separately.
          If not specified it is assumed
          `dep_object` follows `default_library` option value.

  - name: is_cross_build
    returns: bool
    description: Returns `true` if the current build is a [cross build](Cross-compilation.md) and `false` otherwise.

  - name: is_subproject
    returns: bool
    description: Returns `true` if the current project is being built as a subproject of some other project and `false` otherwise.

  - name: is_unity
    returns: bool
    description: Returns `true` when doing a [unity build](Unity-builds.md) (multiple sources are combined before compilation to reduce build time) and `false` otherwise.

  - name: project_version
    returns: str
    description: Returns the version string specified in [[project]] function call.

  - name: project_license
    returns: list[str]
    since: 0.45.0
    description: Returns the array of licenses specified in [[project]] function call.

  - name: project_license_files
    returns: list[file]
    since: 1.1.0
    description: Returns the array of license files specified in the [[project]] function call.

  - name: project_name
    returns: str
    description: Returns the project name specified in the [[project]] function call.

  - name: version
    returns: str
    description: Return a string with the version of Meson.

  - name: add_devenv
    returns: void
    since: 0.58.0
    description: |
      add an [[@env]] object (returned by [[environment]])
      to the list of environments that will be applied when using [`meson devenv`](Commands.md#devenv)
      command line.

      This is useful for developers who wish to use the project without
      installing it, it is often needed to set for example the path to plugins
      directory, etc. Alternatively, a list or dictionary can be passed as first
      argument.

      ``` meson
      devenv = environment()
      devenv.set('PLUGINS_PATH', meson.current_build_dir())
      ...
      meson.add_devenv(devenv)
      ```

      After configuring and compiling that project, a terminal can be opened with
      the environment set:

      ```sh
      $ meson devenv -C <builddir>
      $ echo $PLUGINS_PATH
      /path/to/source/subdir
      ```

      See [`meson devenv`](Commands.md#devenv) command documentation for a list of
      environment variables that are set by default by Meson.

    posargs:
      env:
        type: env | str | list[str] | dict[str] | dict[list[str]]
        description: |
          The [[@env]] object to add.
          Since *0.62.0* list of strings is allowed in dictionary values. In that
          case values are joined using the separator.
    kwargs:
      separator:
        type: str
        since: 0.62.0
        description: |
          The separator to use for the initial values defined in
          the first positional argument. If not explicitly specified, the default
          path separator for the host operating system will be used, i.e. ';' for
          Windows and ':' for UNIX/POSIX systems.
      method:
        type: str
        since: 0.62.0
        description: |
          Must be one of 'set', 'prepend', or 'append'
          (defaults to 'set'). Controls if initial values defined in the first
          positional argument are prepended, appended or replace the current value
          of the environment variable.
