Teach nix to build fonts instead of keeping them in-tree

This commit is contained in:
Jez Cope 2021-09-27 21:12:30 +01:00
parent 1dba4581e8
commit 5830d2c6e2
40 changed files with 133 additions and 159 deletions

View File

@ -2,11 +2,11 @@
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1623875721,
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
"lastModified": 1631561581,
"narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
"rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
"type": "github"
},
"original": {
@ -17,11 +17,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1624992828,
"narHash": "sha256-whhfrjqOa1BUQAQu4J0QSRUG+iZbTeJpnsl52kLPBfc=",
"lastModified": 1632768365,
"narHash": "sha256-dewSDOFvHS9mGXBOB8E4nciQ2QavKpsNRXMSnCKJOxE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "520da1d00f26d2f4d31eb3cd3c5dc8b3a1e998c6",
"rev": "75b5e5ee2642c28687592c24420d2085c1238f4c",
"type": "github"
},
"original": {

View File

@ -5,12 +5,35 @@
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
(flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system};
{
overlay = self: super:
let
pkgs = nixpkgs.legacyPackages.${super.system};
buildIosevka = pkgs.callPackage ./nix/iosevka.nix;
in rec {
iosevka = buildIosevka { set = "mnemosyne"; };
iosevka-aile = buildIosevka { set = "aile-mnemosyne"; };
iosevka-etoile = buildIosevka { set = "etoile-mnemosyne"; };
fonts = pkgs.symlinkJoin {
name = "mnemosyne-fonts";
paths = [ iosevka iosevka-aile iosevka-etoile ];
};
erambler = pkgs.callPackage ./nix/build.nix { inherit fonts; };
};
} // flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ self.overlay ];
};
in {
defaultPackage = pkgs.callPackage ./nix/build.nix { };
packages = {
inherit (pkgs) erambler iosevka iosevka-aile iosevka-etoile fonts;
};
defaultPackage = pkgs.erambler;
devShell = pkgs.callPackage ./nix/shell.nix { };
})) // {
nixosModule = import ./nix/server.nix { inherit self; };
};
});
}

View File

@ -1,13 +1,15 @@
{ pkgs, ... }:
{ pkgs, fonts, lndir, ... }:
with pkgs;
stdenv.mkDerivation {
name = "erambler-html";
src = ../.;
nativeBuildInputs = [ hugo ];
nativeBuildInputs = [ hugo fonts ];
buildPhase = "hugo";
installPhase = ''
mkdir $out
cp -R public/* public/.well-known $out
cp -R public/* public/.well-known "$out"
mkdir -p "$out/font"
${lndir}/bin/lndir -silent ${fonts} "$out/font"
'';
}

89
nix/iosevka.nix Normal file
View File

@ -0,0 +1,89 @@
{ stdenv, lib, nodejs, nodePackages, remarshal, ttfautohint-nox
, privateBuildPlan ? builtins.readFile ./private-build-plans.toml
, extraParameters ? null, set ? null }:
assert (privateBuildPlan != null) -> set != null;
assert (extraParameters != null) -> set != null;
let
# We don't know the attribute name for the Iosevka package as it
# changes not when our update script is run (which in turn updates
# node-packages.json, but when node-packages/generate.sh is run
# (which updates node-packages.nix).
#
# Doing it this way ensures that the package can always be built,
# although possibly an older version than ioseva-bin.
nodeIosevka =
(lib.findSingle (drv: drv ? packageName && drv.packageName == "iosevka")
(throw "no 'iosevka' package found in nodePackages")
(throw "multiple 'iosevka' packages found in nodePackages")
(lib.attrValues nodePackages)).override (drv: { dontNpmInstall = true; });
in stdenv.mkDerivation rec {
pname = if set != null then "iosevka-${set}" else "iosevka";
inherit (nodeIosevka) version src;
nativeBuildInputs = [ nodejs nodeIosevka remarshal ttfautohint-nox ];
buildPlan = if builtins.isAttrs privateBuildPlan then
builtins.toJSON { buildPlans.${pname} = privateBuildPlan; }
else
privateBuildPlan;
inherit extraParameters;
passAsFile = [ "buildPlan" "extraParameters" ];
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) ''
cp "$buildPlanPath" private-build-plans.toml
''}
${lib.optionalString (extraParameters != null) ''
echo -e "\n" >> params/parameters.toml
cat "$extraParametersPath" >> params/parameters.toml
''}
ln -s ${nodeIosevka}/lib/node_modules/iosevka/node_modules .
runHook postConfigure
'';
buildPhase = ''
runHook preBuild
npm run build --no-update-notifier -- --jCmd=$NIX_BUILD_CORES contents::$pname >/dev/null
runHook postBuild
'';
installPhase = ''
runHook preInstall
install -d "$out/ttf"
install -d "$out/woff2"
install "dist/$pname/ttf"/* "$out/ttf"
install "dist/$pname/woff2"/* "$out/woff2"
install "dist/$pname/$pname.css" "$out"
runHook postInstall
'';
enableParallelBuilding = true;
passthru = { updateScript = ./update-default.sh; };
meta = with lib; {
homepage = "https://be5invis.github.io/Iosevka";
downloadPage = "https://github.com/be5invis/Iosevka/releases";
description = ''
Slender monospace sans-serif and slab-serif typeface inspired by Pragmata
Pro, M+ and PF DIN Mono, designed to be the ideal font for programming.
'';
license = licenses.ofl;
platforms = platforms.all;
maintainers = with maintainers; [
cstrahan
jfrankenau
ttuegel
babariviere
rileyinman
AluisioASG
];
};
}

View File

@ -124,6 +124,10 @@ shape = "italic"
menu = "italic"
css = "italic"
[buildPlans.iosevka-mnemosyne.widths.normal]
shape = 500
menu = 5
css = "normal"
[buildPlans.iosevka-etoile-mnemosyne]

View File

@ -1,36 +0,0 @@
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-aile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-aile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-aile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Aile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-aile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-aile-mnemosyne-bolditalic.ttf') format('truetype');
}

View File

@ -1,36 +0,0 @@
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-etoile-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-etoile-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-etoile-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Etoile Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-etoile-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-etoile-mnemosyne-bolditalic.ttf') format('truetype');
}

View File

@ -1,72 +0,0 @@
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-regular.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-regular.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: expanded;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-extended.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extended.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-italic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-italic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 400;
font-stretch: expanded;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-extendeditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendeditalic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-bold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: expanded;
font-style: normal;
src: url('woff2/iosevka-mnemosyne-extendedbold.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbold.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: normal;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-bolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-bolditalic.ttf') format('truetype');
}
@font-face {
font-family: 'Iosevka Web';
font-display: swap;
font-weight: 700;
font-stretch: expanded;
font-style: italic;
src: url('woff2/iosevka-mnemosyne-extendedbolditalic.woff2') format('woff2'), url('ttf/iosevka-mnemosyne-extendedbolditalic.ttf') format('truetype');
}