diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/fontconfig')
5 files changed, 277 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/fontconfig/default.nix b/nixpkgs/pkgs/development/libraries/fontconfig/default.nix new file mode 100644 index 000000000000..c0846edbbfe4 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/default.nix @@ -0,0 +1,128 @@ +{ lib, stdenv +, fetchpatch +, substituteAll +, fetchurl +, pkg-config +, freetype +, expat +, libxslt +, gperf +, dejavu_fonts +, autoreconfHook +, CoreFoundation +}: + +stdenv.mkDerivation rec { + pname = "fontconfig"; + version = "2.13.92"; + + src = fetchurl { + url = "http://fontconfig.org/release/${pname}-${version}.tar.xz"; + sha256 = "0kkfsvxcvcphm9zcgsh646gix3qn4spz555wa1jp5hbq70l62vjh"; + }; + + patches = [ + # 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"; + }) + + # Do not include its tags, they are external now and only cause warnings with old fontconfig clients. + # https://gitlab.freedesktop.org/fontconfig/fontconfig/merge_requests/97 + (fetchpatch { + url = "https://gitlab.freedesktop.org/fontconfig/fontconfig/commit/528b17b2837c3b102acd90cc7548d07bacaccb1f.patch"; + sha256 = "1zf4wcd2xlprh805jalfy8ja5c2qzgkh4fwd1m9d638nl9gx932m"; + }) + # https://gitlab.freedesktop.org/fontconfig/fontconfig/merge_requests/100 + (fetchpatch { + url = "https://gitlab.freedesktop.org/fontconfig/fontconfig/commit/37c7c748740bf6f2468d59e67951902710240b34.patch"; + sha256 = "1rz5zrfwhpn9g49wrzzrmdglj78pbvpnw8ksgsw6bxq8l5d84jfr"; + }) + + # Show warning instead of error when encountering unknown attribute in config. + # https://gitlab.freedesktop.org/fontconfig/fontconfig/merge_requests/111 + (fetchpatch { + url = "https://gitlab.freedesktop.org/fontconfig/fontconfig/commit/409b37c62780728755c908991c912a6b16f2389c.patch"; + sha256 = "zJFh37QErSAINPGFkFVJyhYRP27BuIN7PIgoDl/PIwI="; + }) + + # Combination of + # https://gitlab.freedesktop.org/fontconfig/fontconfig/-/merge_requests/88 + # https://gitlab.freedesktop.org/fontconfig/fontconfig/-/merge_requests/131 + ./macos-atomics.h + ]; + + outputs = [ "bin" "dev" "lib" "out" ]; # $out contains all the config + + nativeBuildInputs = [ + gperf + libxslt + pkg-config + autoreconfHook + ]; + + buildInputs = [ + expat + ] ++ lib.optional stdenv.isDarwin CoreFoundation; + + propagatedBuildInputs = [ + freetype + ]; + + configureFlags = [ + "--sysconfdir=/etc" + "--with-arch=${stdenv.hostPlatform.parsed.cpu.name}" + "--with-cache-dir=/var/cache/fontconfig" # otherwise the fallback is in $out/ + # just <1MB; this is what you get when loading config fails for some reason + "--with-default-fonts=${dejavu_fonts.minimal}" + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "--with-arch=${stdenv.hostPlatform.parsed.cpu.name}" + ]; + + enableParallelBuilding = true; + + doCheck = true; + + installFlags = [ + # Don't try to write to /var/cache/fontconfig at install time. + "fc_cachedir=$(TMPDIR)/dummy" + "RUN_FC_CACHE_TEST=false" + "sysconfdir=${placeholder "out"}/etc" + ]; + + postInstall = '' + cd "$out/etc/fonts" + xsltproc --stringparam fontDirectories "${dejavu_fonts.minimal}" \ + --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 + # We don't keep section 3 of the manpages, as they are quite large and + # probably not so useful. + rm -r $bin/share/man/man3 + ''; + + meta = with 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 = with maintainers; teams.freedesktop.members ++ [ ]; + }; +} diff --git a/nixpkgs/pkgs/development/libraries/fontconfig/macos-atomics.h b/nixpkgs/pkgs/development/libraries/fontconfig/macos-atomics.h new file mode 100644 index 000000000000..07b0cf1d52dc --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/macos-atomics.h @@ -0,0 +1,39 @@ +--- a/src/fcatomic.h 2020-11-27 13:23:44.000000000 +0900 ++++ b/src/fcatomic.h 2020-11-27 13:24:43.000000000 +0900 +@@ -70,24 +70,25 @@ + #elif !defined(FC_NO_MT) && defined(__APPLE__) + + #include <libkern/OSAtomic.h> +-#ifdef __MAC_OS_X_MIN_REQUIRED + #include <AvailabilityMacros.h> +-#elif defined(__IPHONE_OS_MIN_REQUIRED) +-#include <Availability.h> +-#endif + + typedef int fc_atomic_int_t; + #define fc_atomic_int_add(AI, V) (OSAtomicAdd32Barrier ((V), &(AI)) - (V)) + +-#define fc_atomic_ptr_get(P) (OSMemoryBarrier (), (void *) *(P)) +-#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100) +-#define fc_atomic_ptr_cmpexch(P,O,N) OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void **) (P)) +-#else +-#if __ppc64__ || __x86_64__ +-#define fc_atomic_ptr_cmpexch(P,O,N) OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P)) ++#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_OS_VERSION_MIN_REQUIRED >= 20100) ++ ++#if SIZEOF_VOID_P == 8 ++#define fc_atomic_ptr_get(P) OSAtomicAdd64Barrier (0, (int64_t*)(P)) ++#elif SIZEOF_VOID_P == 4 ++#define fc_atomic_ptr_get(P) OSAtomicAdd32Barrier (0, (int32_t*)(P)) + #else +-#define fc_atomic_ptr_cmpexch(P,O,N) OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P)) ++#error "SIZEOF_VOID_P not 4 or 8 (assumes CHAR_BIT is 8)" + #endif ++ ++#define fc_atomic_ptr_cmpexch(P,O,N) OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void **) (P)) ++ ++#else ++#error "Your macOS / iOS targets are too old" + #endif + + #elif !defined(FC_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) diff --git a/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-cache.nix b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-cache.nix new file mode 100644 index 000000000000..47884b9c3b92 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-cache.nix @@ -0,0 +1,33 @@ +{ runCommand, lib, fontconfig, fontDirectories }: + +runCommand "fc-cache" + { + nativeBuildInputs = [ fontconfig.bin ]; + preferLocalBuild = true; + allowSubstitutes = false; + passAsFile = [ "fontDirs" ]; + fontDirs = '' + <!-- Font directories --> + ${lib.concatStringsSep "\n" (map (font: "<dir>${font}</dir>") fontDirectories)} + ''; + } + '' + export FONTCONFIG_FILE=$(pwd)/fonts.conf + + cat > fonts.conf << EOF + <?xml version='1.0'?> + <!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'> + <fontconfig> + <include>${fontconfig.out}/etc/fonts/fonts.conf</include> + <cachedir>$out</cachedir> + EOF + cat "$fontDirsPath" >> fonts.conf + echo "</fontconfig>" >> fonts.conf + + mkdir -p $out + fc-cache -sv + + # This is not a cache dir in the normal sense -- it won't be automatically + # recreated. + rm -f "$out/CACHEDIR.TAG" + '' diff --git a/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.nix b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.nix new file mode 100644 index 000000000000..493f662d0ce3 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.nix @@ -0,0 +1,15 @@ +{ runCommand, libxslt, fontconfig, dejavu_fonts, fontDirectories }: + +runCommand "fonts.conf" + { + nativeBuildInputs = [ libxslt ]; + buildInputs = [ fontconfig ]; + # Add a default font for non-nixos systems, <1MB and in nixos defaults. + fontDirectories = fontDirectories ++ [ dejavu_fonts.minimal ]; + } + '' + xsltproc --stringparam fontDirectories "$fontDirectories" \ + --path ${fontconfig.out}/share/xml/fontconfig \ + ${./make-fonts-conf.xsl} ${fontconfig.out}/etc/fonts/fonts.conf \ + > $out + '' diff --git a/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl new file mode 100644 index 000000000000..ed51b62a1d08 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl @@ -0,0 +1,62 @@ +<?xml version="1.0"?> + +<!-- + This script copies the original fonts.conf from the fontconfig + distribution, but replaces all <dir> entries with the directories + specified in the $fontDirectories parameter. +--> + +<xsl:stylesheet version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:str="http://exslt.org/strings" + extension-element-prefixes="str" + > + + <xsl:output method='xml' encoding="UTF-8" doctype-system="urn:fontconfig:fonts.dtd" /> + + <xsl:param name="fontDirectories" /> + + <xsl:template match="/fontconfig"> + + <fontconfig> + <xsl:apply-templates select="child::node()[name() != 'dir' and name() != 'cachedir' and name() != 'include']" /> + + <!-- the first cachedir will be used to store the cache --> + <cachedir prefix="xdg">fontconfig</cachedir> + <!-- /var/cache/fontconfig is useful for non-nixos systems --> + <cachedir>/var/cache/fontconfig</cachedir> + + <!-- system-wide config --> + <include ignore_missing="yes">/etc/fonts/conf.d</include> + + <dir prefix="xdg">fonts</dir> + <xsl:for-each select="str:tokenize($fontDirectories)"> + <dir><xsl:value-of select="." /></dir> + <xsl:text>
</xsl:text> + </xsl:for-each> + + <!-- nix user profile --> + <dir>~/.nix-profile/lib/X11/fonts</dir> + <dir>~/.nix-profile/share/fonts</dir> + + <!-- FHS paths for non-NixOS platforms --> + <dir>/usr/share/fonts</dir> + <dir>/usr/local/share/fonts</dir> + + <!-- nix default profile --> + <dir>/nix/var/nix/profiles/default/lib/X11/fonts</dir> + <dir>/nix/var/nix/profiles/default/share/fonts</dir> + + </fontconfig> + + </xsl:template> + + + <!-- New fontconfig >=2.11 doesn't like xml:space added by xsl:copy-of --> + <xsl:template match="node()|@*"> + <xsl:copy> + <xsl:apply-templates select="node()|@*[name() != 'xml:space']"/> + </xsl:copy> + </xsl:template> + +</xsl:stylesheet> |