From 1023d5dafaca347b9aafad9bc2bcfe51b4063813 Mon Sep 17 00:00:00 2001 From: Niklas Korz Date: Thu, 9 Apr 2026 23:07:48 +0200 Subject: [PATCH] gram: init at 2.1.0 --- pkgs/by-name/gr/gram/package.nix | 202 +++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 pkgs/by-name/gr/gram/package.nix diff --git a/pkgs/by-name/gr/gram/package.nix b/pkgs/by-name/gr/gram/package.nix new file mode 100644 index 000000000000..06bb142a33ef --- /dev/null +++ b/pkgs/by-name/gr/gram/package.nix @@ -0,0 +1,202 @@ +{ + lib, + rustPlatform, + fetchFromCodeberg, + cmake, + pkg-config, + protobuf, + fontconfig, + libgit2, + openssl, + sqlite, + zlib, + zstd, + libxkbcommon, + wayland, + libxcb, + stdenv, + libGL, + vulkan-loader, + envsubst, + nix-update-script, + cargo-about, + versionCheckHook, + cargo-bundle, + git, + testers, + writableTmpDirAsHomeHook, + + buildRemoteServer ? true, +}: + +rustPlatform.buildRustPackage (finalAttrs: { + pname = "gram"; + version = "2.1.0"; + + outputs = [ + "out" + ] + ++ lib.optionals buildRemoteServer [ + "remote_server" + ]; + + src = fetchFromCodeberg { + owner = "GramEditor"; + repo = "gram"; + tag = finalAttrs.version; + hash = "sha256-9MfNGl0bk8RBkYutHFMnAEiAQVnUBQguQUkyt+O0vnY="; + }; + + postPatch = '' + # The generate-licenses script wants a specific version of cargo-about eventhough + # newer versions work just as well. + substituteInPlace script/generate-licenses \ + --replace-fail '$CARGO_ABOUT_VERSION' '${cargo-about.version}' + ''; + + cargoHash = "sha256-sUSkXYZ81CFwxzDiT0Va0VnWVKlVS683DVHLZeoSJ4w="; + + __structuredAttrs = true; + + nativeBuildInputs = [ + cargo-about + cmake + pkg-config + protobuf + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + cargo-bundle + ]; + + dontUseCmakeConfigure = true; + + buildInputs = [ + libgit2 + openssl + sqlite + zlib + zstd + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + fontconfig + libxcb + libxkbcommon + ]; + + cargoBuildFlags = [ + "--package=gram" + "--package=cli" + ] + ++ lib.optionals buildRemoteServer [ "--package=remote_server" ]; + + # Required on darwin because we don't have access to the proprietary Metal shader compiler. + buildFeatures = lib.optionals stdenv.hostPlatform.isDarwin [ "gpui/runtime_shaders" ]; + + env = { + ALLOW_MISSING_LICENSES = true; + OPENSSL_NO_VENDOR = true; + LIBGIT2_NO_VENDOR = true; + LIBSQLITE3_SYS_USE_PKG_CONFIG = true; + ZSTD_SYS_USE_PKG_CONFIG = true; + RELEASE_VERSION = finalAttrs.version; + }; + + preBuild = '' + bash script/generate-licenses + ''; + + nativeCheckInputs = [ + writableTmpDirAsHomeHook + ]; + + useNextest = true; + + remoteServerExecutableName = "gram-remote-server-stable-${finalAttrs.version}"; + installPhase = '' + runHook preInstall + + release_target="target/${stdenv.hostPlatform.rust.cargoShortTarget}/release" + '' + + lib.optionalString stdenv.hostPlatform.isDarwin '' + # cargo-bundle expects the binary in target/release + mv $release_target/gram target/release/gram + + pushd crates/gram + # Note that this is GNU sed, while Gram's bundle-mac uses BSD sed + sed -i "s/package.metadata.bundle-stable/package.metadata.bundle/" Cargo.toml + export CARGO_BUNDLE_SKIP_BUILD=true + app_path=$(cargo bundle --release | xargs) + popd + + mkdir -p $out/Applications $out/bin + # Gram expects git next to its own binary + ln -s ${lib.getExe git} $app_path/Contents/MacOS/git + mv $release_target/cli $app_path/Contents/MacOS/cli + mv $app_path $out/Applications/ + + # Physical location of the CLI must be inside the app bundle as this is used + # to determine which app to start + ln -s $out/Applications/Gram.app/Contents/MacOS/cli $out/bin/gram + '' + + lib.optionalString stdenv.hostPlatform.isLinux '' + install -Dm755 $release_target/gram $out/libexec/gram-editor + install -Dm755 $release_target/cli $out/bin/gram + + install -Dm644 $src/crates/gram/resources/app.liten.Gram.svg $out/share/icons/hicolor/scalable/apps/app.liten.Gram.svg + install -Dm644 $src/crates/gram/resources/app.liten.Gram-symbolic.svg $out/share/icons/hicolor/scalable/apps/app.liten.Gram-symbolic.svg + + # See https://codeberg.org/GramEditor/gram/src/branch/main/crates/gram/resources/gram.desktop.in + ( + export DO_STARTUP_NOTIFY="true" + export APP_CLI="gram" + export APP_ICON="app.liten.Gram" + export APP_NAME="Gram" + export APP_ARGS="%U" + mkdir -p "$out/share/applications" + ${lib.getExe envsubst} < "crates/gram/resources/gram.desktop.in" > "$out/share/applications/app.liten.Gram.desktop" + ) + '' + + lib.optionalString buildRemoteServer '' + install -Dm755 $release_target/remote_server $remote_server/bin/${finalAttrs.remoteServerExecutableName} + '' + + '' + runHook postInstall + ''; + + postFixup = lib.optionalString stdenv.hostPlatform.isLinux '' + patchelf $out/libexec/gram-editor --add-rpath ${ + lib.makeLibraryPath [ + libGL + vulkan-loader + wayland + ] + } + ''; + + nativeInstallCheckInputs = [ + versionCheckHook + ]; + doInstallCheck = true; + + passthru = { + updateScript = nix-update-script { }; + tests = { + remoteServerVersion = testers.testVersion { + package = finalAttrs.finalPackage.remote_server; + command = "${finalAttrs.remoteServerExecutableName} version"; + }; + }; + }; + + meta = { + description = "Powerful and modern source code editor"; + homepage = "https://gram-editor.com"; + changelog = "https://codeberg.org/GramEditor/gram/releases/tag/${finalAttrs.version}"; + license = lib.licenses.gpl3Only; + maintainers = with lib.maintainers; [ + niklaskorz + ]; + mainProgram = "gram"; + platforms = lib.platforms.linux ++ lib.platforms.darwin; + }; +})