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: list[str]
    description: |
      compiler flags to use for the given language;
      eg: `cpp_args` for C++

  vala_args:
    type: list[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: list[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 | custom_tgt | custom_idx
    description: |
      Not used for the build itself but are shown as source files in IDEs
      that group files by targets (such as Visual Studio)

  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: list[str]
    description: |
      Flags to use during linking. You can use UNIX-style
      flags here for all platforms.

  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: list[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 a list that list 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: list[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 a
      list this list 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: list[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, this executable should be installed.

  install_dir:
    type: str
    description: |
      override install directory for this file. 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'`.

  install_mode:
    type: list[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: list[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 | list[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 | list[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: list[str] | dict[str | bool | int | list[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.

  d_import_dirs:
    type: list[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: list[str | int]
    description: List of module version identifiers set when compiling D sources.

  d_debug:
    type: list[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 provides a map of library names to the crate name
      with which it would be available inside the rust code.

      This allows renaming similar to the dependency renaming feature of cargo
      or `extern crate foo as bar` inside rust code.
