about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/fontconfig
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/fontconfig')
-rw-r--r--nixpkgs/pkgs/development/libraries/fontconfig/default.nix87
-rw-r--r--nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-cache.nix33
-rw-r--r--nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.nix30
-rw-r--r--nixpkgs/pkgs/development/libraries/fontconfig/make-fonts-conf.xsl60
4 files changed, 210 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..9ff72c202193
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/fontconfig/default.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, fetchurl
+, pkg-config
+, python3
+, freetype
+, expat
+, libxslt
+, gperf
+, dejavu_fonts
+, autoreconfHook
+, CoreFoundation
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fontconfig";
+  version = "2.15.0";
+
+  outputs = [ "bin" "dev" "lib" "out" ]; # $out contains all the config
+
+  src = fetchurl {
+    url = "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
+  '';
+
+  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/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>&#0010;</xsl:text>
+      <!-- /var/cache/fontconfig is useful for non-nixos systems -->
+      <cachedir>/var/cache/fontconfig</cachedir>
+      <xsl:text>&#0010;</xsl:text>
+
+      <!-- system-wide config -->
+      <include ignore_missing="yes">/etc/fonts/conf.d</include>
+      <xsl:text>&#0010;</xsl:text>
+
+      <dir prefix="xdg">fonts</dir>
+      <xsl:text>&#0010;</xsl:text>
+      <xsl:for-each select="str:tokenize($fontDirectories)">
+        <dir><xsl:value-of select="." /></dir>
+        <xsl:text>&#0010;</xsl:text>
+      </xsl:for-each>
+
+      <xsl:for-each select="str:tokenize($impureFontDirectories)">
+        <dir><xsl:value-of select="." /></dir>
+        <xsl:text>&#0010;</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>