about summary refs log tree commit diff
path: root/pkgs/development/libraries/libjxl/default.nix
blob: c91ae27f68054994d757c6bcbc53d1c19d4202ab (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
144
145
146
147
148
{ stdenv, lib, fetchFromGitHub
, brotli
, cmake
, giflib
, gperftools
, gtest
, libhwy
, libjpeg
, libpng
, libwebp
, gdk-pixbuf
, openexr_3
, pkg-config
, makeWrapper
, zlib
, asciidoc
, graphviz
, doxygen
, python3
, lcms2
, enablePlugins ? stdenv.buildPlatform.canExecute stdenv.hostPlatform
}:

let
  loadersPath = "${gdk-pixbuf.binaryDir}/jxl-loaders.cache";
in

stdenv.mkDerivation rec {
  pname = "libjxl";
  version = "0.9.1";

  outputs = [ "out" "dev" ];

  src = fetchFromGitHub {
    owner = "libjxl";
    repo = "libjxl";
    rev = "v${version}";
    hash = "sha256-n5KNbbw6NQRROEM7Cojla/igRCFNawUq7nfhzJlMlPI=";
    # There are various submodules in `third_party/`.
    fetchSubmodules = true;
  };

  strictDeps = true;

  nativeBuildInputs = [
    cmake
    pkg-config
    gdk-pixbuf
    makeWrapper
    asciidoc
    doxygen
    python3
  ];

  depsBuildBuild = [
    graphviz
  ];

  # Functionality not currently provided by this package
  # that the cmake build can apparently use:
  #     OpenGL/GLUT (for Examples -> comparison with sjpeg)
  #     viewer (see `cmakeFlags`)
  #     plugins like for GDK and GIMP (see `cmakeFlags`)

  # Vendored libraries:
  # `libjxl` currently vendors many libraries as git submodules that they
  # might patch often (e.g. test/gmock, see
  # https://github.com/NixOS/nixpkgs/pull/103160#discussion_r519487734).
  # When it has stabilised in the future, we may want to tell the build
  # to use use nixpkgs system libraries.

  # As of writing, libjxl does not point out all its dependencies
  # conclusively in its README or otherwise; they can best be determined
  # by checking the CMake output for "Could NOT find".
  buildInputs = [
    lcms2
    giflib
    gperftools # provides `libtcmalloc`
    gtest
    libjpeg
    libpng
    libwebp
    gdk-pixbuf
    openexr_3
    zlib
  ];

  propagatedBuildInputs = [
    brotli
    libhwy
  ];

  cmakeFlags = [
    # For C dependencies like brotli, which are dynamically linked,
    # we want to use the system libraries, so that we don't have to care about
    # installing their .so files generated by this build.
    # The other C++ dependencies are statically linked in, so there
    # using the vendorered ones is easier.
    "-DJPEGXL_FORCE_SYSTEM_BROTLI=ON"

    # Use our version of highway, though it is still statically linked in
    "-DJPEGXL_FORCE_SYSTEM_HWY=ON"

    # Use our version of gtest
    "-DJPEGXL_FORCE_SYSTEM_GTEST=ON"

    # TODO: Update this package to enable this (overridably via an option):
    # Viewer tools for evaluation.
    # "-DJPEGXL_ENABLE_VIEWERS=ON"
  ] ++ lib.optionals enablePlugins [
    # Enable plugins, such as:
    # * the `gdk-pixbuf` one, which allows applications like `eog` to load jpeg-xl files
    # * the `gimp` one, which allows GIMP to load jpeg-xl files
    "-DJPEGXL_ENABLE_PLUGINS=ON"
  ] ++ lib.optionals stdenv.hostPlatform.isStatic [
    "-DJPEGXL_STATIC=ON"
  ] ++ lib.optionals stdenv.hostPlatform.isAarch32 [
    "-DJPEGXL_FORCE_NEON=ON"
  ];

  postPatch = ''
    substituteInPlace plugins/gdk-pixbuf/jxl.thumbnailer \
      --replace '/usr/bin/gdk-pixbuf-thumbnailer' "$out/libexec/gdk-pixbuf-thumbnailer-jxl"
  '';

  postInstall = lib.optionalString enablePlugins ''
    GDK_PIXBUF_MODULEDIR="$out/${gdk-pixbuf.moduleDir}" \
    GDK_PIXBUF_MODULE_FILE="$out/${loadersPath}" \
      gdk-pixbuf-query-loaders --update-cache
    mkdir -p "$out/bin"
    makeWrapper ${gdk-pixbuf}/bin/gdk-pixbuf-thumbnailer "$out/libexec/gdk-pixbuf-thumbnailer-jxl" \
      --set GDK_PIXBUF_MODULE_FILE "$out/${loadersPath}"
  '';

  CXXFLAGS = lib.optionalString stdenv.hostPlatform.isAarch32 "-mfp16-format=ieee";

  # FIXME x86_64-darwin:
  # https://github.com/NixOS/nixpkgs/pull/204030#issuecomment-1352768690
  doCheck = with stdenv; !(hostPlatform.isi686 || isDarwin && isx86_64);

  meta = with lib; {
    homepage = "https://github.com/libjxl/libjxl";
    description = "JPEG XL image format reference implementation.";
    license = licenses.bsd3;
    maintainers = with maintainers; [ nh2 ];
    platforms = platforms.all;
  };
}