Skip to content

Commit

Permalink
fontconfig: Only read versioned config dirs
Browse files Browse the repository at this point in the history
Falling back to unversioned `/etc/fonts/conf.d` when versioned one does not exist
is problematic since it only occurs on non-NixOS systems and those are likely
to have a different version of fontconfig. When those versions use incompatible
elements in the config, apps using fontconfig will crash.

Instead, we are now falling back to the in-package `fonts.conf` file that loads
both the versioned global `conf.d` directory and the in-package `conf.d` since using
upstream settings on non-NixOS is preferable to not being able to use apps there.

In fact, we would not even need to link `fonts.conf`, as the in-package `fonts.conf`
will be always used unless someone creates the global one manually (the option is still
retained if one wants to write a custom NixOS module and to avoid unnecessary stat call on NixOS).

Additionally, since the `fonts.conf` will always load `conf.d` from the package, we no longer
need to install them to sytem `/etc` in the module. This needed some mucking with `50-user.conf`
which disables configs in user directories (a good thing IMO, NixOS module will turn it back on)
but otherwise, it is cleaner. The files are still prioritized by their name, regardless of their location.

See NixOS#73795 (comment) for more information.
  • Loading branch information
jtojnar committed Jul 11, 2020
1 parent 87786bc commit edf2541
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 22 deletions.
16 changes: 6 additions & 10 deletions nixos/modules/config/fonts/fontconfig.nix
Original file line number Diff line number Diff line change
Expand Up @@ -214,15 +214,7 @@ let
# fontconfig default config files
ln -s ${supportPkg.out}/etc/fonts/conf.d/*.conf \
$support_folder/
ln -s ${latestPkg.out}/etc/fonts/conf.d/*.conf \
$latest_folder/
# update latest 51-local.conf path to look at the latest local.conf
rm $latest_folder/51-local.conf
substitute ${latestPkg.out}/etc/fonts/conf.d/51-local.conf \
$latest_folder/51-local.conf \
--replace local.conf /etc/fonts/${latestVersion}/local.conf
# Latest fontconfig is configured to look for the upstream defaults inside the package.
# 00-nixos-cache.conf
ln -s ${cacheConfSupport} \
Expand All @@ -236,7 +228,11 @@ let
# 50-user.conf
${optionalString (!cfg.includeUserConf) ''
rm $support_folder/50-user.conf
rm $latest_folder/50-user.conf
''}
# Since latest fontconfig looks for default files inside the package,
# we had to move this one elsewhere to be able to exclude it here.
${optionalString cfg.includeUserConf ''
ln -s ${latestPkg.out}/etc/fonts/conf.d.bak/50-user.conf $latest_folder/50-user.conf
''}
# local.conf (indirect priority 51)
Expand Down
28 changes: 18 additions & 10 deletions pkgs/development/libraries/fontconfig/config-compat.patch
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
commit 05c6adf8104b4321d3a3716a7b9feb6bf223ed0c (HEAD, nixpkgs)
Author: Vladimír Čunát <vcunat@gmail.com>
Date: Tue Nov 4 12:24:25 2014 +0100
From 2ff9b53ce755be183ef9274f7dd3f9ac537173f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= <vcunat@gmail.com>
Date: Tue, 4 Nov 2014 12:24:25 +0100
Subject: [PATCH] add check for /etc/fonts/@configVersion@/fonts.conf

add check for /etc/fonts/@configVersion@/fonts.conf

It's checked between FONTCONFIG_FILE and the usual /etc/fonts/fonts.conf.
Also, hardcode /etc/fonts/fonts.conf to prevent accidental override.
It's checked between FONTCONFIG_FILE and the in-package etc/fonts/fonts.conf.
The latter is used so that on non-NixOS distributions, fontconfig works at least
with upstream defaults, even when the global config is incompatible.

Co-Authored-By: Jan Tojnar <jtojnar@gmail.com>
---
src/fccfg.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/fccfg.c b/src/fccfg.c
index 6377fd7..e9eb10a 100644
index 342c996..98a1324 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -2070,8 +2070,13 @@ FcConfigFilename (const FcChar8 *url)
@@ -2391,8 +2391,13 @@ FcConfigGetFilename (FcConfig *config,
if (!url || !*url)
{
url = (FcChar8 *) getenv ("FONTCONFIG_FILE");
Expand All @@ -22,7 +27,10 @@ index 6377fd7..e9eb10a 100644
+ }
if (!url)
- url = (FcChar8 *) FONTCONFIG_FILE;
+ url = (FcChar8 *) "/etc/fonts/fonts.conf";
+ url = (FcChar8 *) FONTCONFIG_PATH "/" FONTCONFIG_FILE;
}
file = 0;

--
2.26.2

14 changes: 12 additions & 2 deletions pkgs/development/libraries/fontconfig/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@

/** Font configuration scheme
- ./config-compat.patch makes fontconfig try the following root configs, in order:
$FONTCONFIG_FILE, /etc/fonts/${configVersion}/fonts.conf, /etc/fonts/fonts.conf
$FONTCONFIG_FILE, /etc/fonts/${configVersion}/fonts.conf, ${fontconfig.out}/etc/fonts/fonts.conf
This is done not to override config of pre-2.11 versions (which just blow up)
and still use *global* font configuration at both NixOS or non-NixOS.
and still use *global* font configuration at NixOS,
falling back to upstream defaults on non-NixOS.
- NixOS creates /etc/fonts/${configVersion}/fonts.conf link to $out/etc/fonts/fonts.conf,
and other modifications should go to /etc/fonts/${configVersion}/conf.d
- See ./make-fonts-conf.xsl for config details.
Expand Down Expand Up @@ -99,11 +100,20 @@ stdenv.mkDerivation rec {
postInstall = ''
cd "$out/etc/fonts"
xsltproc --stringparam fontDirectories "${dejavu_fonts.minimal}" \
--stringparam fontconfig "$out" \
--stringparam fontconfigConfigVersion "${configVersion}" \
--path $out/share/xml/fontconfig \
${./make-fonts-conf.xsl} $out/etc/fonts/fonts.conf \
> fonts.conf.tmp
mv fonts.conf.tmp $out/etc/fonts/fonts.conf
# Make it easier to remove user config in NixOS module.
mkdir -p $out/etc/fonts/conf.d.bak
mv $out/etc/fonts/conf.d/50-user.conf $out/etc/fonts/conf.d.bak
# update latest 51-local.conf path to look at the latest local.conf
substituteInPlace $out/etc/fonts/conf.d/51-local.conf \
--replace local.conf /etc/fonts/${configVersion}/local.conf
'';

passthru = {
Expand Down
3 changes: 3 additions & 0 deletions pkgs/development/libraries/fontconfig/make-fonts-conf.xsl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
<!-- versioned system-wide config -->
<include ignore_missing="yes">/etc/fonts/<xsl:value-of select="$fontconfigConfigVersion" />/conf.d</include>

<!-- upstream config -->
<include><xsl:value-of select="$fontconfig" />/etc/fonts/conf.d</include>

<dir prefix="xdg">fonts</dir>
<xsl:for-each select="str:tokenize($fontDirectories)">
<dir><xsl:value-of select="." /></dir>
Expand Down

0 comments on commit edf2541

Please sign in to comment.