Teach nix to build fonts instead of keeping them in-tree
This commit is contained in:
parent
1dba4581e8
commit
5830d2c6e2
12
flake.lock
12
flake.lock
|
@ -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": {
|
||||
|
|
35
flake.nix
35
flake.nix
|
@ -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; };
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
'';
|
||||
}
|
||||
|
|
|
@ -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
|
||||
];
|
||||
};
|
||||
}
|
|
@ -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]
|
|
@ -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');
|
||||
}
|
|
@ -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');
|
||||
}
|
|
@ -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');
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue