From 17bb7663add2b57828b38d5755f2683353cc6311 Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Tue, 20 Jun 2023 14:28:41 +0200 Subject: [PATCH] packages default all fonts, devShell tools for compiling fonts. --- collection.nix | 18 +++++ fetchfont.nix | 171 ++++++++++++++++++++++--------------------- flake.lock | 27 +++++++ flake.nix | 50 ++++++++----- fonts.nix | 43 ++++++----- sfnt2woff-zopfli.nix | 6 +- 6 files changed, 187 insertions(+), 128 deletions(-) create mode 100644 collection.nix create mode 100644 flake.lock diff --git a/collection.nix b/collection.nix new file mode 100644 index 0000000..332bb2a --- /dev/null +++ b/collection.nix @@ -0,0 +1,18 @@ +# vim: set noet sw=2 ts=2 sts=2: +{lib, pkgs, fonts, ...}: +with pkgs; +stdenv.mkDerivation { + name = "fonts-collection"; + nativeBuildInputs = [ coreutils ]; + srcs = [ fonts.fira_code ];# lib.attrsets.attrValues fonts; + unpackPhase = " "; + installPhase = '' + mkdir -p "$out/share/"{fonts,doc} + for src in $srcs + do + cd $src + find * -type d -exec mkdir -p "$out/{}" \; + find * -not -type d -exec ln -s "$src/{}" "$out/{}" \; + done + ''; +} diff --git a/fetchfont.nix b/fetchfont.nix index c719276..21d85f1 100644 --- a/fetchfont.nix +++ b/fetchfont.nix @@ -1,90 +1,91 @@ # vim: set noet sw=2 ts=2 sts=2: -{lib, nixpkgs, sfnt2woff-zopfli, ...}: +{lib, pkgs, ...}: {src ? null , srcs ? null, name ? "", pname ? "", version ? ""}: - let - name_ = - if "" != name - then name - else "${pname}-v${version}"; - in stdenv.mkDerivation ({ - name = name_; - nativeBuildInputs = with nixpkgs; [ sfnt2woff-zopfli unzip coreutils fontconfig woff2 ]; - unpackPhase = '' - source_dir="$TMPDIR/src" - mkdir "$source_dir" - cd "$source_dir" - for s in $src $srcs - do - case "$s" in - *.zip|*.tar|*.tar.gz|*.tgz|*.tar.xz|*.txz|*.tar.bz2|*.tbz2) - unpackFile "$s" - ;; - *) - cp -pr --reflink=auto -- "$s" "$(stripHash "$s")" - ;; - esac - done - ''; - buildPhase = '' - set -e - build_dir="$TMPDIR/build" - mkdir "$build_dir" - find "$source_dir" \( -name \*.otf -or -name \*.ttf -or -name \*.woff -or -name \*.woff2 \) -exec cp \{\} "$build_dir" \; - cd "$build_dir" +with pkgs; +let + name_ = + if "" != name + then name + else "${pname}-v${version}"; +in stdenv.mkDerivation ({ + name = name_; + nativeBuildInputs = [ sfnt2woff-zopfli unzip coreutils fontconfig woff2 ]; + unpackPhase = '' + source_dir="$TMPDIR/src" + mkdir "$source_dir" + cd "$source_dir" + for s in $src $srcs + do + case "$s" in + *.zip|*.tar|*.tar.gz|*.tgz|*.tar.xz|*.txz|*.tar.bz2|*.tbz2) + unpackFile "$s" + ;; + *) + cp -pr --reflink=auto -- "$s" "$(stripHash "$s")" + ;; + esac + done + ''; + buildPhase = '' + set -e + build_dir="$TMPDIR/build" + mkdir "$build_dir" + find "$source_dir" \( -name \*.otf -or -name \*.ttf -or -name \*.woff -or -name \*.woff2 \) -exec cp \{\} "$build_dir" \; + cd "$build_dir" - for s in *.otf *.ttf - do - bn="''${s%.otf}" - bn="''${bn%.ttf}" - if ! [ -e "$bn.woff" ] - then - echo "sfnt2woff-zopfli $s => $bn.woff" - sfnt2woff-zopfli "$s" - fi - if ! [ -e "$bn.woff2" ] - then - echo "woff2_compress $s => $bn.woff2" - woff2_compress "$s" - fi - done + for s in *.otf *.ttf + do + bn="''${s%.otf}" + bn="''${bn%.ttf}" + if ! [ -e "$bn.woff" ] + then + echo "sfnt2woff-zopfli $s => $bn.woff" + sfnt2woff-zopfli "$s" + fi + if ! [ -e "$bn.woff2" ] + then + echo "woff2_compress $s => $bn.woff2" + woff2_compress "$s" + fi + done - for s in *.otf *.ttf *.woff - do - fc="`dirname "$s"`/`basename "$s"`.fc" - echo "fc-scan $s" - LANG=C LC_NUMERIC=C fc-scan --format 'family=%{family} - fullname=%{fullname} - postscriptname=%{postscriptname} - variable=%{variable} - slant=%{slant} - style=%{style} - weight=%{weight} - width=%{width} + for s in *.otf *.ttf *.woff + do + fc="`dirname "$s"`/`basename "$s"`.fc" + echo "fc-scan $s" + LANG=C LC_NUMERIC=C fc-scan --format 'family=%{family} + fullname=%{fullname} + postscriptname=%{postscriptname} + variable=%{variable} + slant=%{slant} + style=%{style} + weight=%{weight} + width=%{width} - ' "$s" > "$fc" - done - for s in *.woff2 - do - o="`dirname "$s"`/`basename "$s" .woff2`.woff.fc" - fc="`dirname "$s"`/`basename "$s"`.fc" - cp "$o" "$fc" - done - ''; - installPhase = '' - cd "$TMPDIR" - mkdir -p $out/share/{doc/${name_},fonts/{opentype,truetype,WOFF,WOFF2}{,/.fc}} - find "$build_dir" -name \*.otf -exec cp \{\} $out/share/fonts/opentype \; - find "$build_dir" -name \*.ttf -exec cp \{\} $out/share/fonts/truetype \; - find "$build_dir" -name \*.woff -exec cp \{\} $out/share/fonts/WOFF \; - find "$build_dir" -name \*.woff2 -exec cp \{\} $out/share/fonts/WOFF2 \; - find "$build_dir" -name \*.otf.fc -exec cp \{\} $out/share/fonts/opentype/.fc \; - find "$build_dir" -name \*.ttf.fc -exec cp \{\} $out/share/fonts/truetype/.fc \; - find "$build_dir" -name \*.woff.fc -exec cp \{\} $out/share/fonts/WOFF/.fc \; - find "$build_dir" -name \*.woff2.fc -exec cp \{\} $out/share/fonts/WOFF2/.fc \; - find "$source_dir" -name \*.txt -exec cp \{\} $out/share/doc/${name_} \; - find "$source_dir" -name \*.md -exec cp \{\} $out/share/doc/${name_} \; - find "$source_dir" -name \*.adoc -exec cp \{\} $out/share/doc/${name_} \; - find "$source_dir" -name \*.html -exec cp \{\} $out/share/doc/${name_} \; - find "$source_dir" -name \*.css -exec cp \{\} $out/share/doc/${name_} \; - ''; - } // (if null != src then { src = src; } else { srcs = srcs; })); + ' "$s" > "$fc" + done + for s in *.woff2 + do + o="`dirname "$s"`/`basename "$s" .woff2`.woff.fc" + fc="`dirname "$s"`/`basename "$s"`.fc" + cp "$o" "$fc" + done + ''; + installPhase = '' + cd "$TMPDIR" + mkdir -p $out/share/{doc/${name_},fonts/{opentype,truetype,WOFF,WOFF2}{,/.fc}} + find "$build_dir" -name \*.otf -exec cp \{\} $out/share/fonts/opentype \; + find "$build_dir" -name \*.ttf -exec cp \{\} $out/share/fonts/truetype \; + find "$build_dir" -name \*.woff -exec cp \{\} $out/share/fonts/WOFF \; + find "$build_dir" -name \*.woff2 -exec cp \{\} $out/share/fonts/WOFF2 \; + find "$build_dir" -name \*.otf.fc -exec cp \{\} $out/share/fonts/opentype/.fc \; + find "$build_dir" -name \*.ttf.fc -exec cp \{\} $out/share/fonts/truetype/.fc \; + find "$build_dir" -name \*.woff.fc -exec cp \{\} $out/share/fonts/WOFF/.fc \; + find "$build_dir" -name \*.woff2.fc -exec cp \{\} $out/share/fonts/WOFF2/.fc \; + find "$source_dir" -name \*.txt -exec cp \{\} $out/share/doc/${name_} \; + find "$source_dir" -name \*.md -exec cp \{\} $out/share/doc/${name_} \; + find "$source_dir" -name \*.adoc -exec cp \{\} $out/share/doc/${name_} \; + find "$source_dir" -name \*.html -exec cp \{\} $out/share/doc/${name_} \; + find "$source_dir" -name \*.css -exec cp \{\} $out/share/doc/${name_} \; + ''; +} // (if null != src then { src = src; } else { srcs = srcs; })) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..0cc6040 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1686926720, + "narHash": "sha256-S49KAii1WiYGAYza+ZJR8Nem142YJ4Nkt4gMvZiovS0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b1bdd38ad9c3b67c25101b87906f6cc3b628317d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 641e7fc..7636edd 100644 --- a/flake.nix +++ b/flake.nix @@ -1,23 +1,33 @@ -# vim: set noet sw=2 ts=2 sts=2: +# vim: set et sw=2 ts=2 sts=2: { - description = "fonts"; - inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-23.05-small; - outputs = { self, nixpkgs }: - let - sfnt2woff-zopfli = callPackage ./sfnt2woff-zopfli.nix {}; - fetchfont = callPackage ./fetchfont.nix {sfnt2woff-zopfli = sfnt2woff-zopfli; }; - fonts = callPackage ./fonts.nix {fetchfont = fetchfont; }; - allSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; - forAllSystems = f: nixpkgs.lib.genAttrs allSystems (system: f { - pkgs = import nixpkgs { inherit system; }; - }); - in { - lib = { - fetchfont = fetchfont; - }; - packages = forAllSystems {pkgs}: { - default = fonts // { sfnt2woff-zopfli = sfnt2woff-zopfli; }; - }; - }; + description = "fonts"; + inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-23.05-small; + outputs = { self, nixpkgs }: + let + allSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; + forAllSystems = f: (nixpkgs.lib.genAttrs allSystems (system: f { + pkgs = import nixpkgs { inherit system; }; + })); + in rec { + #lib = { + # fetchfont = fetchfont; + #}; + packages = forAllSystems ({pkgs}: + with pkgs; + let + fetchfont = callPackage ./fetchfont.nix { pkgs = pkgs // { inherit sfnt2woff-zopfli; }; }; + sfnt2woff-zopfli = callPackage ./sfnt2woff-zopfli.nix {}; + fonts = callPackage ./fonts.nix { fetchfont = fetchfont; }; + default = callPackage ./collection.nix { fonts = fonts; }; + in + fonts // { inherit sfnt2woff-zopfli default; } + ); + devShell = forAllSystems ({pkgs}: + pkgs.mkShell { + name = "fonts-dev"; + nativeBuildInputs = [ packages.${pkgs.system}.sfnt2woff-zopfli pkgs.woff2 ]; + } + ); + }; } diff --git a/fonts.nix b/fonts.nix index 493202a..e960715 100644 --- a/fonts.nix +++ b/fonts.nix @@ -1,51 +1,54 @@ # vim: set noet sw=2 ts=2 sts=2: -{lib, nixpkgs, fetchfont, ...}: -with nixpkgs; { +{lib, pkgs, fetchfont, ...}: +with pkgs; +let + github = path: "https://github.com/${path}"; +in { libre_barcode = fetchfont rec { pname = "LibreBarcode"; version = "1.008"; - src = fetchurl { name = "${pname}-${version}.zip"; hash = "sha256-47ntjMcZR4j5ybGU2UAA5t4FTPvyAvTiDSKYGEdRDQU="; url = "https://github.com/graphicore/librebarcode/releases/download/v${version}/${pname}_v${version}.zip"; }; + src = fetchurl { name = "${pname}-${version}.zip"; hash = "sha256-47ntjMcZR4j5ybGU2UAA5t4FTPvyAvTiDSKYGEdRDQU="; url = github "graphicore/librebarcode/releases/download/v${version}/${pname}_v${version}.zip"; }; }; fira_code = fetchfont rec { pname = "FiraCode"; version = "6.2"; - src = fetchurl { name = "${pname}-${version}.zip"; hash = "sha256-CUmRW6jrJNif2T0Qp/9iP0KDDXxf/D7L+WDk7K0+Pnk="; url = "https://github.com/tonsky/FiraCode/releases/download/${version}/Fira_Code_v${version}.zip"; }; + src = fetchurl { name = "${pname}-${version}.zip"; hash = "sha256-CUmRW6jrJNif2T0Qp/9iP0KDDXxf/D7L+WDk7K0+Pnk="; url = github "tonsky/FiraCode/releases/download/${version}/Fira_Code_v${version}.zip"; }; }; fira_mono = fetchfont rec { pname = "FiraMono"; version = "4.202"; - src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-2GJpZXOH8UTXe6EgERJPMPQj9wZy4VdtwW+Ri7Ft3+Q="; url = "https://github.com/mozilla/Fira/archive/refs/tags/${version}.tar.gz"; }; + src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-2GJpZXOH8UTXe6EgERJPMPQj9wZy4VdtwW+Ri7Ft3+Q="; url = github "mozilla/Fira/archive/refs/tags/${version}.tar.gz"; }; }; alegreya = fetchfont rec { pname = "Alegreya"; version = "2.008"; - src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-RNrL48S2DCA7HWDwpV6/bBOYI/g/0jT5sHjs58sVZ24="; url = "https://github.com/huertatipografica/${pname}/archive/refs/tags/v${version}.tar.gz"; }; + src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-RNrL48S2DCA7HWDwpV6/bBOYI/g/0jT5sHjs58sVZ24="; url = github "huertatipografica/${pname}/archive/refs/tags/v${version}.tar.gz"; }; }; alegreya_sans = fetchfont rec { pname = "Alegreya-Sans"; version = "2.008"; - src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-6lRVctSeGOZ11rcqZ1TaNE4kucrMPSt2wesr+a5zpAI="; url = "https://github.com/huertatipografica/${pname}/archive/refs/tags/v${version}.tar.gz"; }; + src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-6lRVctSeGOZ11rcqZ1TaNE4kucrMPSt2wesr+a5zpAI="; url = github "huertatipografica/${pname}/archive/refs/tags/v${version}.tar.gz"; }; }; inconsolata = fetchfont rec { pname = "Inconsolata"; version = "3.000"; - src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-8tjYumyqeFqWbvF5loIqsUupHsQjQxop4bbEsUvEzaU="; url = "https://github.com/googlefonts/${pname}/archive/refs/tags/v${version}.tar.gz"; }; + src = fetchurl { name = "${pname}-${version}.tar.gz"; hash = "sha256-8tjYumyqeFqWbvF5loIqsUupHsQjQxop4bbEsUvEzaU="; url = github "googlefonts/${pname}/archive/refs/tags/v${version}.tar.gz"; }; }; - rubik_dirt = - fetchfont rec { - pname = "RubikDirt"; - version = "2"; - srcs = let baseurl = "https://github.com/NaN-xyz/Rubik-Filtered/raw/7f47b7f79f903e1d6af9883da43a84928e02b816/dirt/fonts"; - in [ - (fetchurl { name = "${pname}-Regular.ttf"; hash = "sha256-nePZKOQ0pH7IXXWQEsig6/6rCGAHbupOOYmkfF4hMSM="; url = "${baseurl}/ttf/${pname}-Regular.ttf"; }) - (fetchurl { name = "${pname}-Regular.woff2"; hash = "sha256-xh1jUaN5FRaU/omXT7U9T9Qhu+Cl/YddAJnSpgCOqYk="; url = "${baseurl}/webfonts/${pname}-Regular.woff2"; }) - ]; - }; - }; -}; + #rubik_dirt = + # fetchfont rec { + # pname = "RubikDirt"; + # version = "2"; + # srcs = + # let baseurl = github "NaN-xyz/Rubik-Filtered/raw/7f47b7f79f903e1d6af9883da43a84928e02b816/dirt/fonts"; + # in [ + # (fetchurl { name = "${pname}-Regular.ttf"; hash = "sha256-nePZKOQ0pH7IXXWQEsig6/6rCGAHbupOOYmkfF4hMSM="; url = "${baseurl}/ttf/${pname}-Regular.ttf"; }) + # (fetchurl { name = "${pname}-Regular.woff2"; hash = "sha256-xh1jUaN5FRaU/omXT7U9T9Qhu+Cl/YddAJnSpgCOqYk="; url = "${baseurl}/webfonts/${pname}-Regular.woff2"; }) + # ]; + # }; +} diff --git a/sfnt2woff-zopfli.nix b/sfnt2woff-zopfli.nix index ef335f8..f2a9324 100644 --- a/sfnt2woff-zopfli.nix +++ b/sfnt2woff-zopfli.nix @@ -1,6 +1,6 @@ # vim: set noet sw=2 ts=2 sts=2: -{lib, nixpkgs, ...}: -with nixpkgs; +{lib, pkgs, ...}: +with pkgs; stdenv.mkDerivation rec{ pname = "sfnt2woff-zopfli"; version = "1.3.1"; @@ -17,4 +17,4 @@ stdenv.mkDerivation rec{ mkdir -p $out/bin cp sfnt2woff-zopfli $out/bin ''; -}; +}