{pkgs, config, ...}: ###### interface let inherit (pkgs.lib) mkOption; options = { fonts = { enableFontConfig = mkOption { # !!! should be enableFontconfig default = true; description = " If enabled, a Fontconfig configuration file will be built pointing to a set of default fonts. If you don't care about running X11 applications or any other program that uses Fontconfig, you can turn this option off and prevent a dependency on all those fonts. "; }; # should be move elsewhere. enableGhostscriptFonts = mkOption { default = false; description = " Whether to add the fonts provided by Ghostscript (such as various URW fonts and the ``Base-14'' Postscript fonts) to the list of system fonts, making them available to X11 applications. "; }; enableFontDir = mkOption { default = false; description = " Whether to create a directory with links to all fonts in share - so user can configure vncserver script one time (I mean per-user vncserver, so global service is not a good solution). "; }; # TODO: find another name for it. fonts = mkOption { default = [ # - the user's .fonts directory "~/.fonts" # - the user's current profile "~/.nix-profile/lib/X11/fonts" "~/.nix-profile/share/fonts" # - the default profile "/nix/var/nix/profiles/default/lib/X11/fonts" "/nix/var/nix/profiles/default/share/fonts" ]; description = " List of primary font paths. "; apply = list: list ++ [ # - a few statically built locations pkgs.xorg.fontbhttf pkgs.xorg.fontbhlucidatypewriter100dpi pkgs.xorg.fontbhlucidatypewriter75dpi pkgs.ttf_bitstream_vera pkgs.freefont_ttf pkgs.xorg.fontbh100dpi pkgs.xorg.fontmiscmisc pkgs.xorg.fontcursormisc ] ++ pkgs.lib.optional config.fonts.enableCoreFonts pkgs.corefonts ++ pkgs.lib.optional config.fonts.enableGhostscriptFonts "${pkgs.ghostscript}/share/ghostscript/fonts" ++ config.fonts.extraFonts; }; extraFonts = mkOption { default = []; description = " List of additional fonts. "; }; enableCoreFonts = mkOption { default = true; description = " Whether to include MS Core Fonts (redistributable, but only verbatim). "; }; }; }; in ###### implementation let inherit (pkgs) builderDefs ttmkfdir; inherit (pkgs.xorg) mkfontdir mkfontscale fontalias; fontDirs = config.fonts.fonts; localDefs = with builderDefs; builderDefs.passthru.function rec { src = "";/* put a fetchurl here */ buildInputs = [mkfontdir mkfontscale ttmkfdir]; configureFlags = []; inherit fontDirs; installPhase = FullDepEntry (" list=''; for i in ${toString fontDirs} ; do if [ -d \$i/ ]; then list=\"\$list \$i\"; fi; done list=\$(find \$list -name fonts.dir); fontDirs=''; for i in \$list ; do fontDirs=\"\$fontDirs \$(dirname \$i)\"; done; mkdir -p \$out/share/X11-fonts/; for i in \$(find \$fontDirs -type f -o -type l); do j=\${i##*/} if ! test -e \$out/share/X11-fonts/\${j}; then ln -s \$i \$out/share/X11-fonts/\${j}; fi; done; cd \$out/share/X11-fonts/ rm fonts.dir rm fonts.scale rm fonts.alias mkfontdir mkfontscale mv fonts.scale fonts.scale.old mv fonts.dir fonts.dir.old ttmkfdir cat fonts.scale.old >> fonts.scale cat fonts.dir.old >> fonts.dir rm fonts.dir.old rm fonts.scale.old cat \$( find ${fontalias}/ -name fonts.alias) >fonts.alias ") ["minInit" "addInputs"]; }; x11Fonts = with localDefs; stdenv.mkDerivation rec { name = "X11-fonts"; builder = writeScript (name + "-builder") (textClosure localDefs [installPhase doForceShare doPropagate]); meta = { description = " Directory to contain all X11 fonts requested. "; }; }; inherit (pkgs.lib) mkIf; in { require = [ options ]; system = { build = { inherit x11Fonts; }; }; environment = { # Configuration file for fontconfig used to locate # (X11) client-rendered fonts. etc = mkIf config.fonts.enableFontConfig [{ source = pkgs.makeFontsConf { fontDirectories = config.fonts.fonts; }; target = "fonts/fonts.conf"; }]; }; }