| --- | |
| short-description: Installing targets | |
| ... | |
| # Installing | |
| Invoked via the [following command](Commands.md#install) *(available | |
| since 0.47.0)*: | |
| ```sh | |
| meson install | |
| ``` | |
| or alternatively (on older Meson versions with `ninja` backend): | |
| ```sh | |
| ninja install | |
| ``` | |
| By default Meson will not install anything. Build targets can be | |
| installed by tagging them as installable in the definition. | |
| ```meson | |
| project('install', 'c') | |
| shared_library('mylib', 'libfile.c', install : true) | |
| ``` | |
| There is usually no need to specify install paths or the like. Meson | |
| will automatically install it to the standards-conforming location. In | |
| this particular case the executable is installed to the `bin` | |
| subdirectory of the install prefix. However if you wish to override | |
| the install dir, you can do that with the `install_dir` argument. | |
| ```meson | |
| executable('prog', 'prog.c', install : true, install_dir : 'my/special/dir') | |
| ``` | |
| Other install commands are the following. | |
| ```meson | |
| install_headers('header.h', subdir : 'projname') # -> include/projname/header.h | |
| install_man('foo.1') # -> share/man/man1/foo.1 | |
| install_data('datafile.dat', install_dir : get_option('datadir') / 'progname') | |
| # -> share/progname/datafile.dat | |
| ``` | |
| `install_data()` supports rename of the file *since 0.46.0*. | |
| ```meson | |
| # file.txt -> {datadir}/{projectname}/new-name.txt | |
| install_data('file.txt', rename : 'new-name.txt') | |
| # file1.txt -> share/myapp/dir1/data.txt | |
| # file2.txt -> share/myapp/dir2/data.txt | |
| install_data(['file1.txt', 'file2.txt'], | |
| rename : ['dir1/data.txt', 'dir2/data.txt'], | |
| install_dir : 'share/myapp') | |
| ``` | |
| Sometimes you want to copy an entire subtree directly. For this use | |
| case there is the `install_subdir` command, which can be used like | |
| this. | |
| ```meson | |
| install_subdir('mydir', install_dir : 'include') # mydir subtree -> include/mydir | |
| ``` | |
| Most of the time you want to install files relative to the install | |
| prefix. Sometimes you need to go outside of the prefix (such as writing | |
| files to `/etc` instead of `/usr/etc`. This can be accomplished by | |
| giving an absolute install path. | |
| ```meson | |
| install_data(sources : 'foo.dat', install_dir : '/etc') # -> /etc/foo.dat | |
| ``` | |
| ## Custom install script | |
| Sometimes you need to do more than just install basic targets. Meson | |
| makes this easy by allowing you to specify a custom script to execute | |
| at install time. As an example, here is a script that generates an | |
| empty file in a custom directory. | |
| ```bash | |
| #!/bin/sh | |
| mkdir "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir" | |
| touch "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir/file.dat" | |
| ``` | |
| As you can see, Meson sets up some environment variables to help you | |
| write your script (`DESTDIR` is not set by Meson, it is inherited from | |
| the outside environment). In addition to the install prefix, Meson | |
| also sets the variables `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT`. | |
| Telling Meson to run this script at install time is a one-liner. | |
| ```meson | |
| [[#meson.add_install_script]]('myscript.sh') | |
| ``` | |
| The argument is the name of the script file relative to the current | |
| subdirectory. | |
| ## Installing as the superuser | |
| When building as a non-root user, but installing to root-owned locations via | |
| e.g. `sudo ninja install`, ninja will attempt to rebuild any out of date | |
| targets as root. This results in various bad behaviors due to build outputs and | |
| ninja internal files being owned by root. | |
| Running `meson install` is preferred for several reasons. It can rebuild out of | |
| date targets and then re-invoke itself as root. *(since 1.1.0)* Additionally, | |
| running `sudo meson install` will drop permissions and rebuild out of date | |
| targets as the original user, not as root. | |
| *(since 1.1.0)* Re-invoking as root will try to guess the user's preferred method for | |
| re-running commands as root. The order of precedence is: sudo, doas, run0, pkexec | |
| (polkit). An elevation tool can be forced by setting `$MESON_ROOT_CMD`. | |
| ## DESTDIR support | |
| Sometimes you need to install to a different directory than the | |
| install prefix. This is most common when building rpm or deb | |
| packages. This is done with the `DESTDIR` environment variable and it | |
| is used just like with other build systems: | |
| ```console | |
| $ DESTDIR=/path/to/staging/area meson install | |
| ``` | |
| Since *0.57.0* `--destdir` argument can be used instead of environment. In that | |
| case Meson will set `DESTDIR` into environment when running install scripts. | |
| Since *0.60.0* `DESTDIR` and `--destdir` can be a path relative to build | |
| directory. An absolute path will be set into environment when executing scripts. | |
| ## Custom install behaviour | |
| Installation behaviour can be further customized using additional | |
| arguments. | |
| For example, if you wish to install the current setup without | |
| rebuilding the code (which the default install target always does) and | |
| only installing those files that have changed, you would run this | |
| command in the build tree: | |
| ```console | |
| $ meson install --no-rebuild --only-changed | |
| ``` | |
| ## Installation tags | |
| *Since 0.60.0* | |
| It is possible to install only a subset of the installable files using | |
| `meson install --tags tag1,tag2` command line. When `--tags` is specified, only | |
| files that have been tagged with one of the tags are going to be installed. | |
| This is intended to be used by packagers (e.g. distributions) who typically | |
| want to split `libfoo`, `libfoo-dev` and `libfoo-doc` packages. Instead of | |
| duplicating the list of installed files per category in each packaging system, | |
| it can be maintained in a single place, directly in upstream `meson.build` files. | |
| Meson sets predefined tags on some files. More tags are likely to be added over | |
| time, please help extending the list of well known categories. | |
| - `devel`: | |
| * [[static_library]], | |
| * [[install_headers]], | |
| * `pkgconfig.generate()`, | |
| * `gnome.generate_gir()` - `.gir` file, | |
| * `gnome.generate_vapi()` - `.vapi` file (*Since 0.64.0*), | |
| * `gnome.generate_vapi()` - `.deps` file (*Since 1.9.1*), | |
| * Files installed into `libdir` and with `.a` or `.pc` extension, | |
| * File installed into `includedir`, | |
| * Generated header files installed with `gnome.compile_resources()`, | |
| `gnome.genmarshal()`, `gnome.mkenums()`, `gnome.mkenums_simple()` | |
| and `gnome.gdbus_codegen()` (*Since 0.64.0*). | |
| - `runtime`: | |
| * [[executable]], | |
| * [[shared_library]], | |
| * [[shared_module]], | |
| * [[jar]], | |
| * `gnome.compile_resources()` - `.gresource` file (*Since 0.64.0*), | |
| * Files installed into `bindir`, | |
| * Files installed into `libdir` and with `.so` or `.dll` extension. | |
| - `python-runtime`: | |
| * `python.install_sources()`. | |
| - `man`: | |
| * [[install_man]]. | |
| - `doc`: | |
| * `gnome.gtkdoc()`, | |
| * `gnome.yelp()`, | |
| * `hotdoc.generate_doc()`. | |
| - `i18n`: | |
| * `i18n.gettext()`, | |
| * `qt.compile_translations()`, | |
| * Files installed into `localedir`. | |
| - `typelib`: | |
| * `gnome.generate_gir()` - `.typelib` file. | |
| - `bin`: | |
| * Scripts and executables bundled with a library meant to be used by end | |
| users. | |
| - `bin-devel`: | |
| * Scripts and executables bundled with a library meant to be used by | |
| developers (i.e. build tools). | |
| - `tests`: | |
| * Files installed into `installed-tests` subdir (*Since 0.64.0*). | |
| - `systemtap`: | |
| * Files installed into `systemtap` subdir (*Since 0.64.0*). | |
| Custom installation tag can be set using the `install_tag` keyword argument | |
| on various functions such as [[custom_target]], [[configure_file]], | |
| [[install_subdir]] and [[install_data]]. See their respective documentation | |
| in the reference manual for details. It is recommended to use one of the | |
| predefined tags above when possible. | |
| Installable files that have not been tagged either automatically by Meson, or | |
| manually using `install_tag` keyword argument won't be installed when `--tags` | |
| is used. They are reported at the end of `<builddir>/meson-logs/meson-log.txt`, | |
| it is recommended to add missing `install_tag` to have a tag on each installable | |
| files. |