diff options
author | Dave Reisner <dreisner@archlinux.org> | 2018-07-07 16:29:48 +0200 |
---|---|---|
committer | Dave Reisner <dreisner@archlinux.org> | 2018-11-02 08:16:34 +0100 |
commit | 51db84750ece4de58923d4ce43cb0638ef150f5f (patch) | |
tree | 6aec4d1ed84ca324d61359f2d8408ff078f3bb28 /build-aux/update-po | |
parent | dab45f0808951afc2e3146211a1c6d7ebb8bd06d (diff) | |
download | pacman-51db84750ece4de58923d4ce43cb0638ef150f5f.tar.gz pacman-51db84750ece4de58923d4ce43cb0638ef150f5f.tar.xz |
Add meson.build files to build with meson
Provide both build systems in parallel for now, to ensure that we work
out all the differences between the two. Some time from now, we'll give
up on autotools.
Meson tends to be faster and probably easier to read/maintain. On my
machine, the full meson configure+build+install takes a little under
half as long as a similar autotools-based invocation.
Building with meson is a two step process. First, configure the build:
meson build
Then, compile the project:
ninja -C build
There's some mild differences in functionality between meson and
autotools. specifically:
1) No singular update-po target. meson only generates individual
update-po targets for each textdomain (of which we have 3). To make
this easier, there's a build-aux/update-po script which finds all
update-po targets and runs them.
2) No 'make dist' equivalent. Just run 'git archive' to generate a
suitable tarball for distribution.
Diffstat (limited to 'build-aux/update-po')
-rwxr-xr-x | build-aux/update-po | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/build-aux/update-po b/build-aux/update-po new file mode 100755 index 00000000..ce1ad4be --- /dev/null +++ b/build-aux/update-po @@ -0,0 +1,39 @@ +#!/bin/bash + +find_build_directory() { + local build_dirs=(*/.ninja_log) + + if [[ ! -e ${build_dirs[0]} ]]; then + echo "error: No build directory found. Have you run 'meson build' yet?" >&2 + return 1 + elif (( ${#build_dirs[*]} > 1 )); then + echo "error: Multiple build directories found. Unable to proceed." >&2 + return 1 + fi + + printf '%s\n' "${build_dirs[0]%/*}" +} + + +filter_targets_by_name() { + if command -v jq &>/dev/null; then + jq --arg re "$1" -r 'map(.name)[] | select(match($re))' + else + json_pp | awk -v filter="$1" -F'[:"]' \ + '$2 == "name" && $(NF - 1) ~ filter { print $(NF - 1) }' + fi +} + +# Make things simple and require that we're in the build root rather than +# trying to chase down the location of this script and the relative build dir. +if [[ ! -d .git ]]; then + echo "This script must be run from the root of the repository" >&2 + exit 1 +fi + +build_dir=$(find_build_directory) || exit 1 + +mapfile -t targets < \ + <(meson introspect "$build_dir" --targets | filter_targets_by_name "-update-po$") + +ninja -C "$build_dir" "${targets[@]}" |