diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/fontconfig')
4 files changed, 218 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..669c2dec851c --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/default.nix @@ -0,0 +1,95 @@ +{ stdenv +, lib +, fetchurl +, pkg-config +, python3 +, freetype +, expat +, libxslt +, gperf +, dejavu_fonts +, autoreconfHook +, CoreFoundation +, testers +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "fontconfig"; + version = "2.15.0"; + + outputs = [ "bin" "dev" "lib" "out" ]; # $out contains all the config + + src = fetchurl { + url = with finalAttrs; "https://www.freedesktop.org/software/fontconfig/release/${pname}-${version}.tar.xz"; + hash = "sha256-Y6BljQ4G4PqIYQZFK1jvBPIfWCAuoCqUw53g0zNdfA4="; + }; + + nativeBuildInputs = [ + autoreconfHook + gperf + libxslt + pkg-config + python3 + ]; + + buildInputs = [ + expat + ] ++ lib.optional stdenv.isDarwin CoreFoundation; + + propagatedBuildInputs = [ + freetype + ]; + + postPatch = '' + # Requires networking. + sed -i '/check_PROGRAMS += test-crbug1004254/d' test/Makefile.am + ''; + + 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 + ''; + + passthru.tests = { + pkg-config = testers.hasPkgConfigModules { + package = finalAttrs.finalPackage; + }; + }; + + 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 ++ [ ]; + pkgConfigModules = [ "fontconfig" ]; + }; +}) 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..cfe0a21e1d35 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.nix @@ -0,0 +1,30 @@ +{ runCommand, stdenv, lib, libxslt, fontconfig, dejavu_fonts, fontDirectories +, impureFontDirectories ? [ + # nix user profile + "~/.nix-profile/lib/X11/fonts" "~/.nix-profile/share/fonts" + ] + ++ lib.optional stdenv.isDarwin "~/Library/Fonts" + ++ [ + # FHS paths for non-NixOS platforms + "/usr/share/fonts" "/usr/local/share/fonts" + ] + # darwin paths + ++ lib.optionals stdenv.isDarwin [ "/Library/Fonts" "/System/Library/Fonts" ] + # nix default profile + ++ [ "/nix/var/nix/profiles/default/lib/X11/fonts" "/nix/var/nix/profiles/default/share/fonts" ] }: + +runCommand "fonts.conf" + { + nativeBuildInputs = [ libxslt ]; + buildInputs = [ fontconfig ]; + inherit fontDirectories; + # Add a default font for non-nixos systems, <1MB and in nixos defaults. + impureFontDirectories = impureFontDirectories ++ [ dejavu_fonts.minimal ]; + } + '' + xsltproc --stringparam fontDirectories "$fontDirectories" \ + --stringparam impureFontDirectories "$impureFontDirectories" \ + --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..d04e4ffab967 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl @@ -0,0 +1,60 @@ +<?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:param name="impureFontDirectories" /> + + <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> + <xsl:text>
</xsl:text> + <!-- /var/cache/fontconfig is useful for non-nixos systems --> + <cachedir>/var/cache/fontconfig</cachedir> + <xsl:text>
</xsl:text> + + <!-- system-wide config --> + <include ignore_missing="yes">/etc/fonts/conf.d</include> + <xsl:text>
</xsl:text> + + <dir prefix="xdg">fonts</dir> + <xsl:text>
</xsl:text> + <xsl:for-each select="str:tokenize($fontDirectories)"> + <dir><xsl:value-of select="." /></dir> + <xsl:text>
</xsl:text> + </xsl:for-each> + + <xsl:for-each select="str:tokenize($impureFontDirectories)"> + <dir><xsl:value-of select="." /></dir> + <xsl:text>
</xsl:text> + </xsl:for-each> + + </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> |