forked from mirrors/nixpkgs
edf2541f02
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 https://github.com/NixOS/nixpkgs/pull/73795#issuecomment-634370125 for more information.
131 lines
4.1 KiB
Nix
131 lines
4.1 KiB
Nix
{ stdenv
|
|
, fetchpatch
|
|
, substituteAll
|
|
, fetchurl
|
|
, pkg-config
|
|
, freetype
|
|
, expat
|
|
, libxslt
|
|
, gperf
|
|
, dejavu_fonts
|
|
, autoreconfHook
|
|
}:
|
|
|
|
/** Font configuration scheme
|
|
- ./config-compat.patch makes fontconfig try the following root configs, in order:
|
|
$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 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.
|
|
|
|
*/
|
|
|
|
let
|
|
configVersion = "2.13"; # bump whenever fontconfig breaks compatibility with older configurations
|
|
in
|
|
stdenv.mkDerivation rec {
|
|
pname = "fontconfig";
|
|
version = "2.13.92";
|
|
|
|
src = fetchurl {
|
|
url = "http://fontconfig.org/release/${pname}-${version}.tar.xz";
|
|
sha256 = "0kkfsvxcvcphm9zcgsh646gix3qn4spz555wa1jp5hbq70l62vjh";
|
|
};
|
|
|
|
patches = [
|
|
(substituteAll {
|
|
src = ./config-compat.patch;
|
|
inherit configVersion;
|
|
})
|
|
|
|
# Fix fonts not being loaded when missing included configs that have ignore_missing="yes".
|
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1744377
|
|
(fetchpatch {
|
|
url = "https://gitlab.freedesktop.org/fontconfig/fontconfig/commit/fcada522913e5e07efa6367eff87ace9f06d24c8.patch";
|
|
sha256 = "1jbm3vw45b3qjnqrh2545v1k8vmb29c09v2wj07jnrq3lnchbvmn";
|
|
})
|
|
|
|
# Register JoyPixels as an emoji font.
|
|
# https://gitlab.freedesktop.org/fontconfig/fontconfig/merge_requests/67
|
|
(fetchpatch {
|
|
url = "https://gitlab.freedesktop.org/fontconfig/fontconfig/commit/65087ac7ce4cc5f2109967c1380b474955dcb590.patch";
|
|
sha256 = "1dkrbqx1c1d8yfnx0igvv516wanw2ksrpm3fbpm2h9nw0hccwqvm";
|
|
})
|
|
|
|
# Fix invalid DTD in reset-dirs.
|
|
# https://gitlab.freedesktop.org/fontconfig/fontconfig/merge_requests/78
|
|
(fetchpatch {
|
|
url = "https://gitlab.freedesktop.org/fontconfig/fontconfig/commit/a4aa66a858f1ecd375c5efe5916398281f73f794.patch";
|
|
sha256 = "1j4ky8jhpllfm1lh2if34xglh2hl79nsa0xxgzxpj9sx6h4v99j5";
|
|
})
|
|
];
|
|
|
|
outputs = [ "bin" "dev" "lib" "out" ]; # $out contains all the config
|
|
|
|
nativeBuildInputs = [
|
|
gperf
|
|
libxslt
|
|
pkg-config
|
|
autoreconfHook
|
|
];
|
|
|
|
buildInputs = [
|
|
expat
|
|
];
|
|
|
|
propagatedBuildInputs = [
|
|
freetype
|
|
];
|
|
|
|
configureFlags = [
|
|
"--with-arch=${stdenv.hostPlatform.parsed.cpu.name}"
|
|
"--with-cache-dir=/var/cache/fontconfig" # otherwise the fallback is in $out/
|
|
"--disable-docs"
|
|
# just <1MB; this is what you get when loading config fails for some reason
|
|
"--with-default-fonts=${dejavu_fonts.minimal}"
|
|
] ++ stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
|
|
"--with-arch=${stdenv.hostPlatform.parsed.cpu.name}"
|
|
];
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
doCheck = true;
|
|
|
|
# Don't try to write to /var/cache/fontconfig at install time.
|
|
installFlags = [ "fc_cachedir=$(TMPDIR)/dummy" "RUN_FC_CACHE_TEST=false" ];
|
|
|
|
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 = {
|
|
inherit configVersion;
|
|
};
|
|
|
|
meta = with stdenv.lib; {
|
|
description = "A library for font customization and configuration";
|
|
homepage = "http://fontconfig.org/";
|
|
license = licenses.bsd2; # custom but very bsd-like
|
|
platforms = platforms.all;
|
|
maintainers = [ maintainers.vcunat ];
|
|
};
|
|
}
|