rec { description = "Paper Mario (N64) asset editor"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05"; gradle-dot-nix.url = "github:CrazyChaoz/gradle-dot-nix"; }; outputs = { nixpkgs, gradle-dot-nix, ... }: let javaVersion = 17; supportedSystems = [ "x86_64-linux" "x86_64-darwin" "x86_64-darwin" "aarch64-darwin" ]; forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f { pkgs = import nixpkgs { inherit system; }; }); makeLibPath = pkgs: (with pkgs; lib.makeLibraryPath [ libGL ]); in { devShells = forEachSupportedSystem ({ pkgs }: let jdk = pkgs."jdk${toString javaVersion}"; gradle = pkgs.gradle.override { java = jdk; }; lombok = pkgs.lombok.override { inherit jdk; }; jdtls = pkgs.jdt-language-server.override { inherit jdk; }; in { default = pkgs.mkShell { packages = [ gradle jdk jdtls ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ # for tinyfiledialogs pkgs.gnome.zenity ]; shellHook = let javaOptions = "-javaagent:${lombok}/share/java/lombok.jar -Dsun.java2d.uiScale=2 -Dsun.awt.xembedserver=true"; prev = "\${JAVA_TOOL_OPTIONS:+ $JAVA_TOOL_OPTIONS}"; in '' export JAVA_TOOL_OPTIONS="${javaOptions}${prev}" export JAVA_HOME="${jdk}" export GRADLE_HOME="${gradle}" export LD_LIBRARY_PATH="${makeLibPath pkgs}" export _JAVA_AWT_WM_NONREPARENTING=1 # Wayland issues ''; }; }); packages = forEachSupportedSystem ({ pkgs }: let gradle-init-script = (import gradle-dot-nix { inherit pkgs; gradle-verification-metadata-file = ./gradle/verification-metadata.xml; # generated by `gradle -M sha256 createReleaseZip` }).gradle-init; pname = "star-rod"; desktopItem = pkgs.makeDesktopItem { name = pname; desktopName = "Star Rod"; exec = pname; comment = description; type = "Application"; categories = [ "Development" "3DGraphics" "Java" ]; keywords = [ "Paper Mario" "Nintendo 64" "ROM Hacking" "Modding" ]; icon = "star-rod"; terminal = false; startupWMClass = "app-StarRodMain"; }; in { default = pkgs.stdenv.mkDerivation rec { inherit pname; version = builtins.elemAt (builtins.match "^.*version=([[:digit:].]+).*$" (builtins.readFile ./app.properties)) 0; src = ./.; nativeBuildInputs = let jdk = pkgs."jdk${toString javaVersion}"; gradle = pkgs.gradle.override { java = jdk; }; in [ pkgs.makeWrapper pkgs.unzip gradle jdk ]; buildPhase = '' export GRADLE_USER_HOME="/tmp" # https://github.com/NixOS/nixpkgs/issues/34707 gradle createReleaseZip --info -I ${gradle-init-script} --offline --full-stacktrace ''; installPhase = '' unzip -d $out build/release/StarRod-*.zip rm $out/StarRod.bat mkdir -p $out/share/java mv $out/StarRod.jar $out/share/java mkdir -p $out/bin makeWrapper ${pkgs.jre}/bin/java $out/bin/${pname} \ --add-flags "-cp $out/share/java/StarRod.jar -mx2G -Djava.library.path=${makeLibPath pkgs} app.StarRodMain" # TODO: icon #install -Dm444 logo_512.png $out/share/icons/hicolor/512x512/apps/${pname}.png install -Dm444 -t $out/share/applications ${desktopItem}/share/applications/* ''; meta = with pkgs.lib; { homepage = "https://github.com/z64a/star-rod"; inherit description; mainProgram = pname; license = licenses.mit; platforms = supportedSystems; }; }; }); }; }