blob: 4a17e8637364dcc13d131f63d5bfdf4866babcec [file] [log] [blame]
name: find_program
returns: external_program
description: |
`program_name` here is a string that can be an executable or script
to be searched for in `PATH` or other places inside the project.
The search order is:
1. Program overrides set via [[meson.override_find_program]]
1. [`[provide]` sections](Wrap-dependency-system-manual.md#provide-section)
in subproject wrap files, if [`wrap_mode`](Builtin-options.md#core-options) is
set to `forcefallback`
1. [`[binaries]` section](Machine-files.md#binaries) in your machine files
1. Directories provided using the `dirs:` kwarg (see below)
1. Project's source tree relative to the current subdir
- If you use the return value of [[configure_file]], the
current subdir inside the build tree is used instead
1. `PATH` environment variable
1. [`[provide]` sections](Wrap-dependency-system-manual.md#provide-section) in
subproject wrap files, if [`wrap_mode`](Builtin-options.md#core-options) is
set to anything other than `nofallback`
Meson will also autodetect scripts with a shebang line and run them
with the executable/interpreter specified in it both on Windows
(because the command invocator will reject the command otherwise) and
Unixes (if the script file does not have the executable bit set).
Hence, you *must not* manually add the interpreter while using this
script as part of a list of commands. Since *0.50.0* if the "python3"
program is requested and it is not found in the system, Meson will return
its current interpreter.
If you need to check for a program in a non-standard location, you can
just pass an absolute path to `find_program`, e.g.
```meson
setcap = find_program('setcap', '/usr/sbin/setcap', '/sbin/setcap', required : false)
```
It is also possible to pass an array to `find_program` in case you
need to construct the set of paths to search on the fly:
```meson
setcap = find_program(['setcap', '/usr/sbin/setcap', '/sbin/setcap'], required : false)
```
*Since 1.2.0* `find_program('meson')` is automatically overridden to the Meson
command used to execute the build script.
The returned [[@external_program]] object also has documented methods.
posargs:
program_name:
type: str | file
description: |
The name of the program to search, or a [[@file]] object to be used
without searching.
varargs:
name: fallback
type: str | file
since: 0.37.0
description: |
These parameters are used as fallback names to search for.
This is meant to be used for cases where the
program may have many alternative names, such as `foo` and
`foo.py`. The function will check for the arguments one by one and the
first one that is found is returned.
kwargs:
required:
type: bool | feature
default: true
description: |
When `true`, Meson will abort if no program can be found.
If `required` is set to `false`,
Meson continue even if none of the programs can be found. You can
then use the `.found()` method on the returned [[@external_program]] to check
whether it was found or not. *(since 0.47.0)* The value of a
[`feature`](Build-options.md#features) option can also be passed to the
`required` keyword argument.
native:
type: bool
default: false
since: 0.43.0
description: |
Defines how this executable should be searched. By default
it is set to `false`, which causes Meson to first look for the
executable in the cross file (when cross building) and if it is not
defined there, then from the system. If set to `true`, the cross
file is ignored and the program is only searched from the system.
disabler:
type: bool
since: 0.49.0
default: false
description: |
If `true` and the program couldn't be found, return a [[@disabler]] object
instead of a not-found object.
version:
type: str | list[str]
since: 0.52.0
description: |
Specifies the required version, see
[[dependency]] for argument format. The version of the program
is determined by running `program_name --version` command. If stdout is empty
it fallbacks to stderr. If the output contains more text than simply a version
number, only the first occurrence of numbers separated by dots is kept.
If the output is more complicated than that, the version checking will have to
be done manually using [[run_command]].
dirs:
type: list[str]
since: 0.53.0
description: extra list of absolute paths where to look for program names.
default_options:
type: list[str] | dict[str | bool | int | list[str]]
since: 1.3.0
description: |
An array of default option values
that override those set in the subproject's `meson.options`
(like `default_options` in [[project]], they only have
effect when Meson is run for the first time, and command line
arguments override any default options in build files)