diff --git a/nixos/modules/config/fonts/fontconfig-ultimate.nix b/nixos/modules/config/fonts/fontconfig-ultimate.nix
index 02568f9de51..3ea6e1fa53b 100644
--- a/nixos/modules/config/fonts/fontconfig-ultimate.nix
+++ b/nixos/modules/config/fonts/fontconfig-ultimate.nix
@@ -3,6 +3,95 @@
with lib;
let fcBool = x: if x then "true" else "false";
+
+ cfg = config.fonts.fontconfig.ultimate;
+
+ latestVersion = pkgs.fontconfig.configVersion;
+
+ # fontconfig ultimate main configuration file
+ # priority 52
+ fontconfigUltimateConf = pkgs.writeText "fc-52-fontconfig-ultimate.conf" ''
+
+
+
+
+ ${optionalString (!cfg.allowBitmaps) ''
+
+
+
+
+ false
+
+
+
+ ''}
+
+ ${optionalString cfg.allowType1 ''
+
+
+
+
+
+ Type 1
+
+
+
+
+ ''}
+
+
+
+
+ ${fcBool cfg.useEmbeddedBitmaps}
+
+
+
+
+
+
+ ${fcBool cfg.forceAutohint}
+
+
+
+
+
+
+ ${fcBool cfg.renderMonoTTFAsBitmap}
+
+
+
+
+ '';
+
+ # The configuration to be included in /etc/font/
+ confPkg = pkgs.runCommand "font-ultimate-conf" {} ''
+ support_folder=$out/etc/fonts/conf.d
+ latest_folder=$out/etc/fonts/${latestVersion}/conf.d
+
+ mkdir -p $support_folder
+ mkdir -p $latest_folder
+
+ # 52-fontconfig-ultimate.conf
+ ln -s ${fontconfigUltimateConf} \
+ $support_folder/52-fontconfig-ultimate.conf
+ ln -s ${fontconfigUltimateConf} \
+ $latest_folder/52-fontconfig-ultimate.conf
+
+ # fontconfig ultimate substitutions
+ ${optionalString (cfg.substitutions != "none") ''
+ ln -s ${pkgs.fontconfig-ultimate.confd}/etc/fonts/presets/${cfg.substitutions}/*.conf \
+ $support_folder
+ ln -s ${pkgs.fontconfig-ultimate.confd}/etc/fonts/presets/${cfg.substitutions}/*.conf \
+ $latest_folder
+ ''}
+
+ # fontconfig ultimate various configuration files
+ ln -s ${pkgs.fontconfig-ultimate.confd}/etc/fonts/conf.d/*.conf \
+ $support_folder
+ ln -s ${pkgs.fontconfig-ultimate.confd}/etc/fonts/conf.d/*.conf \
+ $latest_folder
+ '';
+
in
{
@@ -114,80 +203,11 @@ in
};
+ config = mkIf (config.fonts.fontconfig.enable && cfg.enable) {
- config =
- let ultimate = config.fonts.fontconfig.ultimate;
- fontconfigUltimateConf = ''
-
-
-
+ fonts.fontconfig.confPackages = [ confPkg ];
+ environment.variables = cfg.rendering;
- ${optionalString (!ultimate.allowBitmaps) ''
-
-
-
-
- false
-
-
-
- ''}
-
- ${optionalString ultimate.allowType1 ''
-
-
-
-
-
- Type 1
-
-
-
-
- ''}
-
-
-
-
- ${fcBool ultimate.useEmbeddedBitmaps}
-
-
-
-
-
-
- ${fcBool ultimate.forceAutohint}
-
-
-
-
-
-
- ${fcBool ultimate.renderMonoTTFAsBitmap}
-
-
-
- ${optionalString (ultimate.substitutions != "none") ''
-
- ${pkgs.fontconfig-ultimate.confd}/etc/fonts/presets/${ultimate.substitutions}
- ''}
-
- ${pkgs.fontconfig-ultimate.confd}/etc/fonts/conf.d
-
-
- '';
- in mkIf (config.fonts.fontconfig.enable && ultimate.enable) {
-
- environment.etc."fonts/conf.d/52-fontconfig-ultimate.conf" = {
- text = fontconfigUltimateConf;
- };
-
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/52-fontconfig-ultimate.conf" = {
- text = fontconfigUltimateConf;
- };
-
- environment.variables = ultimate.rendering;
-
- };
+ };
}
diff --git a/nixos/modules/config/fonts/fontconfig.nix b/nixos/modules/config/fonts/fontconfig.nix
index 1eaebe4b2bb..6494e09111d 100644
--- a/nixos/modules/config/fonts/fontconfig.nix
+++ b/nixos/modules/config/fonts/fontconfig.nix
@@ -1,7 +1,203 @@
+/*
+
+NixOS support 2 fontconfig versions, "support" and "latest".
+
+- "latest" refers to default fontconfig package (pkgs.fontconfig).
+ configuration files are linked to /etc/fonts/VERSION/conf.d/
+- "support" refers to supportPkg (pkgs."fontconfig_${supportVersion}").
+ configuration files are linked to /etc/fonts/conf.d/
+
+This module generates a package containing configuration files and link it in /etc/fonts.
+
+Fontconfig reads files in folder name / file name order, so the number prepended to the configuration file name decide the order of parsing.
+Low number means high priority.
+
+Default fonts should have a high priority (low number) to be at the head of the preferred fonts list, fontconfig advise the 30~40 range.
+
+*/
+
{ config, lib, pkgs, ... }:
with lib;
+let cfg = config.fonts.fontconfig;
+
+ fcBool = x: "" + (if x then "true" else "false") + "";
+
+ # back-supported fontconfig version and package
+ # version is used for font cache generation
+ supportVersion = "210";
+ supportPkg = pkgs."fontconfig_${supportVersion}";
+
+ # latest fontconfig version and package
+ # version is used for configuration folder name, /etc/fonts/VERSION/
+ # note: format differs from supportVersion and can not be used with makeCacheConf
+ latestVersion = pkgs.fontconfig.configVersion;
+ latestPkg = pkgs.fontconfig;
+
+ # supported version fonts.conf
+ supportFontsConf = pkgs.makeFontsConf { fontconfig = supportPkg; fontDirectories = config.fonts.fonts; };
+
+ # configuration file to read fontconfig cache
+ # version dependent
+ # priority 0
+ cacheConfSupport = makeCacheConf { version = supportVersion; };
+ cacheConfLatest = makeCacheConf {};
+
+ # generate the font cache setting file for a fontconfig version
+ # use latest when no version is passed
+ makeCacheConf = { version ? null }:
+ let
+ fcPackage = if builtins.isNull version
+ then "fontconfig"
+ else "fontconfig_${version}";
+ makeCache = fontconfig: pkgs.makeFontsCache { inherit fontconfig; fontDirectories = config.fonts.fonts; };
+ cache = makeCache pkgs."${fcPackage}";
+ cache32 = makeCache pkgs.pkgsi686Linux."${fcPackage}";
+ in
+ pkgs.writeText "fc-00-nixos-cache.conf" ''
+
+
+
+
+ ${concatStringsSep "\n" (map (font: "${font}") config.fonts.fonts)}
+
+ ${cache}
+ ${optionalString (pkgs.stdenv.isx86_64 && cfg.cache32Bit) ''
+ ${cache32}
+ ''}
+
+ '';
+
+ # rendering settings configuration file
+ # priority 10
+ renderConf = pkgs.writeText "fc-10-nixos-rendering.conf" ''
+
+
+
+
+
+
+
+ ${fcBool cfg.hinting.enable}
+
+
+ ${fcBool cfg.hinting.autohint}
+
+
+ hint${cfg.hinting.style}
+
+
+ ${fcBool cfg.antialias}
+
+
+ ${cfg.subpixel.rgba}
+
+
+ lcd${cfg.subpixel.lcdfilter}
+
+
+
+ ${optionalString (cfg.dpi != 0) ''
+
+
+ ${toString cfg.dpi}
+
+
+ ''}
+
+
+ '';
+
+ # prefered default fonts configuration file
+ # priority 30
+ genericAliasConf =
+ let genDefault = fonts: name:
+ optionalString (fonts != []) ''
+
+ ${name}
+
+ ${concatStringsSep ""
+ (map (font: ''
+ ${font}
+ '') fonts)}
+
+
+ '';
+ in
+ pkgs.writeText "fc-30-nixos-generic-alias.conf" ''
+
+
+
+
+
+ ${genDefault cfg.defaultFonts.sansSerif "sans-serif"}
+
+ ${genDefault cfg.defaultFonts.serif "serif"}
+
+ ${genDefault cfg.defaultFonts.monospace "monospace"}
+
+
+ '';
+
+ # user settings configuration file
+ # priority 99
+ userConf = pkgs.writeText "fc-99-user.conf" ''
+
+
+
+ fontconfig/conf.d
+ fontconfig/fonts.conf
+
+ '';
+
+ # fontconfig configuration package
+ confPkg = pkgs.runCommand "fontconfig-conf" {} ''
+ support_folder=$out/etc/fonts
+ latest_folder=$out/etc/fonts/${latestVersion}
+
+ mkdir -p $support_folder/conf.d
+ mkdir -p $latest_folder/conf.d
+
+ # fonts.conf
+ ln -s ${supportFontsConf} $support_folder/fonts.conf
+ ln -s ${latestPkg.out}/etc/fonts/fonts.conf \
+ $latest_folder/fonts.conf
+
+ # fontconfig default config files
+ ln -s ${supportPkg.out}/etc/fonts/conf.d/*.conf \
+ $support_folder/conf.d/
+ ln -s ${latestPkg.out}/etc/fonts/conf.d/*.conf \
+ $latest_folder/conf.d/
+
+ # 00-nixos-cache.conf
+ ln -s ${cacheConfSupport} \
+ $support_folder/conf.d/00-nixos-cache.conf
+ ln -s ${cacheConfLatest} $latest_folder/conf.d/00-nixos-cache.conf
+
+ # 10-nixos-rendering.conf
+ ln -s ${renderConf} $support_folder/conf.d/10-nixos-rendering.conf
+ ln -s ${renderConf} $latest_folder/conf.d/10-nixos-rendering.conf
+
+ # 30-nixos-generic-alias.conf
+ ln -s ${genericAliasConf} $support_folder/conf.d/30-nixos-generic-alias.conf
+ ln -s ${genericAliasConf} $latest_folder/conf.d/30-nixos-generic-alias.conf
+
+ # 99-user.conf
+ ${optionalString cfg.includeUserConf ''
+ ln -s ${userConf} $support_folder/conf.d/99-user.conf
+ ln -s ${userConf} $latest_folder/conf.d/99-user.conf
+ ''}
+ '';
+
+ # Package with configuration files
+ # this merge all the packages in the fonts.fontconfig.confPackages list
+ fontconfigEtc = pkgs.buildEnv {
+ name = "fontconfig-etc";
+ paths = cfg.confPackages;
+ ignoreCollisions = true;
+ };
+in
{
options = {
@@ -21,6 +217,15 @@ with lib;
'';
};
+ confPackages = mkOption {
+ internal = true;
+ type = with types; listOf path;
+ default = [ ];
+ description = ''
+ Fontconfig configuration packages.
+ '';
+ };
+
antialias = mkOption {
type = types.bool;
default = true;
@@ -142,136 +347,11 @@ with lib;
};
};
+ config = mkIf cfg.enable {
+ fonts.fontconfig.confPackages = [ confPkg ];
- config =
- let fontconfig = config.fonts.fontconfig;
- fcBool = x: "" + (if x then "true" else "false") + "";
- renderConf = ''
-
-
-
-
-
-
-
- ${fcBool fontconfig.hinting.enable}
-
-
- ${fcBool fontconfig.hinting.autohint}
-
-
- hint${fontconfig.hinting.style}
-
-
- ${fcBool fontconfig.antialias}
-
-
- ${fontconfig.subpixel.rgba}
-
-
- lcd${fontconfig.subpixel.lcdfilter}
-
-
-
- ${optionalString (fontconfig.dpi != 0) ''
-
-
- ${toString fontconfig.dpi}
-
-
- ''}
-
-
- '';
- genericAliasConf = ''
-
-
-
-
-
- ${optionalString (fontconfig.defaultFonts.sansSerif != []) ''
-
- sans-serif
-
- ${concatStringsSep "\n"
- (map (font: "${font}")
- fontconfig.defaultFonts.sansSerif)}
-
-
- ''}
- ${optionalString (fontconfig.defaultFonts.serif != []) ''
-
- serif
-
- ${concatStringsSep "\n"
- (map (font: "${font}")
- fontconfig.defaultFonts.serif)}
-
-
- ''}
- ${optionalString (fontconfig.defaultFonts.monospace != []) ''
-
- monospace
-
- ${concatStringsSep "\n"
- (map (font: "${font}")
- fontconfig.defaultFonts.monospace)}
-
-
- ''}
-
-
- '';
- in mkIf fontconfig.enable {
-
- # Fontconfig 2.10 backward compatibility
-
- # Bring in the default (upstream) fontconfig configuration, only for fontconfig 2.10
- environment.etc."fonts/fonts.conf".source =
- pkgs.makeFontsConf { fontconfig = pkgs.fontconfig_210; fontDirectories = config.fonts.fonts; };
-
- environment.etc."fonts/conf.d/10-nixos-rendering.conf".text = renderConf;
- environment.etc."fonts/conf.d/60-nixos-generic-alias.conf".text = genericAliasConf;
-
- # Versioned fontconfig > 2.10. Take shared fonts.conf from fontconfig.
- # Otherwise specify only font directories.
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/fonts.conf".source =
- "${pkgs.fontconfig.out}/etc/fonts/fonts.conf";
-
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/00-nixos.conf".text =
- let
- cache = fontconfig: pkgs.makeFontsCache { inherit fontconfig; fontDirectories = config.fonts.fonts; };
- in ''
-
-
-
-
- ${concatStringsSep "\n" (map (font: "${font}") config.fonts.fonts)}
-
- ${cache pkgs.fontconfig}
- ${optionalString (pkgs.stdenv.isx86_64 && config.fonts.fontconfig.cache32Bit) ''
- ${cache pkgs.pkgsi686Linux.fontconfig}
- ''}
-
- '';
-
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/10-nixos-rendering.conf".text = renderConf;
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/60-nixos-generic-alias.conf".text = genericAliasConf;
-
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/99-user.conf" = {
- enable = fontconfig.includeUserConf;
- text = ''
-
-
-
- fontconfig/conf.d
- fontconfig/fonts.conf
-
- '';
- };
-
- environment.systemPackages = [ pkgs.fontconfig ];
-
- };
+ environment.systemPackages = [ pkgs.fontconfig ];
+ environment.etc.fonts.source = "${fontconfigEtc}/etc/fonts/";
+ };
}
diff --git a/pkgs/development/libraries/fontconfig/default.nix b/pkgs/development/libraries/fontconfig/default.nix
index 6acf1ebce29..f18ea5948f1 100644
--- a/pkgs/development/libraries/fontconfig/default.nix
+++ b/pkgs/development/libraries/fontconfig/default.nix
@@ -68,7 +68,6 @@ stdenv.mkDerivation rec {
cd "$out/etc/fonts"
rm conf.d/{50-user,51-local}.conf
"${libxslt.bin}/bin/xsltproc" --stringparam fontDirectories "${fontbhttf}" \
- --stringparam fontconfig "$out" \
--stringparam fontconfigConfigVersion "${configVersion}" \
--path $out/share/xml/fontconfig \
${./make-fonts-conf.xsl} $out/etc/fonts/fonts.conf \
diff --git a/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl b/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl
index b59fcd0187b..dddbbe9e516 100644
--- a/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl
+++ b/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl
@@ -28,8 +28,6 @@
/var/cache/fontconfig
-
- /etc/fonts/conf.d
/etc/fonts//conf.d