--- 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. ## 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 ```