From 8486c343d709df37d13fc930c34c5317109928b6 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Wed, 24 Jun 2026 13:37:16 +0300 Subject: [PATCH] nix: load terminfo in the devshell and complete the package build Signed-off-by: NotAShelf Change-Id: I9d341443399d553c197f56bf66a578426a6a6964 --- .gitignore | 1 + nix/package.nix | 39 +++++++++++++++++++++++++++++++++++++-- nix/shell.nix | 23 +++++++++++++---------- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 8470fac..61948ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target /result /result-* +/.terminfo diff --git a/nix/package.nix b/nix/package.nix index 719b10c..b844618 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -1,10 +1,17 @@ { lib, rustPlatform, + pkg-config, + makeBinaryWrapper, + ncurses, + wayland, + libxkbcommon, + freetype, + fontconfig, }: rustPlatform.buildRustPackage (finalAttrs: { pname = "beer"; - version = "0.0.0"; + version = "0.0.1"; src = let fs = lib.fileset; @@ -16,14 +23,42 @@ rustPlatform.buildRustPackage (finalAttrs: { (fs.fileFilter (file: builtins.any file.hasExt ["rs"]) (s + /src)) (s + /Cargo.lock) (s + /Cargo.toml) + (s + /terminfo) ]; }; - cargoLock.lockFile = "${finalAttrs.src}/Cargo.lock"; + cargoLock.lockFile = "${finalAttrs.src}Cargo.lock"; enableParallelBuilding = true; + strictDeps = true; + nativeBuildInputs = [ + pkg-config + makeBinaryWrapper + ncurses # tic + ]; + + buildInputs = [ + wayland + libxkbcommon + freetype + fontconfig + ]; + + # Install the terminfo entry, and make the Wayland/xkb libraries (loaded via + # dlopen, so not captured by rpath) discoverable at runtime. + postInstall = '' + mkdir -p "$out/share/terminfo" + tic -x -o "$out/share/terminfo" terminfo/beer.info + wrapProgram "$out/bin/beer" \ + --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [wayland libxkbcommon]} + ''; + meta = { + description = "A fast, software-rendered, Wayland-native terminal emulator"; + homepage = "https://github.com/NotAShelf/beer"; + license = lib.licenses.eupl12; maintainers = with lib.maintainers; [NotAShelf]; mainProgram = "beer"; + platforms = lib.platforms.linux; }; }) diff --git a/nix/shell.nix b/nix/shell.nix index 4a52178..42d7b73 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -8,6 +8,7 @@ taplo, cargo-deny, pkg-config, + ncurses, wayland, wayland-protocols, wayland-scanner, @@ -17,7 +18,7 @@ harfbuzz, }: mkShell { - name = "rust"; + name = "beer-dev"; strictDeps = true; nativeBuildInputs = [ @@ -25,19 +26,11 @@ mkShell { rustc clippy rustfmt - rustc - cargo - - # Tools - rustfmt - clippy - cargo taplo - - # LSP rust-analyzer cargo-deny pkg-config + ncurses # tic, to compile the terminfo entry ]; buildInputs = [ @@ -49,4 +42,14 @@ mkShell { fontconfig harfbuzz ]; + + # Compile the beer terminfo into a project-local database and put it ahead of + # the system one, so TERM=beer resolves inside the shell (and for the shell + # beer spawns, which inherits this env). The trailing ':' keeps the system + # database on the search path. + shellHook = '' + if tic -x -o "$PWD/.terminfo" terminfo/beer.info 2>/dev/null; then + export TERMINFO_DIRS="$PWD/.terminfo:" + fi + ''; }