| --- | |
| short-description: Creating releases | |
| ... | |
| # Creating releases | |
| In addition to development, almost all projects provide periodical | |
| source releases. These are standalone packages (usually either in | |
| tar or zip format) of the source code. They do not contain any | |
| revision control metadata, only the source code. Meson provides | |
| a simple way of generating these, with the `meson dist` command. | |
| Meson provides a simple way of generating these. It consists of a | |
| single command *(available since 0.52.0)*: | |
| ```sh | |
| meson dist | |
| ``` | |
| or alternatively (on older Meson versions with `ninja` backend): | |
| ```sh | |
| ninja dist | |
| ``` | |
| This creates a file called `projectname-version.tar.xz` in the build | |
| tree subdirectory `meson-dist`. This archive contains the full | |
| contents of the latest commit in revision control including all the | |
| submodules (recursively). All revision control metadata is removed. | |
| Meson then takes this archive and tests that it works by doing a full | |
| `compile` + `test` + `install` cycle. If all these pass, Meson will | |
| then create a `SHA-256` checksum file next to the archive. | |
| ## Modifying the dist directory before creating the archive | |
| Modification to the checked out files like generating files or | |
| setting version info can be done with dist scripts: | |
| ```meson | |
| [[#meson.add_dist_script]]('distscript.sh') | |
| ``` | |
| ## Autotools dist VS Meson dist | |
| Meson behaviour is different from Autotools. The Autotools "dist" | |
| target packages up the current source tree. Meson packages the latest | |
| revision control commit. The reason for this is that it prevents | |
| developers from doing accidental releases where the distributed | |
| archive does not match any commit in revision control (especially the | |
| one tagged for the release). | |
| ## Include subprojects in your release | |
| The `meson dist` command has `--include-subprojects` command line | |
| option. When enabled, the source tree of all subprojects used by the | |
| current build will also be included in the final tarball. This is | |
| useful to distribute self contained tarball that can be built offline | |
| (i.e. `--wrap-mode=nodownload`). | |
| ## Skip build and test with `--no-tests` | |
| The `meson dist` command has a `--no-tests` option to skip build and | |
| tests steps of generated packages. It can be used to not waste time | |
| for example when done in CI that already does its own testing. | |
| So with `--no-tests` you can tell Meson "Do not build and test generated | |
| packages.". | |
| ## Use `--allow-dirty` to override error when git repository contains uncommitted changes | |
| *Since 0.62.0* Instead of emitting a warning when a repository contains | |
| uncommitted changes, Meson will produce an error message notifying the | |
| user and immediately exit. If `--allow-dirty` is given as an option to | |
| `meson dist`, a warning will be emitted instead and Meson will proceed | |
| as usual. | |
| ## Release a subproject separately | |
| *Since 0.57.0* the `meson dist` command can now create a distribution tarball | |
| for a subproject in the same git repository as the main project. This can be | |
| useful if parts of the project (e.g. libraries) can be built and distributed | |
| separately. In that case they can be moved into `subprojects/mysub` and running | |
| `meson dist` in that directory will now create a tarball containing only the | |
| source code from that subdir and not the rest of the main project or other | |
| subprojects. | |
| For example: | |
| ```sh | |
| git clone https://github.com/myproject | |
| cd myproject/subprojects/mysubproject | |
| meson setup builddir | |
| meson dist -C builddir | |
| ``` | |
| This produces `builddir/meson-dist/mysubproject-1.0.tar.xz` tarball. | |
| ## Cement a version obtained from VCS | |
| *Since 1.4.0* the `meson dist` command enables rewriting the build | |
| configuration of the distribution tarball. This is needed when the | |
| configuration depends on metadata from revision control such as in the | |
| following example. | |
| `meson.build`: | |
| ```meson | |
| project('tig', 'c', | |
| version : run_command('version.sh', 'get-vcs').stdout().strip()) | |
| meson.add_dist_script('version.sh', 'set-dist', meson.project_version()) | |
| ``` | |
| `version.sh`: | |
| ```sh | |
| #!/bin/sh | |
| if [ "$1" = "get-vcs" ]; then | |
| git -C "$MESON_SOURCE_ROOT" describe --always --dirty | |
| elif [ "$1" = "set-dist" ]; then | |
| $MESONREWRITE --sourcedir="$MESON_PROJECT_DIST_ROOT" kwargs set project / version "$2" | |
| else | |
| exit 1 | |
| fi | |
| ``` |