about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/libjxl/default.nix
blob: 9be574e9eaa00f209bbf113fe2500b2cdf0ab8bd (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
{ stdenv, lib, fetchFromGitHub
, fetchpatch
, brotli
, cmake
, giflib
, gperftools
, gtest
, libhwy
, libjpeg
, libpng
, libwebp
, openexr
, pkg-config
, zlib
, buildDocs ? true
, asciidoc
, graphviz
, doxygen
, python3
}:

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

  outputs = [ "out" "dev" ];

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

  patches = [
    # Add missing <atomic> content to fix gcc compilation for RISCV architecture
    # https://github.com/libjxl/libjxl/pull/2211
    (fetchpatch {
      url = "https://github.com/libjxl/libjxl/commit/22d12d74e7bc56b09cfb1973aa89ec8d714fa3fc.patch";
      hash = "sha256-X4fbYTMS+kHfZRbeGzSdBW5jQKw8UN44FEyFRUtw0qo=";
    })
  ];

  nativeBuildInputs = [
    cmake
    gtest
    pkg-config
  ] ++ lib.optionals buildDocs [
    asciidoc
    doxygen
    python3
  ];

  depsBuildBuild = lib.optionals buildDocs [
    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 = [
    giflib
    gperftools # provides `libtcmalloc`
    libjpeg
    libpng
    libwebp
    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"

    # TODO: Update this package to enable this (overridably via an option):
    # Viewer tools for evaluation.
    # "-DJPEGXL_ENABLE_VIEWERS=ON"

    # TODO: Update this package to enable this (overridably via an option):
    # 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"
  ];

  LDFLAGS = lib.optionalString stdenv.hostPlatform.isRiscV "-latomic";
  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;
  };
}