name: _build_target_base
returns: void
description: PRIVATE

posargs:
  target_name:
    description: The *unique* name of the build target
    type: str

varargs:
  name: source
  type: str | file | custom_tgt | custom_idx | generated_list
  description: |
    Input source to compile. The following types are supported:

    - Strings relative to the current source directory
    - [[@file]] objects defined in any preceding build file
    - The return value of configure-time generators such as [[configure_file]]
    - The return value of build-time generators such as
      [[custom_target]] or [[generator.process]]

    These input files can be sources, objects, libraries, or any other
    file. Meson will automatically categorize them based on the extension
    and use them accordingly. For instance, sources (`.c`, `.cpp`,
    `.vala`, `.rs`, etc) will be compiled and objects (`.o`, `.obj`) and
    libraries (`.so`, `.dll`, etc) will be linked.

    With the Ninja backend, Meson will create a build-time [order-only
    dependency](https://ninja-build.org/manual.html#ref_dependencies) on
    all generated input files, including unknown files. This is needed to
    bootstrap the generation of the real dependencies in the
    [depfile](https://ninja-build.org/manual.html#ref_headers) generated
    by your compiler to determine when to rebuild sources. Ninja relies on
    this dependency file for all input files, generated and non-generated.
    The behavior is similar for other backends.

warnings:
  - The `link_language` kwarg was broken until 0.55.0

kwargs:
  <lang>_pch:
    type: str
    description: precompiled header file to use for the given language

  <lang>_args:
    type: array[str]
    description: |
      compiler flags to use for the given language;
      eg: `cpp_args` for C++

  vala_args:
    type: array[str | file]
    description: |
      Compiler flags for Vala. Unlike other languages this may contain Files

  sources:
    type: str | file | custom_tgt | custom_idx | generated_list | structured_src
    description: Additional source files. Same as the source varargs.

  build_by_default:
    type: bool
    default: true
    since: 0.38.0
    description: |
      Causes, when set to `true`, to have this target be built by default.
      This means it will be built when `meson compile` is called without any
      arguments. The default value is `true` for all built target types.

  build_rpath:
    type: str
    since: 0.42.0
    description: |
      A string to add to target's rpath definition in the build dir,
      but which will be removed on install

  dependencies:
    type: array[dep]
    description: |
      one or more dependency objects
      created with
      [[dependency]] or [[compiler.find_library]]
      (for external deps) or [[declare_dependency]]
      (for deps built by the project)

  extra_files:
    type: str | file
    description: |
      Not used for the build itself but are shown as source files in IDEs
      that group files by targets (such as Visual Studio).

      These may only be static sources.

  gui_app:
    type: bool
    deprecated: 0.56.0
    default: false
    description: |
      When set to true flags this target as a GUI application
      on platforms where this makes a difference, **deprecated** since
      0.56.0, use `win_subsystem` instead.

  link_args:
    type: array[str]
    description: |
      Flags to use during linking. You can use UNIX-style
      flags here for all platforms.

  link_early_args:
    type: array[str]
    description: |
      Flags to use during linking. These are just like link_args,
      except that they are inserted into the linker command line
      before any object files or libraries. You can use UNIX-style
      flags here for all platforms. This is only supported when using
      the Ninja backend.

  link_depends:
    type: str | file | custom_tgt | custom_idx
    description: |
      Strings, files, or custom targets the link step depends on
      such as a symbol visibility map. The purpose is to
      automatically trigger a re-link (but not a re-compile) of the target
      when this file changes.

  link_language:
    type: str
    since: 0.51.0
    description: |
      Makes the linker for this target be for the specified language.
      It is generally unnecessary to set
      this, as Meson will detect the right linker to use in most cases. There are
      only two cases where this is needed. One, your main function in an
      executable is not in the language Meson picked, or second you want to force
      a library to use only one ABI.

      *(broken until 0.55.0)*

  link_whole:
    type: array[lib | custom_tgt | custom_idx]
    since: 0.40.0
    description: |
      Links all contents of the given static libraries whether they are used or
      not, equivalent to the `-Wl,--whole-archive` argument flag of GCC, or the
      '/WHOLEARCHIVE' MSVC linker option. This allows the linked target to
      re-export symbols from all objects in the static libraries.

      *(since 0.41.0)* If passed an array that array will be flattened.

      *(since 0.51.0)* This argument also accepts outputs produced by
      custom targets. The user must ensure that the output is a library in
      the correct format.

  link_with:
    type: array[lib | custom_tgt | custom_idx]
    description: |
      One or more shared or static libraries
      (built by this project) that this target should be linked with. *(since 0.41.0)* If passed an
      array that array will be flattened. *(since 0.51.0)* The arguments can also be custom targets.
      In this case Meson will assume that merely adding the output file in the linker command
      line is sufficient to make linking work. If this is not sufficient,
      then the build system writer must write all other steps manually.

  implicit_include_directories:
    type: bool
    since: 0.42.0
    default: true
    description: Controls whether Meson adds the current source and build directories to the include path

  include_directories:
    type: array[inc | str]
    description: |
      one or more objects created with the [[include_directories]] function,
      or *(since 0.50.0)* strings, which will be transparently expanded to include directory objects

  install:
    type: bool
    default: false
    description: When set to true, all outputs of this build_target will be installed.

  install_dir:
    type: array[str | bool]
    description: |
      override install directory for outputs of this build target. If the value is a
      relative path, it will be considered relative the `prefix` option.
      For example, if you want to install plugins into a subdir, you'd use
      something like this: `install_dir : get_option('libdir') / 'projectname-1.0'`.

      This can be set to an array of values to control the the installation path
      of build targets with multiple outputs. Currently, that means Vala. Setting
      them to `true` means "use the default", and `false` means, don't install.
      By default the first element is true, and all other elements are false.

      *Since 1.11.0* Passing an array is deprecated, and install_vala_header,
      install_vala_vapi, and install_vala_gir keyword arguments should be used
      instead.

  install_mode:
    type: array[str | int]
    since: 0.47.0
    description: |
      Specify the file mode in symbolic format
      and optionally the owner/uid and group/gid for the installed files.

      See the `install_mode` kwarg of [[install_data]] for more information.

  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 all build targets have the
      tag `runtime` except for static libraries that have the `devel` tag.

  install_rpath:
    type: str
    description: |
      A string to set the target's rpath to after install
      (but *not* before that). On Windows, this argument has no effect.

  objects:
    type: array[extracted_obj | file | str]
    description: |
      List of object files that should be linked in this target.

      **Since 1.1.0** this can include generated files in addition to
      object files that you don't have source to or that object files
      produced by other build targets.  In earlier release, generated
      object files had to be placed in `sources`.

  name_prefix:
    type: str | array[void]
    description: |
      The string that will be used as the prefix for the
      target output filename by overriding the default (only used for
      libraries). By default this is `lib` on all platforms and compilers,
      except for MSVC shared libraries where it is omitted to follow
      convention, and Cygwin shared libraries where it is `cyg`.

      Set this to `[]`, or omit the keyword argument for the default behaviour.

  name_suffix:
    type: str | array[void]
    description: |
      The string that will be used as the extension for the
      target by overriding the default. By default on Windows this is
      `exe` for executables and on other platforms it is omitted.

      For shared libraries, the default value
      is `dylib` on macOS, `dll` on Windows, and `so` everywhere else.
      For static libraries, it is `a` everywhere. By convention MSVC
      static libraries use the `lib` suffix, but we use `a` to avoid a
      potential name clash with shared libraries which also generate
      import libraries with a `lib` suffix.

      Set this to `[]`, or omit the keyword argument for the default behaviour.

  override_options:
    type: array[str] | dict[str | bool | int | array[str]]
    since: 0.40.0
    description: |
      takes an array of strings in the same format as `project`'s `default_options`
      overriding the values of these options
      for this target only.
      *(since 1.2.0)*: A dictionary may now be passed.

  gnu_symbol_visibility:
    type: str
    since: 0.48.0
    description: |
      Specifies how symbols should be exported, see
      e.g [the GCC Wiki](https://gcc.gnu.org/wiki/Visibility) for more
      information. This value can either be an empty string or one of
      `default`, `internal`, `hidden`, `protected` or `inlineshidden`, which
      is the same as `hidden` but also includes things like C++ implicit
      constructors as specified in the GCC manual. Ignored on compilers that
      do not support GNU visibility arguments. See also
      [`snippets.symbol_visibility_header()`](Snippets-module.md#symbol_visibility_header)
      method to help with defining public API.

  d_import_dirs:
    type: array[inc | str]
    since: 0.62.0
    description: |
      the directories to add to the string search path (i.e. `-J` switch for DMD).
      Must be [[@inc]] objects or plain strings.

  d_unittest:
    type: bool
    default: false
    description: When set to true, the D modules are compiled in debug mode.

  d_module_versions:
    type: array[str | int]
    description: List of module version identifiers set when compiling D sources.

  d_debug:
    type: array[str]
    description: |
      The [D version identifiers](https://dlang.org/spec/version.html#version) to add
      during the compilation of D source files.

  native:
    type: bool
    default: false
    description: Controls whether the target is compiled for the build or host machines.

  win_subsystem:
    type: str
    default: "'console'"
    since: 0.56.0
    description: |
      Specifies the subsystem type to use
      on the Windows platform. Typical values include `console` for text
      mode programs and `windows` for gui apps. The value can also contain
      version specification such as `windows,6.0`. See [MSDN
      documentation](https://docs.microsoft.com/en-us/cpp/build/reference/subsystem-specify-subsystem)
      for the full list.

  rust_crate_type:
    type: str
    since: 0.42.0
    deprecated: 1.3.0
    description: |
      Set the specific type of rust crate to compile (when compiling rust).

      If the target is an [[executable]] this defaults to "bin", the only
      allowed value.

      If it is a [[static_library]] it defaults to "lib", and may be "lib",
      "staticlib", or "rlib". If "lib" then Rustc will pick a default, "staticlib"
      means a C ABI library, "rlib" means a Rust ABI.

      If it is a [[shared_library]] it defaults to "lib", and may be "lib",
      "dylib", "cdylib", or "proc-macro". If "lib" then Rustc will pick a
      default, "cdylib" means a C ABI library, "dylib" means a Rust ABI, and
      "proc-macro" is a special rust procedural macro crate.

      "proc-macro" is new in 0.62.0.

      *Since 1.3.0* this is deprecated and replaced by "rust_abi" keyword argument.
      `proc_macro` crates are now handled by the [`rust.proc_macro()`](Rust-module.md#proc_macro)
      method.

  rust_dependency_map:
    type: dict[str]
    since: 1.2.0
    description: |
      On rust targets this allows giving custom names to the crates that are
      linked into the target.  For example, passing a dependency map of
      `{ 'gtk4': 'gtk' }` has the same effect of writing `gtk.package = "gtk4"`
      in the `dependencies` section of a Cargo.toml file, or
      `extern crate gtk4 as gtk` inside Rust code.

      *Since 1.10.0*, the keys can be either crate names or target names.

  vala_header:
    type: str
    description: |
      On Vala targets, this provides a way to override the name of the generated
      C compatible header for targets that generate them.

      If it is not set the default will be calculated from the target's name.

  vala_vapi:
    type: str
    description: |
      On Vala targets, this provides a way to override the name of the generated
      VAPI file.

      If it is not set the default will be calculated from the target's name.

  vala_gir:
    type: str
    description: |
      If set, generates a GIR file with the given name. If this is unset then
      no GIR file will be generated.

  build_subdir:
    type: str
    since: 1.10.0
    description:
      Places the build results in a subdirectory of the given name
      rather than directly into the build directory. This does not
      affect the install directory, which uses install_dir.

      This allows inserting a directory name into the build path,
      either when needed to use the build result while building other
      targets or as a way to support multiple targets with the same
      basename by using unique build_subdir values for each one.

      To prevent collisions within the build directory, build_subdir
      is not allowed to match a file or directory in the source
      directory, nor contain '..' to refer to the parent of the build
      directory.

  install_vala_header:
    type: str | bool
    since: 1.11.0
    description: |
      If set to a string value, the vala generated header will be installed to
      that path, if set to `true`, the default include path will be used, if
      `false` the header will not be installed.

      The default value is `false`.

  install_vala_vapi:
    type: str | bool
    since: 1.11.0
    description: |
      If set to a string value, the vala generated vapi library will be
      installed to that path, if set to `true`, the default vapi path will be
      used, if `false` the vapi library will not be installed.

      The default value is `false`.

  install_vala_gir:
    type: str | bool
    since: 1.11.0
    description: |
      If set to a string value, the vala generated gir library will be
      installed to that path, if set to `true`, the default gir path will be
      used, if `false` the gir library will not be installed.

      It is an error for this to be either `true` or a string and `vala_gir` to
      be unset.

      The default value is `false`.
