name: custom_target returns: custom_tgt description: | Create a custom top level build target. The only positional argument is the name of this target and cannot contain path separators (`/` or `\`). The name of custom target might not be used by every backends, for instance with the Ninja backend, `subdir/meson.build` containing the example below, `ninja -C builddir foo` or `ninja -C builddir subdir/foo` won't work, it is instead `ninja -C builddir subdir/file.txt`. However, `meson compile subdir/foo` is accepted. ```meson custom_target('foo', output: 'file.txt', ...) ``` *Since 0.60.0* the name argument is optional and defaults to the basename of the first output (`file.txt` in the example above). The list of strings passed to the `command` keyword argument accept the following special string substitutions: - `@INPUT@`: the full path to the input passed to `input`. If more than one input is specified, all of them will be substituted as separate arguments only if the command uses `'@INPUT@'` as a standalone-argument. For instance, this would not work: `command : ['cp', './@INPUT@']`, but this would: `command : ['cp', '@INPUT@']`. - `@OUTPUT@`: the full path to the output passed to `output`. If more than one outputs are specified, the behavior is the same as `@INPUT@`. - `@INPUT0@` `@INPUT1@` `...`: the full path to the input with the specified array index in `input` - `@OUTPUT0@` `@OUTPUT1@` `...`: the full path to the output with the specified array index in `output` - `@OUTDIR@`: the full path to the directory where the output(s) must be written - `@DEPFILE@`: the full path to the dependency file passed to `depfile` - `@PLAINNAME@`: the input filename, without a path - `@PLAINNAME0@` `@PLAINNAME1@` `...` *(since 1.5.0)*: the input filename without a path, with the specified array index in `input` - `@BASENAME@`: the input filename, with extension removed - `@BASENAME0@` `@BASENAME1@` `...` *(since 1.5.0)*: the input filename with extension removed, with the specified array index in `input` - `@PRIVATE_DIR@` *(since 0.50.1)*: path to a directory where the custom target must store all its intermediate files. - `@SOURCE_ROOT@`: the path to the root of the source tree. Depending on the backend, this may be an absolute or a relative to current workdir path. - `@BUILD_ROOT@`: the path to the root of the build tree. Depending on the backend, this may be an absolute or a relative to current workdir path. - `@CURRENT_SOURCE_DIR@`: this is the directory where the currently processed meson.build is located in. Depending on the backend, this may be an absolute or a relative to current workdir path. *(since 0.47.0)* The `depfile` keyword argument also accepts the `@BASENAME@` and `@PLAINNAME@` substitutions. The returned object also has methods that are documented in [[@custom_tgt]]. notes: - | Assuming that `command:` is executed by a POSIX `sh` shell is not portable, notably to Windows. Instead, consider using a `native: true` [[executable]], or a python script. warnings: - the `install_mode` kwarg ignored integer values between 0.60.0 -- 1.1.0. optargs: name: type: str description: | The *unique* id of the custom target This posarg is optional *since 0.60.0*. It defaults to the basename of the first output. kwargs: build_by_default: type: bool 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 `false`. *(since 0.50.0)* If `build_by_default` is explicitly set to false, `install` will no longer override it. If `build_by_default` is not set, `install` will still determine its default. build_always: type: bool deprecated: 0.47.0 description: | If `true` this target is always considered out of date and is rebuilt every time. Equivalent to setting both `build_always_stale` and `build_by_default` to true. build_always_stale: type: bool since: 0.47.0 default: false description: | If `true` the target is always considered out of date. Useful for things such as build timestamps or revision control tags. The associated command is run even if the outputs are up to date. capture: type: bool default: false description: | There are some compilers that can't be told to write their output to a file but instead write it to standard output. When this argument is set to true, Meson captures `stdout` and writes it to the target file. Note that your command argument list may not contain `@OUTPUT@` when capture mode is active. console: type: bool since: 0.48.0 description: | Keyword argument conflicts with `capture`, and is meant for commands that are resource-intensive and take a long time to finish. With the Ninja backend, setting this will add this target to [Ninja's `console` pool](https://ninja-build.org/manual.html#_the_literal_console_literal_pool), which has special properties such as not buffering stdout and serializing all targets in this pool. command: type: list[str | file | exe | external_program] description: | Command to run to create outputs from inputs. The command may be strings or the return value of functions that return file-like objects such as [[find_program]], [[executable]], [[configure_file]], [[files]], [[custom_target]], etc. Meson will automatically insert the appropriate dependencies on targets and files listed in this keyword argument. Note: always specify commands in array form `['commandname', '-arg1', '-arg2']` rather than as a string `'commandname -arg1 -arg2'` as the latter will *not* work. depend_files: type: list[str | file] description: | files ([[@str]], [[@file]], or the return value of [[configure_file]] that this target depends on but are not listed in the `command` keyword argument. Useful for adding regen dependencies. depends: type: list[build_tgt | custom_tgt | custom_idx] description: | Specifies that this target depends on the specified target(s), even though it does not take any of them as a command line argument. This is meant for cases where you have a tool that e.g. does globbing internally. Usually you should just put the generated sources as inputs and Meson will set up all dependencies automatically (custom_idx was unavailable as a type between 0.60 and 1.4.0). depfile: type: str description: | A dependency file that the command can write listing all the additional files this target depends on, for example a C compiler would list all the header files it included, and a change in any one of these files triggers a recompilation. *(since 0.47.0)* the `@BASENAME@` and `@PLAINNAME@` substitutions are also accepted. input: type: list[str | file] description: List of source files. *(since 0.41.0)* the list is flattened. install: type: bool description: When true, one or more files of this target are installed during the install step (see `install_dir` for details). install_dir: type: str | list[str | bool] description: | If only one install_dir is provided, all outputs are installed there. *Since 0.40.0* Allows you to specify the installation directory for each corresponding output. For example: ```meson custom_target('different-install-dirs', output : ['first.file', 'second.file'], install : true, install_dir : ['somedir', 'otherdir']) ``` This would install `first.file` to `somedir` and `second.file` to `otherdir`. To only install some outputs, pass `false` for the outputs that you don't want installed. For example: ```meson custom_target('only-install-second', output : ['first.file', 'second.file'], install : true, install_dir : [false, 'otherdir']) ``` This would install `second.file` to `otherdir` and not install `first.file`. install_mode: type: list[str | int] since: 0.47.0 description: | The file mode and optionally the owner/uid and group/gid. See the `install_mode` kwarg of [[install_data]] for more information. install_tag: type: list[str] since: 0.60.0 description: | A list of strings, one per output, used by the `meson install --tags` command to install only a subset of the files. By default all outputs have no install tag which means they are not being installed when `--tags` argument is specified. If only one tag is specified, it is assumed that all outputs have the same tag. `false` can be used for outputs that have no tag or are not installed. output: type: list[str] description: List of output files. env: since: 0.57.0 type: env | list[str] | dict[str] description: | environment variables to set, such as `{'NAME1': 'value1', 'NAME2': 'value2'}` or `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. feed: type: bool since: 0.59.0 default: false description: | There are some compilers that can't be told to read their input from a file and instead read it from standard input. When this argument is set to `true`, Meson feeds the input file to `stdin`. Note that your argument list may not contain `@INPUT@` when feed mode is active.