about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/cairo/default.nix
blob: cb93b224df40444b51cd9124338e080d0bada453 (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
143
{ config, stdenv, fetchurl, fetchpatch, pkgconfig, libiconv, autoreconfHook
, libintl, expat, zlib, libpng, pixman, xorg
, zlibSupport ? true
, pngSupport ? true
, freetypeSupport ? true, freetype
, fontconfigSupport ? freetypeSupport, fontconfig
, gobjectSupport ? true, glib
, xlibSupport ? true
, xlibXrenderSupport ? xlibSupport
, xcbSupport ? true # no longer experimental since 1.12
, libGLSupported
, glSupport ? config.cairo.gl or (libGLSupported && stdenv.isLinux && !stdenv.isAarch32 && !stdenv.isMips)
, libGL ? null # libGLU_combined is no longer a big dependency
, darwin
}:

assert fontconfigSupport -> freetypeSupport;
assert xlibXrenderSupport -> xlibSupport;
assert glSupport -> libGL != null;

let
  version = "1.16.0";
  inherit (stdenv.lib) optional optionals;
in stdenv.mkDerivation rec {
  name = "cairo-${version}";

  src = fetchurl {
    url = "https://cairographics.org/${if stdenv.lib.mod (builtins.fromJSON (stdenv.lib.versions.minor version)) 2 == 0 then "releases" else "snapshots"}/${name}.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
  ];

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

  propagatedBuildInputs =
    with xorg; [ expat pixman ]
    ++ optional zlibSupport zlib
    ++ optional pngSupport libpng
    ++ optionals xlibSupport [ libX11 libXext ]
    ++ optional xlibXrenderSupport libXrender
    ++ optionals xcbSupport [ libxcb xcbutil ]
    ++ 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 ([ "--enable-tee" ]
    ++ optionals (!zlibSupport) [
      "--disable-script"
      "--disable-ps"
      "--disable-pdf"
      "--disable-interpreter"
    ]
    ++ optionals (!pngSupport) [ "--disable-png" "--disable-svg" ]
    ++ optional xcbSupport "--enable-xcb"
    ++ optional glSupport "--enable-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'
    '';

  enableParallelBuilding = true;

  doCheck = false; # fails

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

  meta = with stdenv.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;
  };
}