summaryrefslogtreecommitdiffstats
path: root/pkgs/by-name/ha/harfbuzz/package.nix
blob: 881b996970e3bc50c9ab254409ce1cc70c18e325 (plain)
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
{
  lib,
  stdenv,
  fetchurl,
  pkg-config,
  glib,
  freetype,
  libintl,
  meson,
  ninja,
  gobject-introspection,
  buildPackages,
  withIntrospection ?
    lib.meta.availableOn stdenv.hostPlatform gobject-introspection
    && stdenv.hostPlatform.emulatorAvailable buildPackages,
  withRaster ? false,
  withCairo ? false,
  cairo,
  icu,
  graphite2,
  harfbuzz, # The icu variant uses and propagates the non-icu one.
  withCoreText ? stdenv.hostPlatform.isDarwin, # withCoreText is required for macOS
  withIcu ? false, # recommended by upstream as default, but most don't needed and it's big
  withGraphite2 ? true, # it is small and major distros do include it
  python3,
  gtk-doc,
  docbook-xsl-nons,
  docbook_xml_dtd_43,
  # for passthru.tests
  gimp,
  gtk3,
  gtk4,
  mapnik,
  qt5,
  testers,
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "harfbuzz${lib.optionalString withIcu "-icu"}";
  version = "13.2.1";

  src = fetchurl {
    url = "https://github.com/harfbuzz/harfbuzz/releases/download/${finalAttrs.version}/harfbuzz-${finalAttrs.version}.tar.xz";
    hash = "sha256-ZpXaPrfhvgqjCS/k2BQzoztH9FGSWcdZ1ynjqaVcFCk=";
  };

  # This test fails reliably when executed through mesonCheckPhase but passes with
  # a direct 'meson test' checkPhase, the validated symbols are fine but msan is not happy
  # skipping this for now as it is not relevant for the packaging
  patches = [ ./disable-check-symbols-test.patch ];

  postPatch = ''
    patchShebangs src/*.py test
  ''
  + lib.optionalString stdenv.hostPlatform.isDarwin ''
    # ApplicationServices.framework headers have cast-align warnings.
    substituteInPlace src/hb.hh \
      --replace-fail '#pragma GCC diagnostic error   "-Wcast-align"' ""
  '';

  outputs = [
    "out"
    "dev"
    "devdoc"
  ];
  outputBin = "dev";

  mesonFlags = [
    # upstream recommends cairo, but it is only used for development purposes
    # and hb-raster and is not part of the main library.
    # Cairo causes transitive (build) dependencies on various X11 or other
    # GUI-related libraries, so it shouldn't be re-added lightly.
    (lib.mesonEnable "cairo" withCairo)
    (lib.mesonEnable "raster" withRaster)
    # chafa is only used in a development utility, not in the library
    (lib.mesonEnable "chafa" false)
    (lib.mesonEnable "coretext" withCoreText)
    (lib.mesonEnable "graphite" withGraphite2)
    (lib.mesonEnable "icu" withIcu)
    (lib.mesonEnable "introspection" withIntrospection)
    (lib.mesonOption "cmakepackagedir" "${placeholder "dev"}/lib/cmake")
  ];

  depsBuildBuild = [
    pkg-config
  ];

  nativeBuildInputs = [
    meson
    ninja
    libintl
    pkg-config
    python3
    glib
    gtk-doc
    docbook-xsl-nons
    docbook_xml_dtd_43
  ]
  ++ lib.optional withIntrospection gobject-introspection
  ++ lib.optional withCairo cairo;

  buildInputs = [
    glib
    freetype
  ];

  propagatedBuildInputs =
    lib.optional withGraphite2 graphite2
    ++ lib.optionals withIcu [
      icu
      harfbuzz
    ];

  doCheck = true;

  # test_native_coretext_variations depends on the system fonts.
  __impureHostDeps = lib.optionals stdenv.hostPlatform.isDarwin [
    "/System/Library/Fonts"
  ];

  # Slightly hacky; some pkgs expect them in a single directory.
  postFixup = lib.optionalString withIcu ''
    rm "$out"/lib/libharfbuzz.* "$dev/lib/pkgconfig/harfbuzz.pc"
    ln -s {'${harfbuzz.dev}',"$dev"}/lib/pkgconfig/harfbuzz.pc
    ${lib.optionalString stdenv.hostPlatform.isDarwin ''
      ln -s {'${harfbuzz.out}',"$out"}/lib/libharfbuzz.dylib
      ln -s {'${harfbuzz.out}',"$out"}/lib/libharfbuzz.0.dylib
    ''}
  '';

  passthru.tests = {
    inherit
      gimp
      gtk3
      gtk4
      mapnik
      ;
    inherit (qt5) qtbase;
    pkg-config = testers.hasPkgConfigModules {
      package = finalAttrs.finalPackage;
    };
  };

  meta = {
    description = "OpenType text shaping engine";
    homepage = "https://harfbuzz.github.io/";
    changelog = "https://github.com/harfbuzz/harfbuzz/raw/${finalAttrs.version}/NEWS";
    maintainers = [ lib.maintainers.cobalt ];
    license = lib.licenses.mit;
    platforms = lib.platforms.unix ++ lib.platforms.windows;
    pkgConfigModules = [
      "harfbuzz"
      "harfbuzz-gobject"
      "harfbuzz-subset"
      "harfbuzz-vector"
    ]
    ++ (lib.optional withIcu "harfbuzz-icu")
    ++ (lib.optional withRaster "harfbuzz-raster")
    ++ (lib.optional withCairo "harfbuzz-cairo");
  };
})