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 ]; + }; +}