Unverified Commit 4822857c authored by Ulysses Zhan's avatar Ulysses Zhan
Browse files

graphest: init at 1.8.2-unstable-2026-01-21

parent eb98c631
Loading
Loading
Loading
Loading
+141 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleDisplayName</key>
    <string>Graphest</string>
    <key>CFBundleDocumentTypes</key>
    <array>
      <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
          <string>io.github.unageek.graphest.document</string>
        </array>
      </dict>
    </array>
    <key>CFBundleExecutable</key>
    <string>Graphest</string>
    <key>CFBundleIconFile</key>
    <string>icon.icns</string>
    <key>CFBundleIdentifier</key>
    <string>io.github.unageek.graphest</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>Graphest</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>@version@</string>
    <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>Graphest</string>
        <key>CFBundleURLSchemes</key>
        <array>
          <string>graphest</string>
        </array>
      </dict>
    </array>
    <key>CFBundleVersion</key>
    <string>@version@</string>
    <key>LSApplicationCategoryType</key>
    <string>public.app-category.utilities</string>
    <key>LSEnvironment</key>
    <dict>
      <key>MallocNanoZone</key>
      <string>0</string>
    </dict>
    <key>LSMinimumSystemVersion</key>
    <string>10.13</string>
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
      <key>NSAllowsLocalNetworking</key>
      <true/>
      <key>NSExceptionDomains</key>
      <dict>
        <key>127.0.0.1</key>
        <dict>
          <key>NSIncludesSubdomains</key>
          <false/>
          <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
          <true/>
          <key>NSTemporaryExceptionAllowsInsecureHTTPSLoads</key>
          <false/>
          <key>NSTemporaryExceptionMinimumTLSVersion</key>
          <string>1.0</string>
          <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
          <false/>
        </dict>
        <key>localhost</key>
        <dict>
          <key>NSIncludesSubdomains</key>
          <false/>
          <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
          <true/>
          <key>NSTemporaryExceptionAllowsInsecureHTTPSLoads</key>
          <false/>
          <key>NSTemporaryExceptionMinimumTLSVersion</key>
          <string>1.0</string>
          <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
          <false/>
        </dict>
      </dict>
    </dict>
    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>This app needs access to Bluetooth</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>This app needs access to Bluetooth</string>
    <key>NSCameraUsageDescription</key>
    <string>This app needs access to the camera</string>
    <key>NSHighResolutionCapable</key>
    <true/>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright © 2023 Masashi Mizuno</string>
    <key>NSMainNibFile</key>
    <string>MainMenu</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>This app needs access to the microphone</string>
    <key>NSPrincipalClass</key>
    <string>AtomApplication</string>
    <key>NSQuitAlwaysKeepsWindows</key>
    <false/>
    <key>NSRequiresAquaSystemAppearance</key>
    <false/>
    <key>NSSupportsAutomaticGraphicsSwitching</key>
    <true/>
    <key>UTExportedTypeDeclarations</key>
    <array>
      <dict>
        <key>UTTypeConformsTo</key>
        <array>
          <string>public.content</string>
          <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Graphest Document</string>
        <key>UTTypeIcons</key>
        <dict>
          <key>UTTypeIconText</key>
          <string>graph</string>
        </dict>
        <key>UTTypeIdentifier</key>
        <string>io.github.unageek.graphest.document</string>
        <key>UTTypeTagSpecification</key>
        <dict>
          <key>public.filename-extension</key>
          <string>graphest</string>
        </dict>
      </dict>
    </array>
  </dict>
