forked from mirrors/nixpkgs
ca6cb24b96
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.
220 lines
5.8 KiB
Nix
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;
|
|
};
|
|
}
|