From f920e8d365457ca314a950f069184b32d3b9ba74 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Fri, 7 Mar 2025 12:21:47 -0600 Subject: [PATCH] fix: pin iosevka to avoid oomkilling machines as often during nixpkgs upgrades --- packages/default.nix | 2 + packages/iosevka.nix | 154 +++++++++++++++++++++++++++++++++++ packages/iosevkaLyteTerm.nix | 16 +++- 3 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 packages/iosevka.nix diff --git a/packages/default.nix b/packages/default.nix index b663a5c..c100c07 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -3,6 +3,8 @@ let iosevkaLyteTerm = pkgs.callPackage ./iosevkaLyteTerm.nix { }; in { + iosevka = pkgs.callPackage ./iosevka.nix { }; + inherit iosevkaLyteTerm; iosevkaLyteTermSubset = pkgs.callPackage ./iosevkaLyteTermSubset.nix { diff --git a/packages/iosevka.nix b/packages/iosevka.nix new file mode 100644 index 0000000..6f7d311 --- /dev/null +++ b/packages/iosevka.nix @@ -0,0 +1,154 @@ +{ + stdenv, + lib, + buildNpmPackage, + fetchFromGitHub, + cctools, + remarshal, + ttfautohint-nox, + # Custom font set options. + # See https://typeof.net/Iosevka/customizer + # Can be a raw TOML string, or a Nix attrset. + + # Ex: + # privateBuildPlan = '' + # [buildPlans.iosevka-custom] + # family = "Iosevka Custom" + # spacing = "normal" + # serifs = "sans" + # + # [buildPlans.iosevka-custom.variants.design] + # capital-j = "serifless" + # + # [buildPlans.iosevka-custom.variants.italic] + # i = "tailed" + # ''; + + # Or: + # privateBuildPlan = { + # family = "Iosevka Custom"; + # spacing = "normal"; + # serifs = "sans"; + # + # variants = { + # design.capital-j = "serifless"; + # italic.i = "tailed"; + # }; + # } + privateBuildPlan ? null, + # Extra parameters. Can be used for ligature mapping. + # It must be a raw TOML string. + + # Ex: + # extraParameters = '' + # [[iosevka.compLig]] + # unicode = 57808 # 0xe1d0 + # featureTag = 'XHS0' + # sequence = "+>" + # ''; + extraParameters ? null, + # Custom font set name. Required if any custom settings above. + set ? null, +}: + +assert (privateBuildPlan != null) -> set != null; +assert (extraParameters != null) -> set != null; + +buildNpmPackage rec { + pname = "Iosevka${toString set}"; + version = "33.0.0"; + + src = fetchFromGitHub { + owner = "be5invis"; + repo = "iosevka"; + rev = "v${version}"; + hash = "sha256-Wwh6EGngF+0vkNWnHU9isb24i/8gHBLQ3XMniF7dFTk="; + }; + + npmDepsHash = "sha256-Luzut1FLNS1MQ90ObbMNdKImOLhn/acrR1rja0jO0MI="; + + nativeBuildInputs = + [ + remarshal + ttfautohint-nox + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + # libtool + cctools + ]; + + buildPlan = + if builtins.isAttrs privateBuildPlan then + builtins.toJSON { buildPlans.${pname} = privateBuildPlan; } + else + privateBuildPlan; + + inherit extraParameters; + passAsFile = + [ "extraParameters" ] + ++ lib.optionals ( + !(builtins.isString privateBuildPlan && lib.hasPrefix builtins.storeDir privateBuildPlan) + ) [ "buildPlan" ]; + + configurePhase = '' + runHook preConfigure + ${lib.optionalString (builtins.isAttrs privateBuildPlan) '' + remarshal -i "$buildPlanPath" -o private-build-plans.toml -if json -of toml + ''} + ${lib.optionalString + (builtins.isString privateBuildPlan && (!lib.hasPrefix builtins.storeDir privateBuildPlan)) + '' + cp "$buildPlanPath" private-build-plans.toml + '' + } + ${lib.optionalString + (builtins.isString privateBuildPlan && (lib.hasPrefix builtins.storeDir privateBuildPlan)) + '' + cp "$buildPlan" private-build-plans.toml + '' + } + ${lib.optionalString (extraParameters != null) '' + echo -e "\n" >> params/parameters.toml + cat "$extraParametersPath" >> params/parameters.toml + ''} + runHook postConfigure + ''; + + buildPhase = '' + export HOME=$TMPDIR + runHook preBuild + + # pipe to cat to disable progress bar + npm run build --no-update-notifier --targets ttf::$pname -- --jCmd=$NIX_BUILD_CORES --verbosity=9 | cat + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + fontdir="$out/share/fonts/truetype" + install -d "$fontdir" + install "dist/$pname/TTF"/* "$fontdir" + runHook postInstall + ''; + + enableParallelBuilding = true; + + meta = with lib; { + homepage = "https://typeof.net/Iosevka/"; + downloadPage = "https://github.com/be5invis/Iosevka/releases"; + description = "Versatile typeface for code, from code"; + longDescription = '' + Iosevka is an open-source, sans-serif + slab-serif, monospace + + quasi‑proportional typeface family, designed for writing code, using in + terminals, and preparing technical documents. + ''; + license = licenses.ofl; + platforms = platforms.all; + maintainers = with maintainers; [ + ttuegel + rileyinman + lunik1 + ]; + }; +} diff --git a/packages/iosevkaLyteTerm.nix b/packages/iosevkaLyteTerm.nix index 36aacfb..82f8d0e 100644 --- a/packages/iosevkaLyteTerm.nix +++ b/packages/iosevkaLyteTerm.nix @@ -1,4 +1,4 @@ -{ iosevka, ... }: +{ fetchFromGitHub, iosevka, ... }: let set = "LyteTerm"; in @@ -126,7 +126,19 @@ in punctuation-dot = 'round' ''; }).overrideAttrs - { + rec { + pname = "Iosevka"; + version = "33.0.0"; + + src = fetchFromGitHub { + owner = "be5invis"; + repo = "iosevka"; + rev = "v${version}"; + hash = "sha256-Wwh6EGngF+0vkNWnHU9isb24i/8gHBLQ3XMniF7dFTk="; + }; + + npmDepsHash = "sha256-Luzut1FLNS1MQ90ObbMNdKImOLhn/acrR1rja0jO0MI="; + buildPhase = '' export HOME=$TMPDIR runHook preBuild