1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-25 10:22:43 +03:00
wezterm/nix/flake.nix
2024-05-13 14:01:11 -07:00

187 lines
5.6 KiB
Nix

{
description = "A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
nixpkgs.follows = "nixpkgs";
flake-utils.follows = "flake-utils";
};
};
# NOTE: @2024-05 Nix flakes does not support getting git submodules of 'self'.
# refs:
# - https://discourse.nixos.org/t/get-nix-flake-to-include-git-submodule/30324
# - https://github.com/NixOS/nix/pull/7862
#
# ... In the meantime we kinda duplicate the dependencies here then replace the submodules with
# links to each repo in package sources.
#
# Try to use tags when possible to increase readability
# (note: `git submodule status` in wezterm repo will show the `git describe` result for each
# submodule, can help finding a tag if any)
freetype2 = {
url = "github:wez/freetype2/e4586d960f339cf75e2e0b34aee30a0ed8353c0d";
flake = false;
};
harfbuzz = {
url = "github:harfbuzz/harfbuzz/8.4.0";
flake = false;
};
libpng = {
url = "github:glennrp/libpng/8439534daa1d3a5705ba92e653eda9251246dd61";
flake = false;
};
zlib = {
url = "github:madler/zlib/v1.2.11";
flake = false;
};
};
outputs = inputs @ {self, ...}:
inputs.flake-utils.lib.eachDefaultSystem (system: let
overlays = [(import inputs.rust-overlay)];
pkgs = import (inputs.nixpkgs) {inherit system overlays;};
inherit (inputs.nixpkgs) lib;
inherit (pkgs) stdenv;
nativeBuildInputs = with pkgs;
[
installShellFiles
ncurses # tic for terminfo
pkg-config
python3
]
++ lib.optional stdenv.isDarwin perl;
buildInputs = with pkgs;
[
fontconfig
pkgs.zlib
]
++ lib.optionals stdenv.isLinux [
libxkbcommon
openssl
wayland
xorg.libX11
xorg.libxcb
xorg.xcbutil
xorg.xcbutilimage
xorg.xcbutilkeysyms
xorg.xcbutilwm # contains xcb-ewmh among others
]
++ lib.optionals stdenv.isDarwin (
(with pkgs.darwin.apple_sdk.frameworks; [
Cocoa
CoreGraphics
Foundation
UserNotifications
])
++ [pkgs.libiconv]
);
libPath = lib.makeLibraryPath (with pkgs; [
xorg.xcbutilimage
libGL
vulkan-loader
]);
rustPlatform = pkgs.makeRustPlatform {
cargo = pkgs.rust-bin.stable.latest.minimal;
rustc = pkgs.rust-bin.stable.latest.minimal;
};
in {
packages.default = rustPlatform.buildRustPackage rec {
inherit buildInputs nativeBuildInputs;
name = "wezterm";
src = ./..;
version = self.shortRev or "dev";
cargoLock = {
lockFile = ../Cargo.lock;
allowBuiltinFetchGit = true;
};
preConfigure = ''
rm -rf deps/freetype/freetype2 deps/freetype/libpng \
deps/freetype/zlib deps/harfbuzz/harfbuzz
ln -s ${inputs.freetype2} deps/freetype/freetype2
ln -s ${inputs.libpng} deps/freetype/libpng
ln -s ${inputs.zlib} deps/freetype/zlib
ln -s ${inputs.harfbuzz} deps/harfbuzz/harfbuzz
'';
postPatch = ''
echo ${version} > .tag
# tests are failing with: Unable to exchange encryption keys
rm -r wezterm-ssh/tests
'';
preFixup = lib.optionalString stdenv.isLinux ''
patchelf \
--add-needed "${pkgs.libGL}/lib/libEGL.so.1" \
--add-needed "${pkgs.vulkan-loader}/lib/libvulkan.so.1" \
$out/bin/wezterm-gui
'';
postInstall = ''
mkdir -p $out/nix-support
echo "${passthru.terminfo}" >> $out/nix-support/propagated-user-env-packages
install -Dm644 assets/icon/terminal.png $out/share/icons/hicolor/128x128/apps/org.wezfurlong.wezterm.png
install -Dm644 assets/wezterm.desktop $out/share/applications/org.wezfurlong.wezterm.desktop
install -Dm644 assets/wezterm.appdata.xml $out/share/metainfo/org.wezfurlong.wezterm.appdata.xml
install -Dm644 assets/shell-integration/wezterm.sh -t $out/etc/profile.d
installShellCompletion --cmd wezterm \
--bash assets/shell-completion/bash \
--fish assets/shell-completion/fish \
--zsh assets/shell-completion/zsh
install -Dm644 assets/wezterm-nautilus.py -t $out/share/nautilus-python/extensions
'';
passthru = {
terminfo =
pkgs.runCommand "wezterm-terminfo"
{
nativeBuildInputs = [pkgs.ncurses];
} ''
mkdir -p $out/share/terminfo $out/nix-support
tic -x -o $out/share/terminfo ${src}/termwiz/data/wezterm.terminfo
'';
};
};
devShell = pkgs.mkShell {
name = "wezterm-shell";
inherit nativeBuildInputs;
buildInputs =
buildInputs
++ (with pkgs.rust-bin; [
(stable.latest.minimal.override {
extensions = [
"clippy"
"rust-src"
];
})
nightly.latest.rustfmt
nightly.latest.rust-analyzer
]);
LD_LIBRARY_PATH = libPath;
RUST_BACKTRACE = 1;
};
});
}