diff --git a/pkgs/by-name/po/portablemc/package.nix b/pkgs/by-name/po/portablemc/package.nix new file mode 100644 index 000000000000..444dd9d20550 --- /dev/null +++ b/pkgs/by-name/po/portablemc/package.nix @@ -0,0 +1,97 @@ +{ + lib, + stdenv, + python3Packages, + fetchFromGitHub, + installShellFiles, + jre, + + libX11, + libXext, + libXcursor, + libXrandr, + libXxf86vm, + libpulseaudio, + libGL, + glfw, + openal, + udev, + + textToSpeechSupport ? stdenv.isLinux, + flite, +}: + +let + # Copied from the `prismlauncher` package + runtimeLibs = [ + libX11 + libXext + libXcursor + libXrandr + libXxf86vm + + # lwjgl + libpulseaudio + libGL + glfw + openal + stdenv.cc.cc.lib + + # oshi + udev + ] ++ lib.optional textToSpeechSupport flite; +in +python3Packages.buildPythonApplication rec { + pname = "portablemc"; + version = "4.3.0"; + pyproject = true; + + disabled = python3Packages.pythonOlder "3.8"; + + src = fetchFromGitHub { + owner = "mindstorm38"; + repo = "portablemc"; + rev = "v${version}"; + hash = "sha256-jCv4ncXUWbkWlBZr3P1hNeVpdQzY9HtrFz+pmKknL0I="; + }; + + patches = [ + # Use the jre package provided by nixpkgs by default + ./use-builtin-java.patch + ]; + + nativeBuildInputs = [ installShellFiles ]; + + build-system = [ python3Packages.poetry-core ]; + + dependencies = [ python3Packages.certifi ]; + + # Note: Tests use networking, so we don't run them + + postInstall = '' + installShellCompletion --cmd portablemc \ + --bash <($out/bin/portablemc show completion bash) \ + --zsh <($out/bin/portablemc show completion zsh) + ''; + + preFixup = '' + makeWrapperArgs+=( + --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath runtimeLibs} + --prefix PATH : ${lib.makeBinPath [ jre ]} + ) + ''; + + meta = { + homepage = "https://github.com/mindstorm38/portablemc"; + description = "A fast, reliable and cross-platform command-line Minecraft launcher and API for developers"; + longDescription = '' + A fast, reliable and cross-platform command-line Minecraft launcher and API for developers. + Including fast and easy installation of common mod loaders such as Fabric, Forge, NeoForge and Quilt. + This launcher is compatible with the standard Minecraft directories. + ''; + changelog = "https://github.com/mindstorm38/portablemc/releases/tag/${src.rev}"; + license = lib.licenses.gpl3Only; + mainProgram = "portablemc"; + maintainers = with lib.maintainers; [ tomasajt ]; + }; +} diff --git a/pkgs/by-name/po/portablemc/use-builtin-java.patch b/pkgs/by-name/po/portablemc/use-builtin-java.patch new file mode 100644 index 000000000000..a88d97bae9b5 --- /dev/null +++ b/pkgs/by-name/po/portablemc/use-builtin-java.patch @@ -0,0 +1,47 @@ +diff --git a/portablemc/standard.py b/portablemc/standard.py +index f59c55d..0f017e1 100644 +--- a/portablemc/standard.py ++++ b/portablemc/standard.py +@@ -843,6 +843,8 @@ class Version: + if jvm_major_version is not None and not isinstance(jvm_major_version, int): + raise ValueError("metadata: /javaVersion/majorVersion must be an integer") + ++ return self._resolve_builtin_jvm(watcher, JvmNotFoundError.UNSUPPORTED_ARCH, jvm_major_version) ++ + if platform.system() == "Linux" and platform.libc_ver()[0] != "glibc": + return self._resolve_builtin_jvm(watcher, JvmNotFoundError.UNSUPPORTED_LIBC, jvm_major_version) + +@@ -926,31 +928,10 @@ class Version: + builtin_path = shutil.which(jvm_bin_filename) + if builtin_path is None: + raise JvmNotFoundError(reason) +- +- try: +- +- # Get version of the JVM. +- process = Popen([builtin_path, "-version"], bufsize=1, stdout=PIPE, stderr=STDOUT, universal_newlines=True) +- stdout, _stderr = process.communicate(timeout=1) +- +- version_start = stdout.index(f"1.{major_version}" if major_version <= 8 else str(major_version)) +- version = None +- +- # Parse version by getting all character that are numeric or '.'. +- for i, ch in enumerate(stdout[version_start:]): +- if not ch.isnumeric() and ch not in (".", "_"): +- version = stdout[version_start:i] +- break +- +- if version is None: +- raise ValueError() +- +- except (TimeoutExpired, ValueError): +- raise JvmNotFoundError(JvmNotFoundError.BUILTIN_INVALID_VERSION) + + self._jvm_path = Path(builtin_path) +- self._jvm_version = version +- watcher.handle(JvmLoadedEvent(version, JvmLoadedEvent.BUILTIN)) ++ self._jvm_version = "nixpkgs" ++ watcher.handle(JvmLoadedEvent("nixpkgs", JvmLoadedEvent.BUILTIN)) + + def _download(self, watcher: Watcher) -> None: +