foot/pgo/pgo.sh
Daniel Eklöf a43ae0d098
pgo: replace meson-pgo.sh with several script primitives
All scripts are in the ‘pgo’ directory:

* options: command line options for generate-alt-random-writes.py,
  sourced by other scripts.

* pgo.sh: top-level script, generates a meson build directory, selects
  a PGO method, generates the profiling data, re-configures the meson
  build directory and does the final build.

  This script is intended to be used by end-users, and shows _how_ to
  integrate the script primitives.

  Build servers will most likely *not* want to use this script as-is.

* partial.sh: generates alt-random-write data and runs “foot{,client}
  --version”, and then feeds the alt-random data to the PGO helper
  binary. Does not require a running Wayland session. Touches
  $blddir/pgo-ok on success.

* full-inner.sh: runs “footclient --version”, and then a complex
  “foot” command that first generates alt-random-write data, and then
  “cat’s” it. Requires a running Wayland session, *but*, this script
  is usually not called directly (see below). Touches $blddir/pgo-ok
  onsucces..

* full-current-session.sh: runs full-inner.sh. That is, it runs foot
  in the currently running Wayland session. Note that this will pop up a
  foot window.

* full-headless-sway.sh: generates a custom Sway configuration that
  exec’s foot-headless-sway-inner.sh (see below), and then executes a
  headless Sway. In other words, this script does a *full* PGO build,
  but *without* requiring a running Wayland session. Requires Sway >=
  1.6.2.

* full-headless-sway.sh: runs full-inner.sh + “swaymsg exit”.

To do a custom PGO build, without using pgo.sh, you’d need to:

CFLAGS=”$CFLAGS -O3” meson --buildtype=release -Db_lto=true
meson configure -Db_pgo=generate
ninja
ninja test (only needed if tllist+fcft are built as subprojects)

Run *one* of:
  - partial.sh
  - full-current-session.sh
  - full-headless-sway.sh

meson configure -D b_pgo=use
ninja
2021-09-12 10:39:43 +02:00

101 lines
2.1 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
set -eu
usage_and_die() {
echo "Usage: ${0} none|partial|full-current-session|full-headless-sway|[auto] <source-dir> <build-dir> [meson options]"
exit 1
}
[ ${#} -ge 3 ] || usage_and_die
mode=${1}
srcdir=$(realpath "${2}")
blddir=$(realpath "${3}")
shift 3
if [ -e "${blddir}" ]; then
echo "error: ${blddir}: build directory already exists"
exit 1
fi
compiler=other
do_pgo=no
CFLAGS="${CFLAGS-} -O3"
case $(${CC-cc} --version) in
*GCC*)
compiler=gcc
do_pgo=yes
;;
*clang*)
compiler=clang
if command -v llvm-profdata > /dev/null; then
do_pgo=yes
CFLAGS="${CFLAGS} -Wno-ignored-optimization-argument"
fi
;;
esac
case ${mode} in
partial|full-current-session|full-headless-sway)
;;
none)
do_pgo=no
;;
auto)
# TODO: once Sway 1.6.2 has been released, prefer
# full-headless-sway
if [ -n "${WAYLAND_DISPLAY+x}" ]; then
mode=full-current-session
elif command -v sway > /dev/null; then
mode=full-headless-sway
else
mode=partial
fi
;;
*)
usage_and_die
;;
esac
# echo "source: ${srcdir}"
# echo "build: ${blddir}"
# echo "compiler: ${compiler}"
# echo "mode: ${mode}"
# echo "CFLAGS: ${CFLAGS}"
export CFLAGS
meson "${@}" "${blddir}" "${srcdir}" --buildtype=release -Db_lto=true
if [ ${do_pgo} = yes ]; then
find . -name "*.gcda" -delete
meson configure "${blddir}" -Db_pgo=generate
ninja -C "${blddir}"
# If fcft/tllist are subprojects, we need to ensure their tests
# have been executed, or well get “profile count data file not
# found” errors.
ninja -C "${blddir}" test
# Run mode-dependent script to generate profiling data
"${srcdir}"/pgo/${mode}.sh "${srcdir}" "${blddir}"
if [ ${compiler} = clang ]; then
llvm-profdata \
merge \
"${blddir}"/default_*.profraw \
--output="${blddir}"/default.profdata
fi
meson configure "${blddir}" -Db_pgo=use
fi
ninja -C "${blddir}"