From ce00ee56de4286dec326fbe669337b530fab191b Mon Sep 17 00:00:00 2001 From: Mynacol Date: Sun, 14 Dec 2025 10:59:00 +0000 Subject: [PATCH] zotero: initial commit for building from source Firefox 115 is needed to match upstream and avoid endless patch failures of zotero. It requires cbindgen 0.26 to compile (Firefox 128 supports cbindgen 0.27+). See https://discuss.haiku-os.org/t/progress-on-porting-firefox/13493/234 --- .../zo/zotero/avoid-xulrunner-fetch.patch | 118 ++++++ pkgs/by-name/zo/zotero/darwin.nix | 33 -- pkgs/by-name/zo/zotero/git-revs.patch | 17 + pkgs/by-name/zo/zotero/linux.nix | 139 ------- pkgs/by-name/zo/zotero/package.nix | 357 +++++++++++++++++- .../tools/rust/cbindgen/default.nix | 52 +++ 6 files changed, 531 insertions(+), 185 deletions(-) create mode 100644 pkgs/by-name/zo/zotero/avoid-xulrunner-fetch.patch delete mode 100644 pkgs/by-name/zo/zotero/darwin.nix create mode 100644 pkgs/by-name/zo/zotero/git-revs.patch delete mode 100644 pkgs/by-name/zo/zotero/linux.nix create mode 100644 pkgs/development/tools/rust/cbindgen/default.nix diff --git a/pkgs/by-name/zo/zotero/avoid-xulrunner-fetch.patch b/pkgs/by-name/zo/zotero/avoid-xulrunner-fetch.patch new file mode 100644 index 000000000000..e17e361d554c --- /dev/null +++ b/pkgs/by-name/zo/zotero/avoid-xulrunner-fetch.patch @@ -0,0 +1,118 @@ +diff --git a/app/scripts/fetch_xulrunner b/app/scripts/fetch_xulrunner +index 0d871782c3..bea85feae9 100755 +--- a/app/scripts/fetch_xulrunner ++++ b/app/scripts/fetch_xulrunner +@@ -422,73 +422,11 @@ cd xulrunner + + if [ $BUILD_MAC == 1 ]; then + GECKO_VERSION="$GECKO_VERSION_MAC" +- DOWNLOAD_URL="https://ftp.mozilla.org/pub/firefox/releases/$GECKO_VERSION" +- rm -rf Firefox.app + +- if [ -e "Firefox $GECKO_VERSION.app.zip" ]; then +- echo "Using Firefox $GECKO_VERSION.app.zip" +- unzip "Firefox $GECKO_VERSION.app.zip" +- else +- curl -o Firefox.dmg "$DOWNLOAD_URL/mac/en-US/Firefox%20$GECKO_VERSION.dmg" +- set +e +- hdiutil detach -quiet /Volumes/Firefox 2>/dev/null +- set -e +- hdiutil attach -quiet Firefox.dmg +- cp -a /Volumes/Firefox/Firefox.app . +- hdiutil detach -quiet /Volumes/Firefox +- fi +- +- # Download custom components (e.g., XUL), as an xz-compressed tarball of the MacOS folder with +- # custom files in it +- echo +- rm -rf MacOS +- if [ -n "$custom_components_hash_mac" ]; then +- if [ -e "Firefox $GECKO_VERSION MacOS.zip" ]; then +- echo "Using Firefox $GECKO_VERSION MacOS.zip" +- unzip "Firefox $GECKO_VERSION MacOS.zip" +- else +- echo "Downloading custom Firefox components" +- echo +- curl -o MacOS.tar.xz "${custom_components_url}mac/$custom_components_hash_mac.tar.xz" +- +- # Verify hash +- if [[ "`uname`" = "Darwin" ]]; then +- shasum=shasum +- else +- shasum=sha256sum +- fi +- echo +- echo "$custom_components_hash_mac MacOS.tar.xz" | $shasum -c - +- echo +- +- tar xvf MacOS.tar.xz +- fi +- echo +- fi +- +- pushd Firefox.app/Contents/Resources ++ pushd firefox + modify_omni mac + popd + +- # Replace "FirefoxCP" with "ZoteroCP" for subprocesses ("Isolated Web Content", "Socket Process", "Web Content", etc.) +- info_plist=Firefox.app/Contents/MacOS/plugin-container.app/Contents/Resources/English.lproj/InfoPlist.strings +- from=$(get_utf16_chars "FirefoxCP") +- to=$(get_utf16_chars "ZoteroCP") +- perl -pi -e "s/$from/$to/" $info_plist +- # Check for UTF-16 "ZoteroCP" +- if ! grep -a -q "Z.o.t.e.r.o.C.P." $info_plist; then +- echo '"ZoteroCP" not found in InfoPlist.strings after replacement' +- exit 1 +- fi +- +- if [ ! -e "Firefox $GECKO_VERSION.app.zip" ]; then +- rm "Firefox.dmg" +- fi +- +- #if [ ! -e "Firefox $GECKO_VERSION MacOS.zip" ]; then +- # rm "MacOS.zip" +- #fi +- echo $("$SCRIPT_DIR/xulrunner_hash" -p m) > hash-mac + fi + + if [ $BUILD_WIN == 1 ]; then +@@ -563,36 +501,9 @@ fi + + if [ $BUILD_LINUX == 1 ]; then + GECKO_VERSION="$GECKO_VERSION_LINUX" +- DOWNLOAD_URL="https://ftp.mozilla.org/pub/firefox/releases/$GECKO_VERSION" +- +- +- # Include 32-bit build if not in CI +- if [[ "${CI:-}" = "1" ]] || [[ "${SKIP_32:-}" = "1" ]]; then +- arches="x86_64" +- else +- arches="i686 x86_64" +- fi +- for arch in $arches; do +- xdir="firefox-$arch" +- rm -rf $xdir +- +- archived_file="firefox-$GECKO_VERSION-$arch.tar.bz2" +- if [ -e "$archived_file" ]; then +- echo "Using $archived_file" +- cp "$archived_file" "firefox-$GECKO_VERSION.tar.bz2" +- else +- curl -O "$DOWNLOAD_URL/linux-$arch/en-US/firefox-$GECKO_VERSION.tar.bz2" +- fi +- +- tar xvf firefox-$GECKO_VERSION.tar.bz2 +- mv firefox firefox-$arch +- +- pushd firefox-$arch +- modify_omni $arch ++ pushd firefox ++ modify_omni linux + popd +- echo $($SCRIPT_DIR/xulrunner_hash -p l) > hash-linux +- rm "firefox-$GECKO_VERSION.tar.bz2" +- done + fi + + echo Done diff --git a/pkgs/by-name/zo/zotero/darwin.nix b/pkgs/by-name/zo/zotero/darwin.nix deleted file mode 100644 index 6f27faac3d3f..000000000000 --- a/pkgs/by-name/zo/zotero/darwin.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ - pname, - version, - meta, - stdenv, - fetchurl, - undmg, -}: - -stdenv.mkDerivation (finalAttrs: { - inherit pname version meta; - - src = fetchurl { - url = "https://download.zotero.org/client/release/${finalAttrs.version}/Zotero-${finalAttrs.version}.dmg"; - hash = "sha256-lDf/jULLQyzxNVGRUKuF2df+FTbJK08z+fFQbVgwjsY="; - }; - sourceRoot = "."; - - nativeBuildInputs = [ undmg ]; - - dontConfigure = true; - dontBuild = true; - dontFixup = true; # breaks notarization - - installPhase = '' - runHook preInstall - - mkdir -p $out/Applications - cp -r Zotero.app $out/Applications - - runHook postInstall - ''; -}) diff --git a/pkgs/by-name/zo/zotero/git-revs.patch b/pkgs/by-name/zo/zotero/git-revs.patch new file mode 100644 index 000000000000..e6a89af707e3 --- /dev/null +++ b/pkgs/by-name/zo/zotero/git-revs.patch @@ -0,0 +1,17 @@ +diff --git a/js-build/build.js b/js-build/build.js +index 5e920db6d8..befe280606 100644 +--- a/js-build/build.js ++++ b/js-build/build.js +@@ -36,9 +36,9 @@ if (require.main === module) { + ...scssFiles.map(scf => getSass(scf, { ignore: ignoreMask }, signatures)), + getSymlinks(symlinks, { nodir: true, ignore: ignoreMask }, signatures), + getSymlinks(symlinkDirs, { ignore: ignoreMask }, signatures), +- getPDFReader(signatures), +- getPDFWorker(signatures), +- getZoteroNoteEditor(signatures) ++ //getPDFReader(signatures), ++ //getPDFWorker(signatures), ++ //getZoteroNoteEditor(signatures) + ]); + + await writeSignatures(signatures); diff --git a/pkgs/by-name/zo/zotero/linux.nix b/pkgs/by-name/zo/zotero/linux.nix deleted file mode 100644 index e192ca642823..000000000000 --- a/pkgs/by-name/zo/zotero/linux.nix +++ /dev/null @@ -1,139 +0,0 @@ -{ - pname, - version, - meta, - lib, - stdenv, - fetchurl, - wrapGAppsHook3, - makeDesktopItem, - atk, - cairo, - dbus-glib, - gdk-pixbuf, - glib, - gtk3, - libGL, - libva, - libxtst, - libxrandr, - libxi, - libxfixes, - libxext, - libxdamage, - libxcursor, - libxcomposite, - libx11, - libxcb, - libgbm, - pango, - pciutils, - alsaSupport ? true, - alsa-lib, - jackSupport ? true, - libjack2, - pulseSupport ? true, - libpulseaudio, - sndioSupport ? true, - sndio, -}: - -stdenv.mkDerivation (finalAttrs: { - inherit pname version meta; - - src = fetchurl { - url = "https://download.zotero.org/client/release/${finalAttrs.version}/Zotero-${finalAttrs.version}_linux-x86_64.tar.bz2"; - hash = "sha256-uV0R0L8EoZt59hMKXFlJ+EhONArPpRbb/tIV+wZKLgY="; - }; - - dontPatchELF = true; - nativeBuildInputs = [ wrapGAppsHook3 ]; - - libPath = - lib.makeLibraryPath ( - [ - atk - cairo - dbus-glib - gdk-pixbuf - glib - gtk3 - libGL - libva - libx11 - libxcomposite - libxcursor - libxdamage - libxext - libxfixes - libxi - libxrandr - libxtst - libxcb - libgbm - pango - pciutils - ] - ++ lib.optional alsaSupport alsa-lib - ++ lib.optional jackSupport libjack2 - ++ lib.optional pulseSupport libpulseaudio - ++ lib.optional sndioSupport sndio - ) - + ":" - + lib.makeSearchPathOutput "lib" "lib" [ stdenv.cc.cc ]; - - desktopItem = makeDesktopItem { - name = "zotero"; - exec = "zotero -url %U"; - icon = "zotero"; - comment = finalAttrs.meta.description; - desktopName = "Zotero"; - genericName = "Reference Management"; - categories = [ - "Office" - "Database" - ]; - startupNotify = true; - mimeTypes = [ - "x-scheme-handler/zotero" - "text/plain" - ]; - }; - - installPhase = '' - runHook preInstall - - # Copy package contents to the output directory - mkdir -p "$prefix/usr/lib/zotero-bin-${finalAttrs.version}" - cp -r * "$prefix/usr/lib/zotero-bin-${finalAttrs.version}" - mkdir -p "$out/bin" - ln -s "$prefix/usr/lib/zotero-bin-${finalAttrs.version}/zotero" "$out/bin/" - - # Install desktop file and icons - mkdir -p $out/share/applications - cp ${finalAttrs.desktopItem}/share/applications/* $out/share/applications/ - for size in 32 64 128; do - install -Dm444 icons/icon''${size}.png \ - $out/share/icons/hicolor/''${size}x''${size}/apps/zotero.png - done - install -Dm444 icons/symbolic.svg \ - $out/share/icons/hicolor/symbolic/apps/zotero-symbolic.svg - - runHook postInstall - ''; - - postFixup = '' - for executable in \ - zotero-bin plugin-container updater vaapitest \ - minidump-analyzer glxtest - do - if [ -e "$out/usr/lib/zotero-bin-${finalAttrs.version}/$executable" ]; then - patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ - "$out/usr/lib/zotero-bin-${finalAttrs.version}/$executable" - fi - done - find . -executable -type f -exec \ - patchelf --set-rpath "$libPath" \ - "$out/usr/lib/zotero-bin-${finalAttrs.version}/{}" \; - ''; -}) diff --git a/pkgs/by-name/zo/zotero/package.nix b/pkgs/by-name/zo/zotero/package.nix index f76a17632fd9..a5913d28df04 100644 --- a/pkgs/by-name/zo/zotero/package.nix +++ b/pkgs/by-name/zo/zotero/package.nix @@ -1,30 +1,361 @@ { lib, stdenv, - callPackage, -}: + fetchurl, + fetchFromGitHub, + buildNpmPackage, + which, + git, + nodejs_20, + nodejs_24, + perl, + python3, + curl, + wget, + zip, + unzip, + xz, + gawk, + rsync, + buildMozillaMach, + python311, + rustPlatform, + cmake, + python3Packages, + + wrapGAppsHook3, + makeDesktopItem, + atk, + cairo, + dbus-glib, + gdk-pixbuf, + glib, + gtk3, + libGL, + libva, + xorg, + libgbm, + pango, + pciutils, + alsaSupport ? true, + alsa-lib, + jackSupport ? true, + libjack2, + pulseSupport ? true, + libpulseaudio, + sndioSupport ? true, + sndio, +}: let + nodejs = nodejs_20; + pname = "zotero"; version = "7.0.30"; + + src = fetchFromGitHub { + owner = "zotero"; + repo = "zotero"; + tag = version; + hash = "sha256-/DDtKtRM5ddNekItHI6wAY1YoJmqSk77Lfubo/I6KxU="; + fetchSubmodules = true; + }; + + pdf-js = buildNpmPackage { + pname = "zotero-pdf-js"; + inherit version; + nodejs = nodejs_24; + src = "${src}/pdf-worker/pdf.js"; + npmDepsHash = "sha256-/me+tZdxChpPw0bsvD1fWqBgZezsN8EhL/pC7wTDuFE="; + prePatch = '' + # Drop unmaintained @jazzer fuzzer, it leads to `prebuild: command not found` and is not needed for builds. + # TODO: use https://gitlab.alpinelinux.org/alpine/aports/-/raw/master/community/zotero/zotero_drop-jazzer.patch?inline=false instead + substituteInPlace package.json \ + --replace-fail '"@jazzer.js/core": "^2.1.0",' "" + ''; + buildPhase = '' + npm exec gulp lib-legacy + npm exec gulp generic-legacy + npm exec gulp minified-legacy + ''; + installPhase = '' + mkdir -p $out + cp -r . $out + ''; + }; + + epub-js = buildNpmPackage { + pname = "zotero-epub-js"; + inherit version nodejs; + src = "${src}/reader/epubjs/epub.js"; + npmDepsHash = "sha256-JYOEDX6SxB4Epwq5PZ5Y+EJO6UGKsOBIm2XIAqOwDO8="; + npmBuildScript = "prepare"; + installPhase = '' + mkdir -p $out + cp -r . $out + ''; + }; + + pdf-reader = buildNpmPackage { + pname = "zotero-pdf-reader"; + inherit version; + nodejs = nodejs_24; + src = "${src}/reader"; + npmDepsHash = "sha256-kD3xA3N0gETKnB1nNl0c7Zkh+3zQEcQtsY7cZBdh8KQ="; + postPatch = '' + rm -rf pdfjs/pdf.js + cp -r ${pdf-js} pdfjs/pdf.js + + rm -rf epubjs/epub.js + cp -r ${epub-js} epubjs/epub.js + chmod -R u+w epubjs/epub.js + + substituteInPlace epubjs/epub.js/package.json \ + --replace-fail '"prepare":' '"prepare_old":' + ''; + installPhase = '' + mkdir -p $out + cp -r . $out + ''; + }; + + pdf-worker = buildNpmPackage { + pname = "zotero-pdf-worker"; + inherit version nodejs; + src = "${src}/pdf-worker"; + npmDepsHash = "sha256-TGuN1fZOClzm6xD2rmn5BAemN4mbyOVaLbSRyMeDIm8="; + nativeBuildInputs = [ + rsync + ]; + postPatch = '' + rm -rf pdf.js + cp -r ${pdf-js} pdf.js + ''; + installPhase = '' + mkdir -p $out + cp -r . $out + ''; + }; + + note-editor = buildNpmPackage { + pname = "zotero-note-editor"; + inherit version nodejs; + src = "${src}/note-editor"; + npmDepsHash = "sha256-9DJNlbyRgiipjrpiXGVFOl5zALJOwLCyw8TRkfwm5Ns="; + makeCacheWritable = true; + installPhase = '' + mkdir -p $out + cp -r . $out + ''; + }; + + rust-cbindgen-026 = rustPlatform.buildRustPackage rec { + pname = "rust-cbindgen"; + version = "0.26.0"; + + src = fetchFromGitHub { + owner = "mozilla"; + repo = "cbindgen"; + rev = "v${version}"; + hash = "sha256-gyNZAuxpeOjuC+Rh9jAyHSBQRRYUlYoIrBKuCFg3Hao="; + }; + + cargoHash = "sha256-Mn6TigV/+zqG5CsjHMDYAN54P6qw4G03g7JuUM7GbPw="; + + #buildInputs = lib.optional stdenv.isDarwin Security; + + nativeCheckInputs = [ + cmake + python3Packages.cython + ]; + + checkFlags = [ + # Disable tests that require rust unstable features + # https://github.com/eqrion/cbindgen/issues/338 + "--skip test_expand" + "--skip test_bitfield" + "--skip lib_default_uses_debug_build" + "--skip lib_explicit_debug_build" + "--skip lib_explicit_release_build" + "--skip bin_explicit_release_build" + "--skip bin_default_uses_debug_build" + "--skip bin_explicit_debug_build" + ] + ++ lib.optionals stdenv.isDarwin [ + # WORKAROUND: test_body fails when using clang + # https://github.com/eqrion/cbindgen/issues/628 + "--skip test_body" + ]; + + meta = { + license = lib.licenses.mpl20; + }; + }; + + firefox-115 = + (buildMozillaMach rec { + pname = "firefox-esr-115"; + version = "115.31.0esr"; + applicationName = "Mozilla Firefox ESR"; + src = fetchurl { + url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz"; + sha512 = "5a56764be6f3d1a4c9f2ee289ec2f220670ad3b99e9ab83a63e24f5fcd023611af7c9bdb81f9baef0d5fe003576d56cee01cf563f6686905363d4c925e4022e2"; + }; + + meta = { + platforms = lib.platforms.unix; + badPlatforms = lib.platforms.darwin; + broken = stdenv.buildPlatform.is32bit; + # since Firefox 60, build on 32-bit platforms fails with "out of memory". + # not in `badPlatforms` because cross-compilation on 64-bit machine might work. + license = lib.licenses.mpl20; + }; + }).override + { + python3 = python311; + elfhackSupport = false; + rust-cbindgen = rust-cbindgen-026; + }; + +in +buildNpmPackage rec { + inherit + pname + version + src + nodejs + ; + + npmDepsHash = "sha256-qWeUeiwM6sCNovSoaEP3b42VTnCFSWLK9y8qPnWcSTE="; + + nativeBuildInputs = [ + #which + git + nodejs + perl + python3 + curl + wget + zip + unzip + xz + gawk + rsync + ]; + + patches = [ + ./git-revs.patch + ./avoid-xulrunner-fetch.patch + ]; + + postPatch = '' + substituteInPlace app/scripts/dir_build \ + --replace-quiet 'hash=`git -C "$ROOT_DIR" rev-parse --short HEAD`' 'hash="e9281c51fd464246b60eee4b3ba999eb4f67d36f"' + + rm -rf reader + cp -r ${pdf-reader} reader + + rm -rf pdf-worker + cp -r ${pdf-worker} pdf-worker + + rm -rf note-editor + cp -r ${note-editor} note-editor + + patchShebangs --build app/ + ''; + + #preBuild = "app/scripts/check_requirements"; + + buildPhase = '' + runHook preBuild + + npm run build + + # Place firefox files at the right place + mkdir -p app/xulrunner + cp -r ${firefox-115}/lib/firefox/ app/xulrunner/ + chmod -R u+w app/xulrunner/ + + app/scripts/dir_build + + runHook postBuild + ''; + + desktopItem = makeDesktopItem { + name = "zotero"; + exec = "zotero -url %U"; + icon = "zotero"; + comment = meta.description; + desktopName = "Zotero"; + genericName = "Reference Management"; + categories = [ + "Office" + "Database" + ]; + startupNotify = true; + mimeTypes = [ + "x-scheme-handler/zotero" + "text/plain" + ]; + }; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib/ + cp -r app/staging/*/. $out/lib/ + + runHook postInstall + ''; + + /* + installPhase = '' + runHook preInstall + + # Copy package contents to the output directory + mkdir -p "$prefix/usr/lib/zotero-bin-${version}" + cp -r * "$prefix/usr/lib/zotero-bin-${version}" + mkdir -p "$out/bin" + ln -s "$prefix/usr/lib/zotero-bin-${version}/zotero" "$out/bin/" + + # Install desktop file and icons + mkdir -p $out/share/applications + cp ${desktopItem}/share/applications/* $out/share/applications/ + for size in 32 64 128; do + install -Dm444 icons/icon''${size}.png \ + $out/share/icons/hicolor/''${size}x''${size}/apps/zotero.png + done + install -Dm444 icons/symbolic.svg \ + $out/share/icons/hicolor/symbolic/apps/zotero-symbolic.svg + + runHook postInstall + ''; + + postFixup = '' + for executable in \ + zotero-bin plugin-container updater vaapitest \ + minidump-analyzer glxtest + do + if [ -e "$out/usr/lib/zotero-bin-${version}/$executable" ]; then + patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + "$out/usr/lib/zotero-bin-${version}/$executable" + fi + done + find . -executable -type f -exec \ + patchelf --set-rpath "$libPath" \ + "$out/usr/lib/zotero-bin-${version}/{}" \; + ''; + */ + meta = { homepage = "https://www.zotero.org"; description = "Collect, organize, cite, and share your research sources"; mainProgram = "zotero"; - sourceProvenance = [ lib.sourceTypes.binaryNativeCode ]; license = lib.licenses.agpl3Only; - platforms = [ - "x86_64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; + platforms = lib.platforms.all; maintainers = with lib.maintainers; [ atila justanotherariel ]; }; -in -if stdenv.hostPlatform.isDarwin then - callPackage ./darwin.nix { inherit pname version meta; } -else - callPackage ./linux.nix { inherit pname version meta; } +} diff --git a/pkgs/development/tools/rust/cbindgen/default.nix b/pkgs/development/tools/rust/cbindgen/default.nix new file mode 100644 index 000000000000..1e4d755fde0b --- /dev/null +++ b/pkgs/development/tools/rust/cbindgen/default.nix @@ -0,0 +1,52 @@ +{ lib +, stdenv +, fetchFromGitHub +, rustPlatform +, cmake +, python3Packages +, Security +}: + +rustPlatform.buildRustPackage rec { + pname = "rust-cbindgen"; + version = "0.26.0"; + + src = fetchFromGitHub { + owner = "mozilla"; + repo = "cbindgen"; + rev = "v${version}"; + hash = "sha256-gyNZAuxpeOjuC+Rh9jAyHSBQRRYUlYoIrBKuCFg3Hao="; + }; + + cargoHash = "sha256-pdTxhECAZzBx5C01Yx7y/OGwhhAdlEDpqLBdvQcb8bc="; + + buildInputs = lib.optional stdenv.isDarwin Security; + + nativeCheckInputs = [ + cmake + python3Packages.cython + ]; + + checkFlags = [ + # Disable tests that require rust unstable features + # https://github.com/eqrion/cbindgen/issues/338 + "--skip test_expand" + "--skip test_bitfield" + "--skip lib_default_uses_debug_build" + "--skip lib_explicit_debug_build" + "--skip lib_explicit_release_build" + ] ++ lib.optionals stdenv.isDarwin [ + # WORKAROUND: test_body fails when using clang + # https://github.com/eqrion/cbindgen/issues/628 + "--skip test_body" + ]; + + meta = with lib; { + changelog = "https://github.com/mozilla/cbindgen/blob/v${version}/CHANGES"; + description = "Project for generating C bindings from Rust code"; + mainProgram = "cbindgen"; + homepage = "https://github.com/mozilla/cbindgen"; + license = licenses.mpl20; + maintainers = with maintainers; [ hexa ]; + }; +}