1
0
Fork 0
mirror of https://github.com/LnL7/nix-darwin.git synced 2024-12-14 11:57:34 +00:00

Merge pull request #754 from emilazy/fonts-use-subdir

fonts: reimplement and rename to `fonts.packages`
This commit is contained in:
Emily 2024-06-15 05:57:11 +01:00 committed by GitHub
commit 801f8ab2bc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 43 additions and 64 deletions

View file

@ -1,37 +1,26 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.fonts;
in
{
imports = [
(mkRenamedOptionModule [ "fonts" "enableFontDir" ] [ "fonts" "fontDir" "enable" ])
(lib.mkRemovedOptionModule [ "fonts" "enableFontDir" ] "No nix-darwin equivalent to this NixOS option. This is not required to install fonts.")
(lib.mkRemovedOptionModule [ "fonts" "fontDir" "enable" ] "No nix-darwin equivalent to this NixOS option. This is not required to install fonts.")
(lib.mkRemovedOptionModule [ "fonts" "fonts" ] ''
This option has been renamed to `fonts.packages' for consistency with NixOS.
Note that the implementation now keeps fonts in `/Library/Fonts/Nix Fonts' to allow them to coexist with fonts not managed by nix-darwin; existing fonts will be left directly in `/Library/Fonts' without getting updates and should be manually removed.'')
];
options = {
fonts.fontDir.enable = mkOption {
type = types.bool;
default = false;
description = ''
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;
fonts.packages = lib.mkOption {
type = lib.types.listOf lib.types.path;
default = [ ];
example = literalExpression "[ pkgs.dejavu_fonts ]";
example = lib.literalExpression "[ pkgs.dejavu_fonts ]";
description = ''
List of fonts to install.
Fonts present in later entries override those with the same filenames
in previous ones.
List of fonts to install into {file}`/Library/Fonts/Nix Fonts`.
'';
};
};
@ -42,43 +31,36 @@ in
{ 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
store_dir=${lib.escapeShellArg builtins.storeDir}
while IFS= read -rd "" f; do
dest="$out/Library/Fonts/Nix Fonts/''${f#"$store_dir/"}"
mkdir -p "''${dest%/*}"
ln -sf "$f" "$dest"
done < <(
find -L ${lib.escapeShellArgs cfg.packages} \
-type f \
-regex '.*\.\(ttf\|ttc\|otf\|dfont\)' \
-print0
)
'';
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
system.activationScripts.fonts.text = ''
printf >&2 'setting up /Library/Fonts/Nix Fonts...\n'
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
# rsync uses the mtime + size of files to determine whether they
# need to be copied by default. This is inadequate for Nix store
# paths, but we don't want to use `--checksum` as it makes
# activation consistently slow when you have large fonts
# installed. Instead, we ensure that fonts are linked according to
# their full store paths in `system.build.fonts`, so that any
# given font path should only ever have one possible content.
${pkgs.rsync}/bin/rsync \
--archive \
--copy-links \
--delete-during \
--delete-missing-args \
"$systemConfig/Library/Fonts/Nix Fonts" \
'/Library/Fonts/'
'';
};

View file

@ -2,22 +2,19 @@
let
font = pkgs.runCommand "font-0.0.0" {} ''
mkdir -p $out/share/fonts
touch $out/share/fonts/Font.ttf
mkdir -p $out
touch $out/Font.ttf
'';
in
{
fonts.fontDir.enable = true;
fonts.fonts = [ font ];
fonts.packages = [ font ];
test = ''
echo "checking fonts in /Library/Fonts" >&2
test -e ${config.out}/Library/Fonts/Font.ttf
echo "checking fonts in /Library/Fonts/Nix Fonts" >&2
test -e "${config.out}/Library/Fonts/Nix Fonts"/*/Font.ttf
echo "checking activation of fonts in /activate" >&2
grep "fontrestore default -n 2>&1" ${config.out}/activate
grep 'ln -fn ".*" /Library/Fonts' ${config.out}/activate || grep 'rsync -az --inplace ".*" /Library/Fonts' ${config.out}/activate
grep 'rm "/Library/Fonts/.*"' ${config.out}/activate
grep '/Library/Fonts/Nix Fonts' ${config.out}/activate
'';
}