summaryrefslogtreecommitdiff
path: root/modules/fonts/default.nix
blob: 16f0258a3158a228cf3877b27fc1bfcdff96c5af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
{ config, lib, pkgs, ... }:

with lib;

let
  cfg = config.fonts;
in

{
  imports = [
    (mkRenamedOptionModule [ "fonts" "enableFontDir" ] [ "fonts" "fontDir" "enable" ])
  ];

  options = {
    fonts.fontDir.enable = mkOption {
      type = types.bool;
      default = false;
      description = lib.mdDoc ''
        Whether to enable font management and install configured fonts to
        {file}`/Library/Fonts`.

        NOTE: removes any manually-added fonts.
      '';
    };

    fonts.fonts = mkOption {
      type = types.listOf types.path;
      default = [ ];
      example = literalExpression "[ pkgs.dejavu_fonts ]";
      description = lib.mdDoc ''
        List of fonts to install.

        Fonts present in later entries override those with the same filenames
        in previous ones.
      '';
    };
  };

  config = {

    system.build.fonts = pkgs.runCommand "fonts"
      { preferLocalBuild = true; }
      ''
        mkdir -p $out/Library/Fonts
        font_regexp='.*\.\(ttf\|ttc\|otf\|dfont\)'
        find -L ${toString cfg.fonts} -regex "$font_regexp" -type f -print0 | while IFS= read -rd "" f; do
            ln -sf "$f" $out/Library/Fonts
        done
      '';

    system.activationScripts.fonts.text = optionalString cfg.fontDir.enable ''
      # Set up fonts.
      echo "configuring fonts..." >&2
      find -L "$systemConfig/Library/Fonts" -type f -print0 | while IFS= read -rd "" l; do
          font=''${l##*/}
          f=$(readlink -f "$l")
          if [ ! -e "/Library/Fonts/$font" ]; then
              echo "updating font $font..." >&2
              ln -fn -- "$f" /Library/Fonts 2>/dev/null || {
                echo "Could not create hard link. Nix is probably on another filesystem. Copying the font instead..." >&2
                rsync -az --inplace "$f" /Library/Fonts
              }
          fi
      done

      if [[ "`sw_vers -productVersion`" < "13.0" ]]; then
        fontrestore default -n 2>&1 | while read -r f; do
            case $f in
                /Library/Fonts/*)
                    font=''${f##*/}
                    if [ ! -e "$systemConfig/Library/Fonts/$font" ]; then
                        echo "removing font $font..." >&2
                        rm "/Library/Fonts/$font"
                    fi
                    ;;
                /*)
                    # ignoring unexpected fonts
                    ;;
            esac
        done
      fi
    '';

  };
}