openxray: 2188-november-2023-rc1 -> 2921-january-2025-rc1 (#375925)
[NixPkgs.git] / pkgs / by-name / li / libjxl / package.nix
blobe9860f5867f2c3a39bdef9295e099b7bdf1dbdb8
2   stdenv,
3   lib,
4   fetchFromGitHub,
5   brotli,
6   cmake,
7   giflib,
8   gperftools,
9   gtest,
10   libhwy,
11   libjpeg,
12   libpng,
13   libwebp,
14   gdk-pixbuf,
15   openexr_3,
16   pkg-config,
17   makeWrapper,
18   zlib,
19   asciidoc,
20   graphviz,
21   doxygen,
22   python3,
23   lcms2,
24   enablePlugins ? true,
27 let
28   loadersPath = "${gdk-pixbuf.binaryDir}/jxl-loaders.cache";
31 stdenv.mkDerivation rec {
32   pname = "libjxl";
33   version = "0.11.1";
35   outputs = [
36     "out"
37     "dev"
38   ];
40   src = fetchFromGitHub {
41     owner = "libjxl";
42     repo = "libjxl";
43     rev = "v${version}";
44     hash = "sha256-ORwhKOp5Nog366UkLbuWpjz/6sJhxUO6+SkoJGH+3fE=";
45     # There are various submodules in `third_party/`.
46     fetchSubmodules = true;
47   };
49   strictDeps = true;
51   nativeBuildInputs = [
52     cmake
53     pkg-config
54     gdk-pixbuf
55     makeWrapper
56     asciidoc
57     doxygen
58     python3
59   ];
61   depsBuildBuild = [
62     graphviz
63   ];
65   # Functionality not currently provided by this package
66   # that the cmake build can apparently use:
67   #     OpenGL/GLUT (for Examples -> comparison with sjpeg)
68   #     viewer (see `cmakeFlags`)
69   #     plugins like for GDK and GIMP (see `cmakeFlags`)
71   # Vendored libraries:
72   # `libjxl` currently vendors many libraries as git submodules that they
73   # might patch often (e.g. test/gmock, see
74   # https://github.com/NixOS/nixpkgs/pull/103160#discussion_r519487734).
75   # When it has stabilised in the future, we may want to tell the build
76   # to use use nixpkgs system libraries.
78   # As of writing, libjxl does not point out all its dependencies
79   # conclusively in its README or otherwise; they can best be determined
80   # by checking the CMake output for "Could NOT find".
81   buildInputs = [
82     lcms2
83     giflib
84     gperftools # provides `libtcmalloc`
85     gtest
86     libjpeg
87     libpng
88     libwebp
89     gdk-pixbuf
90     openexr_3
91     zlib
92   ];
94   propagatedBuildInputs = [
95     brotli
96     libhwy
97   ];
99   cmakeFlags =
100     [
101       # For C dependencies like brotli, which are dynamically linked,
102       # we want to use the system libraries, so that we don't have to care about
103       # installing their .so files generated by this build.
104       # The other C++ dependencies are statically linked in, so there
105       # using the vendorered ones is easier.
106       "-DJPEGXL_FORCE_SYSTEM_BROTLI=ON"
108       # Use our version of highway, though it is still statically linked in
109       "-DJPEGXL_FORCE_SYSTEM_HWY=ON"
111       # Use our version of gtest
112       "-DJPEGXL_FORCE_SYSTEM_GTEST=ON"
114       "-DJPEGXL_ENABLE_SKCMS=OFF"
115       "-DJPEGXL_FORCE_SYSTEM_LCMS2=ON"
117       # TODO: Update this package to enable this (overridably via an option):
118       # Viewer tools for evaluation.
119       # "-DJPEGXL_ENABLE_VIEWERS=ON"
120     ]
121     ++ lib.optionals enablePlugins [
122       # Enable plugins, such as:
123       # * the `gdk-pixbuf` one, which allows applications like `eog` to load jpeg-xl files
124       # * the `gimp` one, which allows GIMP to load jpeg-xl files
125       "-DJPEGXL_ENABLE_PLUGINS=ON"
126     ]
127     ++ lib.optionals stdenv.hostPlatform.isStatic [
128       "-DJPEGXL_STATIC=ON"
129     ]
130     ++ lib.optionals stdenv.hostPlatform.isAarch32 [
131       "-DJPEGXL_FORCE_NEON=ON"
132     ];
134   # the second substitution fix regex for a2x script
135   # https://github.com/libjxl/libjxl/pull/3842
136   postPatch = ''
137     # Make sure we do not accidentally build against some of the vendored dependencies
138     # If it asks you to "run deps.sh to fetch the build dependencies", then you are probably missing a JPEGXL_FORCE_SYSTEM_* flag
139     shopt -s extglob
140     rm -rf third_party/!(sjpeg)/
141     shopt -u extglob
143     substituteInPlace plugins/gdk-pixbuf/jxl.thumbnailer \
144       --replace '/usr/bin/gdk-pixbuf-thumbnailer' "$out/libexec/gdk-pixbuf-thumbnailer-jxl"
145     substituteInPlace CMakeLists.txt \
146       --replace 'sh$' 'sh( -e$|$)'
147   '';
149   postInstall =
150     lib.optionalString enablePlugins ''
151       GDK_PIXBUF_MODULEDIR="$out/${gdk-pixbuf.moduleDir}" \
152       GDK_PIXBUF_MODULE_FILE="$out/${loadersPath}" \
153         gdk-pixbuf-query-loaders --update-cache
154     ''
155     # Cross-compiled gdk-pixbuf doesn't support thumbnailers
156     + lib.optionalString (enablePlugins && stdenv.hostPlatform == stdenv.buildPlatform) ''
157       mkdir -p "$out/bin"
158       makeWrapper ${gdk-pixbuf}/bin/gdk-pixbuf-thumbnailer "$out/libexec/gdk-pixbuf-thumbnailer-jxl" \
159         --set GDK_PIXBUF_MODULE_FILE "$out/${loadersPath}"
160     '';
162   CXXFLAGS = lib.optionalString stdenv.hostPlatform.isAarch32 "-mfp16-format=ieee";
164   # FIXME x86_64-darwin:
165   # https://github.com/NixOS/nixpkgs/pull/204030#issuecomment-1352768690
166   doCheck = with stdenv; !(hostPlatform.isi686 || isDarwin && isx86_64);
168   meta = with lib; {
169     homepage = "https://github.com/libjxl/libjxl";
170     description = "JPEG XL image format reference implementation";
171     license = licenses.bsd3;
172     maintainers = with maintainers; [ nh2 ];
173     platforms = platforms.all;
174   };