about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/cairo/default.nix
blob: 9997dcec29705c515bb9cd8a13270875021e2648 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
{ config, stdenv, lib, fetchurl, fetchpatch, pkgconfig, autoreconfHook
, pixman
, zlibSupport ? true, zlib
, pngSupport ? true, libpng
, freetypeSupport ? true, freetype
, fontconfigSupport ? freetypeSupport, fontconfig
, gobjectSupport ? true, glib
, x11Support ? !stdenv.isDarwin, libX11, libXext
, x11XrenderSupport ? x11Support, libXrender
, xcbSupport ? !stdenv.isDarwin, libxcb # no longer experimental since 1.12
, libGLSupported ? stdenv.lib.elem stdenv.hostPlatform.system stdenv.lib.platforms.mesaPlatforms
, glSupport ? config.cairo.gl or (libGLSupported && stdenv.isLinux)
, libGL ? null # libGLU libGL is no longer a big dependency
, darwin
}:

assert fontconfigSupport -> freetypeSupport;
assert x11XrenderSupport -> x11Support;
assert glSupport -> libGL != null;

let
  version = "1.16.0";
  inherit (lib) enableFeature optional optionals;
in stdenv.mkDerivation rec {
  pname = "cairo";
  inherit version;

  src = fetchurl {
    url = "https://cairographics.org/${if lib.mod (builtins.fromJSON (lib.versions.minor version)) 2 == 0 then "releases" else "snapshots"}/${pname}-${version}.tar.xz";
    sha256 = "0c930mk5xr2bshbdljv005j3j8zr47gqmkry3q6qgvqky6rjjysy";
  };

  patches = [
    # Fixes CVE-2018-19876; see Nixpkgs issue #55384
    # CVE information: https://nvd.nist.gov/vuln/detail/CVE-2018-19876
    # Upstream PR: https://gitlab.freedesktop.org/cairo/cairo/merge_requests/5
    #
    # This patch is the merged commit from the above PR.
    (fetchpatch {
      name   = "CVE-2018-19876.patch";
      url    = "https://gitlab.freedesktop.org/cairo/cairo/commit/6edf572ebb27b00d3c371ba5ae267e39d27d5b6d.patch";
      sha256 = "112hgrrsmcwxh1r52brhi5lksq4pvrz4xhkzcf2iqp55jl2pb7n1";
    })

    ./0001-test-don-t-always-build-FreeType-dependent-test.patch
    ./0002-gl-don-t-implicitly-include-X11-headers.patch
    ./0003-test-only-build-GL-tests-when-Xlib-is-enabled.patch
    ./0004-util-don-t-build-cairo-sphinx-unless-PNG-enabled.patch
  ];

  outputs = [ "out" "dev" "devdoc" ];
  outputBin = "dev"; # very small

  nativeBuildInputs = [
    autoreconfHook
    pkgconfig
    autoreconfHook
  ];

  buildInputs = optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
    CoreGraphics
    CoreText
    ApplicationServices
    Carbon
  ]);

  propagatedBuildInputs =
    [ pixman ]
    ++ optional zlibSupport zlib
    ++ optional pngSupport libpng
    ++ optionals x11Support [ libX11 libXext ]
    ++ optional x11XrenderSupport libXrender
    ++ optional xcbSupport libxcb
    ++ optional freetypeSupport freetype
    ++ optional fontconfigSupport fontconfig
    ++ optional gobjectSupport glib
    ++ optional glSupport libGL
    ; # TODO: maybe liblzo but what would it be for here?

  configureFlags = if stdenv.isDarwin then [
    "--disable-dependency-tracking"
    "--enable-quartz"
    "--enable-quartz-font"
    "--enable-quartz-image"
    "--enable-ft"
  ] else [
    (enableFeature zlibSupport "script")
    (enableFeature zlibSupport "ps")
    (enableFeature zlibSupport "pdf")
    (enableFeature zlibSupport "interpreter")
    (enableFeature pngSupport "png")
    (enableFeature pngSupport "svg")
    "--enable-tee"
    (enableFeature glSupport "gl")
  ];

  preConfigure =
  # On FreeBSD, `-ldl' doesn't exist.
    stdenv.lib.optionalString stdenv.isFreeBSD
       '' for i in "util/"*"/Makefile.in" boilerplate/Makefile.in
          do
            cat "$i" | sed -es/-ldl//g > t
            mv t "$i"
          done
       ''
    +
    ''
    # Work around broken `Requires.private' that prevents Freetype
    # `-I' flags to be propagated.
    sed -i "src/cairo.pc.in" \
        -es'|^Cflags:\(.*\)$|Cflags: \1 -I${freetype.dev}/include/freetype2 -I${freetype.dev}/include|g'
    substituteInPlace configure --replace strings $STRINGS
    '';

  enableParallelBuilding = true;

  doCheck = false; # fails

  postInstall = lib.optionalString stdenv.isDarwin glib.flattenInclude;

  meta = with lib; {
    description = "A 2D graphics library with support for multiple output devices";

    longDescription = ''
      Cairo is a 2D graphics library with support for multiple output
      devices.  Currently supported output targets include the X
      Window System, Quartz, Win32, image buffers, PostScript, PDF,
      and SVG file output.  Experimental backends include OpenGL
      (through glitz), XCB, BeOS, OS/2, and DirectFB.

      Cairo is designed to produce consistent output on all output
      media while taking advantage of display hardware acceleration
      when available (e.g., through the X Render Extension).
    '';

    homepage = "http://cairographics.org/";

    license = with licenses; [ lgpl2Plus mpl10 ];

    platforms = platforms.all;
  };
}