summaryrefslogtreecommitdiff
path: root/pkgs/by-name/li/libjxl/package.nix
blob: 0a91d21f128e92b7ebdb3b1bb7d16d957b7e57d5 (about) (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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
{
  stdenv,
  lib,
  fetchFromGitHub,
  brotli,
  cmake,
  giflib,
  gperftools,
  gtest,
  libhwy,
  libjpeg,
  libpng,
  libwebp,
  gdk-pixbuf,
  openexr,
  pkg-config,
  makeWrapper,
  zlib,
  asciidoc,
  graphviz,
  doxygen,
  python3,
  lcms2,
  enablePlugins ? true,
}:

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

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

  outputs = [
    "out"
    "dev"
  ];

  src = fetchFromGitHub {
    owner = "libjxl";
    repo = "libjxl";
    rev = "v${version}";
    hash = "sha256-ORwhKOp5Nog366UkLbuWpjz/6sJhxUO6+SkoJGH+3fE=";
    # 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
    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"

      "-DJPEGXL_ENABLE_SKCMS=OFF"
      "-DJPEGXL_FORCE_SYSTEM_LCMS2=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"
    ];

  # the second substitution fix regex for a2x script
  # https://github.com/libjxl/libjxl/pull/3842
  postPatch = ''
    # Make sure we do not accidentally build against some of the vendored dependencies
    # If it asks you to "run deps.sh to fetch the build dependencies", then you are probably missing a JPEGXL_FORCE_SYSTEM_* flag
    shopt -s extglob
    rm -rf third_party/!(sjpeg)/
    shopt -u extglob

    substituteInPlace plugins/gdk-pixbuf/jxl.thumbnailer \
      --replace '/usr/bin/gdk-pixbuf-thumbnailer' "$out/libexec/gdk-pixbuf-thumbnailer-jxl"
    substituteInPlace CMakeLists.txt \
      --replace 'sh$' 'sh( -e$|$)'
  '';

  postInstall =
    lib.optionalString enablePlugins ''
      GDK_PIXBUF_MODULEDIR="$out/${gdk-pixbuf.moduleDir}" \
      GDK_PIXBUF_MODULE_FILE="$out/${loadersPath}" \
        gdk-pixbuf-query-loaders --update-cache
    ''
    # Cross-compiled gdk-pixbuf doesn't support thumbnailers
    + lib.optionalString (enablePlugins && stdenv.hostPlatform == stdenv.buildPlatform) ''
      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;
  };
}