diff --git a/hosts/common/programs/fontconfig.nix b/hosts/common/programs/fontconfig.nix index 5809b7906..9aaa8edcc 100644 --- a/hosts/common/programs/fontconfig.nix +++ b/hosts/common/programs/fontconfig.nix @@ -9,31 +9,11 @@ let # see: # and: - # nixpkgs creates a fontconfig cache, but only when *not* cross compiling. - # but the alternative is that fonts are cached purely at runtime, in ~/.cache/fontconfig, + # nixpkgs creates a fontconfig cache, which covers 99% of apps. + # if build-time caching fails for some reason, then fonts are cached at runtime, in ~/.cache/fontconfig, # and that needs to either be added to the sandbox of *every* app, # or font-heavy apps are several *seconds* slower to launch. - # - # N.B.: fc-cache produces output based on the architecture it's run on, - # e.g. /var/fontconfig/cache/-aarch64.cache-9 or -x86_64.cache-9 - # this means we'd better emulate it -- don't run the host binary. - # - # TODO: upstream this into `make-fonts-cache.nix`? - cache = (pkgs.makeFontsCache { fontDirectories = config.fonts.packages; }).overrideAttrs (upstream: { - buildCommand = lib.replaceStrings - [ "fc-cache" ] - [ "${pkgs.stdenv.hostPlatform.emulator pkgs.buildPackages} ${lib.getExe' pkgs.fontconfig.bin "fc-cache"}" ] - upstream.buildCommand - ; - }); - cacheConf = pkgs.writeTextDir "etc/fonts/conf.d/01-nixos-cache-cross.conf" '' - - - - - ${cache} - - ''; + noUserCacheConf = pkgs.runCommandNoCC "etc-fonts-fonts.conf-no-user" {} '' cp ${pkgs.fontconfig.out}/etc/fonts/fonts.conf . substituteInPlace fonts.conf \ @@ -55,6 +35,7 @@ in fonts = lib.mkIf config.sane.programs.fontconfig.enabled { fontconfig.enable = true; + fontconfig.cache32Bit = true; #< TODO: remove (here for testing) fontconfig.defaultFonts = { emoji = [ "Noto Color Emoji" @@ -78,16 +59,13 @@ in ]; }; - fontconfig.confPackages = lib.mkBefore ([ + fontconfig.confPackages = lib.mkBefore [ # XXX(2024-12-18): electron apps (signal-desktop, discord) duplicate the entire font cache (1-2MB) to ~/.cache/fontconfig # just to update a tiny section (4KB). # patch instead to not have a user font cache. they will work, but complain "Fontconfig error: No writable cache directories". # proper fix: see if electron apps need some specific font i'm missing, or are just being dumb? noUserCacheConf - ] ++ lib.optionals (pkgs.stdenv.hostPlatform != pkgs.stdenv.buildPlatform) [ - # nixpkgs builds a cache file, but only for non-cross. i want it always, so add my own cache -- but ONLY for cross. - cacheConf - ]); + ]; #vvv enables dejavu_fonts, freefont_ttf, gyre-fonts, liberation_ttf, unifont, noto-fonts-emoji enableDefaultPackages = false; diff --git a/pkgs/by-name/nixpkgs-bootstrap/patches.nix b/pkgs/by-name/nixpkgs-bootstrap/patches.nix index 3c61517fd..1d5bdb346 100644 --- a/pkgs/by-name/nixpkgs-bootstrap/patches.nix +++ b/pkgs/by-name/nixpkgs-bootstrap/patches.nix @@ -40,7 +40,21 @@ in hash = "sha256-D8Royett8CSZD7xHYEj6qvJCMFaFKz8SNOIBABapgDc="; }) + # TODO: send branch `pr-make-fonts-cache` out for review: + # remove `fontconfig.cache32Bit = true` from fontconfig.nix after merge (and maybe after seeing if it's beneficial for signal/electron apps?) (fetchpatch' { + name = "makeFontsCache: fix cross compilation"; + saneCommit = "e021ee13f909e6eb7c019b5cd1acf9eac0cd0f67"; + hash = "sha256-3fJtcYfIDIIcn2p9LunPmRX1DWlcQ33OAw3Ok3sUs8g="; + }) + (fetchpatch' { + name = "nixos/fonts: ship fontconfig caches even for cross-compiled hosts"; + saneCommit = "9435a2b422f090b25f4aa5aee53be1341626672d"; + hash = "sha256-4bhzdWxQ650+4bq4+2K4vJb/iQSPtppp3tBrs+qGdNQ="; + }) + + (fetchpatch' { + # 2025-03-18: merged into master name = "nvimpager: enable strictDeps & cleanup inputs"; prUrl = "https://github.com/NixOS/nixpkgs/pull/390878"; # saneCommit = "e55b9041bc27a89549995a8d5f4f458f770ae8fd";