</plist>
+25 −0
Original line number Diff line number Diff line
diff --git a/rust/graphest-flint-sys/build.rs b/rust/graphest-flint-sys/build.rs
index 14c0039..b1b0f6a 100644
--- a/rust/graphest-flint-sys/build.rs
+++ b/rust/graphest-flint-sys/build.rs
@@ -50,6 +50,7 @@ fn load_cache(env: &Environment) {
 }
 
 fn build_flint(env: &Environment) {
+    let _ = copy_dir_all("@flint@", env.out_dir.clone());
     if env.lib_dir.join("libflint.a").exists() {
         return;
     }
diff --git a/rust/graphest-fftw-sys/build.rs b/rust/graphest-fftw-sys/build.rs
index 2e3247d..a4ac573 100644
--- a/rust/graphest-fftw-sys/build.rs
+++ b/rust/graphest-fftw-sys/build.rs
@@ -53,6 +53,8 @@ fn load_cache(env: &Environment) {
 }
 
 fn build(env: &Environment) {
+    let _ = copy_dir_all("@fftwLib@", env.out_dir.clone());
+    let _ = copy_dir_all("@fftwDev@", env.out_dir.clone());
     if env.lib_dir.join("libfftw3f.a").exists() {
         return;
     }
+12 −0
Original line number Diff line number Diff line
diff --git a/src/main/main.ts b/src/main/main.ts
index d9413cc..b49e641 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -280,7 +280,6 @@ app.whenReady().then(async () => {
   }
 
   createMainWindow();
-  autoUpdater.checkForUpdatesAndNotify();
 });
 
 app.on("open-file", (_, path) => {
+7 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
  <mime-type type="application/x-graphest">
    <comment xml:lang="en">Graphest Document</comment>
    <glob pattern="*.graphest"/>
  </mime-type>
</mime-info>
+203 −0
Original line number Diff line number Diff line
{
  lib,
  stdenv,
  rustPlatform,
  fetchFromGitHub,
  fetchpatch,
  fetchYarnDeps,
  yarnConfigHook,
  yarnBuildHook,
  yarnInstallHook,
  replaceVars,
  copyDesktopItems,
  makeDesktopItem,
  makeBinaryWrapper,
  nix-update-script,
  nodejs,
  electron,
  gnum4,
  pkgsStatic,
  blas,
  darwin,
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "graphest";
  # 1.8.2 cannot build due to https://github.com/NixOS/nixpkgs/issues/483500
  version = "1.8.2-unstable-2026-01-21";

  src = fetchFromGitHub {
    owner = "unageek";
    repo = "graphest";
    rev = "2bcb478acd40a1174606e51f4affeca56446c9f6";
    hash = "sha256-+onb21xb8nhEKIL/B8sNufWaPVhABnpU3uIyRn4ISWQ=";
  };

  patches = [
    # specify what files should be installed in package.json (https://github.com/unageek/graphest/pull/1000)
    # not accepted by upstream because the developer did not intend to publish as an npm package
    (fetchpatch {
      name = "npm-files";
      url = "https://github.com/unageek/graphest/commit/1d1b8ee610a55bf9465a630499c6b0f6e9a66689.patch";
      hash = "sha256-5PU9iPy6gfesl40piRTw9+QMNf4GSGASYs8ZTLedS7o=";
    })

    # support opening file or url from command line (https://github.com/unageek/graphest/pull/1002)
    # otherwise the desktop entry is basically useless
    (fetchpatch {
      name = "open-file";
      url = "https://github.com/unageek/graphest/commit/05f2e486a5cdd79d5135057d67c398256dc5019c.patch";
      hash = "sha256-GkssYkHVps8PeHMX/Fj5uj6r+MLrZcETXtQq4mZcOrQ=";
    })

    ./disable-auto-update.patch
  ];

  nativeBuildInputs = [
    copyDesktopItems
    makeBinaryWrapper
    yarnConfigHook
    yarnBuildHook
    yarnInstallHook
    nodejs
  ]
  ++ lib.optional stdenv.hostPlatform.isDarwin darwin.autoSignDarwinBinariesHook;

  yarnOfflineCache = fetchYarnDeps {
    yarnLock = finalAttrs.src + "/yarn.lock";
    hash = "sha256-krpJflsoUPIzhdtyQu3WmapM4C63adwOq2Q6inUa3Xk=";
  };
  env.ELECTRON_SKIP_BINARY_DOWNLOAD = 1;

  preBuild = ''
    # do not set this in env because it must not be present in the configure phase
    export NODE_ENV=production
  '';
  yarnBuildScript = "build:app";

  checkPhase = ''
    runHook preCheck

    yarn test

    runHook postCheck
  '';

  postInstall = ''
    ln -s ${finalAttrs.passthru.graph}/bin/* -t $out/lib/node_modules/graphest/dist

    makeWrapper ${lib.getExe electron} $out/bin/Graphest \
      --add-flags $out/lib/node_modules/graphest \
      --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
      --inherit-argv0

    install -Dm444 build/icon.png $out/share/icons/hicolor/1024x1024/apps/graphest.png
    install -Dm444 ${./mime.xml} $out/share/mime/packages/graphest.xml
  ''
  + lib.optionalString stdenv.hostPlatform.isDarwin ''
    mkdir -p $out/Applications/Graphest.app/Contents/MacOS
    ln -s $out/bin/Graphest $out/Applications/Graphest.app/Contents/MacOS/Graphest
    install -Dm444 build/icon.icns $out/Applications/Graphest.app/Contents/Resources/icon.icns
    install -Dm444 ${
      # This is adapted from the extracted contents of the dmg package.
      # It should be generated from electron-builder.json,
      # but apparently electron-builder does not have a functionality for just generating Info.plist instead of everything.
      replaceVars ./Info.plist {
        version = builtins.elemAt (builtins.match "([^\\-]+).*" finalAttrs.version) 0;
      }
    } $out/Applications/Graphest.app/Contents/Info.plist
  '';

  desktopItems = [
    (makeDesktopItem {
      name = "graphest";
      desktopName = "Graphest";
      exec = "Graphest %u";
      icon = "graphest";
      categories = [
        "Science"
        "Math"
      ];
      comment = finalAttrs.meta.description;
      mimeTypes = [
        "x-scheme-handler/graphest"
        "application/x-graphest"
      ];
    })
  ];

  passthru = {
    updateScript = nix-update-script { };

    # The dependencies of graphest-fftw-sys and graphest-arb-sys need to be static.
    fftwFloatStatic = pkgsStatic.fftwFloat;
    flintStatic = pkgsStatic.flint.override {
      withBlas = true; # Some functions used by Graphest require BLAS
    };

    graph = rustPlatform.buildRustPackage {
      pname = "graphest-graph";
      inherit (finalAttrs) version src;

      patches = [
        # Use libraries from nixpkgs instead of trying to download them
        (replaceVars ./dependencies.patch {
          fftwLib = finalAttrs.passthru.fftwFloatStatic.out;
          fftwDev = finalAttrs.passthru.fftwFloatStatic.dev;
          flint = finalAttrs.passthru.flintStatic.out;
        })
      ];

      nativeBuildInputs = [
        gnum4 # used by build script of gmp-mpfr-sys
        rustPlatform.bindgenHook # used by build script of graphest-fftw-sys and graphest-arb-sys even on linux
      ];

      buildInputs = [
        blas # needed here because -lblas is added to RUSTFLAGS
      ];
      strictDeps = true;

      cargoHash = "sha256-GC0BHLWRKw6ThQiIfFQoOcGq9Xm0I9rt8uhwyalCa2I=";

      env = {
        RUSTC_BOOTSTRAP = 1; # smallvec: error[E0554]: `#![feature]` may not be used on the stable release channel
        RUSTFLAGS =
          "-lblas" # add -lblas to fix linking error regarding the function cblas_dgemm (bug of flint maybe???)
          # inari: error: RUSTFLAGS='-Ctarget-cpu=haswell' or later is required.
          + lib.optionalString stdenv.hostPlatform.isx86 " -Ctarget-cpu=haswell";
      };

      preCheck = ''
        # see rust/tests/graph.rs; executable path is hardcoded to be in target/release
        ln -s ../${stdenv.targetPlatform.rust.rustcTargetSpec}/release/graph -t target/release
      '';
      # TODO: These tests fail for unknown reasons.
      checkFlags = [
        "--skip=graph_tests::examples::t_564aaa5e88a54895b1851a1f1e5ffa3c"
        "--skip=graph_tests::examples::t_8c9209237ba04e67a715382c7bcbf5e0"
        "--skip=graph_tests::examples::t_b0175d3b58ed46158ba72bbd85670fc9"
        "--skip=graph_tests::examples::t_d2a0e9e88c41406a80a266d78f6dc7a5"
        "--skip=graph_tests::implicit::t_7f25b9f2bd3746b3ae8f95a82921de2b"
        "--skip=graph_tests::implicit::t_84a2738be35745da97a9b120c563b4b3"
      ];

      meta = finalAttrs.meta // {
        # See README of https://github.com/unageek/inari:
        # limited to platforms that are supported by the gmp-mpfr-sys crate.
        broken = stdenv.hostPlatform.isMsvc;
        mainProgram = "graph";
      };
    };
  };

  meta = {
    description = "Graphing calculator that can faithfully plot arbitrary mathematical relations";
    homepage = "https://github.com/unageek/graphest";
    changelog = "https://github.com/unageek/graphest/releases";
    downloadPage = "https://github.com/unageek/graphest/releases";
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [ ulysseszhan ];
    mainProgram = "Graphest";
  };
})