nixpkgs/pkgs/applications/terminal-emulators/foot/default.nix
sternenseemann ca6cb24b96 foot: 1.8.2 -> 1.9.0
https://codeberg.org/dnkl/foot/releases/tag/1.9.0

Main change requiring intervention from our side is the new alternative
terminfo install location used by foot in order to coexist with ncurses'
install location.

We want to keep using the normal terminfo install location:

* ncurses and foot have separate store paths so there won't be an
  actual conflict

* buildEnv etc. can deal with file conflicts when building the
  system path

Since foot now sets the TERMINFO environment variable to its terminfo
directory, we can stop installing foot's terminfo globally always (via
propagated-user-env-package) instead `foot.terminfo` now only needs to
be installed on remote systems were you want to have the proper terminfo
for foot.

We'll need to see if this works reliably in the future. NixOS sets
TERMINFO_DIRS, so there may be packages that have been patched to
respect that, but not TERMINFO.
2021-09-05 14:28:54 +02:00

220 lines
5.8 KiB
Nix

{ stdenv
, lib
, fetchFromGitea
, fetchurl
, runCommand
, fcft
, freetype
, pixman
, libxkbcommon
, fontconfig
, wayland
, meson
, ninja
, ncurses
, scdoc
, tllist
, wayland-protocols
, wayland-scanner
, pkg-config
, utf8proc
, allowPgo ? true
, python3 # for PGO
# for clang stdenv check
, foot
, llvmPackages
, llvmPackages_latest
}:
let
version = "1.9.0";
# build stimuli file for PGO build and the script to generate it
# independently of the foot's build, so we can cache the result
# and avoid unnecessary rebuilds as it can take relatively long
# to generate
#
# For every bump, make sure that the hash is still accurate.
stimulusGenerator = stdenv.mkDerivation {
pname = "foot-generate-alt-random-writes";
inherit version;
src = fetchurl {
url = "https://codeberg.org/dnkl/foot/raw/tag/${version}/scripts/generate-alt-random-writes.py";
sha256 = "0w4d0rxi54p8lvbynypcywqqwbbzmyyzc0svjab27ngmdj1034ii";
};
dontUnpack = true;
buildInputs = [ python3 ];
installPhase = ''
install -Dm755 $src $out
'';
};
stimuliFile = runCommand "pgo-stimulus-file" { } ''
${stimulusGenerator} \
--rows=67 --cols=135 \
--scroll --scroll-region \
--colors-regular --colors-bright --colors-256 --colors-rgb \
--attr-bold --attr-italic --attr-underline \
--sixel \
--seed=2305843009213693951 \
$out
'';
compilerName =
if stdenv.cc.isClang
then "clang"
else if stdenv.cc.isGNU
then "gcc"
else "unknown";
# https://codeberg.org/dnkl/foot/src/branch/master/INSTALL.md#performance-optimized-pgo
pgoCflags = {
"clang" = "-O3 -Wno-ignored-optimization-argument";
"gcc" = "-O3";
}."${compilerName}";
# ar with lto support
ar = stdenv.cc.bintools.targetPrefix + {
"clang" = "llvm-ar";
"gcc" = "gcc-ar";
"unknown" = "ar";
}."${compilerName}";
# PGO only makes sense if we are not cross compiling and
# using a compiler which foot's PGO build supports (clang or gcc)
doPgo = allowPgo && (stdenv.hostPlatform == stdenv.buildPlatform)
&& compilerName != "unknown";
terminfoDir = "${placeholder "terminfo"}/share/terminfo";
in
stdenv.mkDerivation rec {
pname = "foot";
inherit version;
src = fetchFromGitea {
domain = "codeberg.org";
owner = "dnkl";
repo = pname;
rev = version;
sha256 = "0mkzq5lbgl5qp5nj8sk5gyg9hrrklmbjdqzlcr2a6rlmilkxlhwm";
};
depsBuildBuild = [
pkg-config
];
nativeBuildInputs = [
wayland-scanner
meson
ninja
ncurses
scdoc
pkg-config
] ++ lib.optionals (compilerName == "clang") [
stdenv.cc.cc.libllvm.out
];
buildInputs = [
tllist
wayland-protocols
fontconfig
freetype
pixman
wayland
libxkbcommon
fcft
utf8proc
];
# recommended build flags for performance optimized foot builds
# https://codeberg.org/dnkl/foot/src/branch/master/INSTALL.md#release-build
CFLAGS =
if !doPgo
then "-O3 -fno-plt"
else pgoCflags;
# ar with gcc plugins for lto objects
preConfigure = ''
export AR="${ar}"
'';
mesonBuildType = "release";
mesonFlags = [
"-Db_lto=true"
# Prevent foot from installing its terminfo file into a custom location,
# we need to do this manually in postInstall.
# See https://codeberg.org/dnkl/foot/pulls/673,
# https://codeberg.org/dnkl/foot/src/tag/1.9.0/INSTALL.md#options
"-Dterminfo=disabled"
# Ensure TERM=foot is used
"-Ddefault-terminfo=foot"
# Tell foot what to set TERMINFO to
"-Dcustom-terminfo-install-location=${terminfoDir}"
];
# build and run binary generating PGO profiles,
# then reconfigure to build the normal foot binary utilizing PGO
preBuild = lib.optionalString doPgo ''
meson configure -Db_pgo=generate
ninja
# make sure there is _some_ profiling data on all binaries
./footclient --version
./foot --version
# generate pgo data of wayland independent code
./pgo ${stimuliFile} ${stimuliFile} ${stimuliFile}
meson configure -Db_pgo=use
'' + lib.optionalString (doPgo && compilerName == "clang") ''
llvm-profdata merge default_*profraw --output=default.profdata
'';
outputs = [ "out" "terminfo" ];
postInstall = ''
# build and install foot's terminfo to the standard location
# instead of its custom location
mkdir -p "${terminfoDir}"
tic -o "${terminfoDir}" -x -e foot,foot-direct "$NIX_BUILD_TOP/$sourceRoot/foot.info"
'';
passthru.tests = {
clang-default-compilation = foot.override {
inherit (llvmPackages) stdenv;
};
clang-latest-compilation = foot.override {
inherit (llvmPackages_latest) stdenv;
};
noPgo = foot.override {
allowPgo = false;
};
};
meta = with lib; {
homepage = "https://codeberg.org/dnkl/foot/";
changelog = "https://codeberg.org/dnkl/foot/releases/tag/${version}";
description = "A fast, lightweight and minimalistic Wayland terminal emulator";
license = licenses.mit;
maintainers = [ maintainers.sternenseemann ];
platforms = platforms.linux;
# From (presumably) ncurses version 6.3, it will ship a foot
# terminfo file. This however won't include some non-standard
# capabilities foot's bundled terminfo file contains. Unless we
# want to have some features in e. g. vim or tmux stop working,
# we need to make sure that the foot terminfo overwrites ncurses'
# one. Due to <nixpkgs/nixos/modules/config/system-path.nix>
# ncurses is always added to environment.systemPackages on
# NixOS with its priority increased by 3, so we need to go
# one bigger.
# This doesn't matter a lot for local use since foot sets
# TERMINFO to a store path, but allows installing foot.terminfo
# on remote systems for proper foot terminfo support.
priority = (ncurses.meta.priority or 5) + 3 + 1;
};
}