heroic: Repackage from source and wrap in FHS

* Instead of using the prebuilt AppImage, build from source and wrap with
  Electron from nixpkgs.

* Wrap in FHS user environment with buildFHSUserEnvBubblewrap.

* Correct meta.description to mention GOG support.

* Simplify meta attribute

* Update maintainers.
  Taking over sole maintainership from wolfanguakang.

* Use gogdl and legendary-gl from nixpkgs
This commit is contained in:
Aidan Gauland 2022-08-20 10:26:01 +12:00
parent d63d265c4e
commit 1abe038db9
No known key found for this signature in database
GPG key ID: 16E68DD2D0E77C91
6 changed files with 24445 additions and 24 deletions

View file

@ -1,39 +1,70 @@
{ lib, fetchurl, appimageTools }:
{ lib
, mkYarnPackage
, fetchFromGitHub
, makeWrapper
, electron
, gogdl
, legendary-gl
}:
let
pname = "heroic";
version = "2.2.6";
name = "${pname}-${version}";
src = fetchurl {
url = "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/releases/download/v${version}/Heroic-${version}.AppImage";
sha256 = "sha256-kL30/G4DpDPwGN7PvbWest7TcgL4Rd1c2OM4nRCT3bg=";
mkYarnPackage rec {
pname = "heroic-unwrapped";
version = "2.4.3";
src = fetchFromGitHub {
owner = "Heroic-Games-Launcher";
repo = "HeroicGamesLauncher";
rev = "v${version}";
sha256 = "sha256-x9zIM2kKi+JgIGIidQYjyjqVGweFJ8DE7IX9gYULQuQ=";
};
appimageContents = appimageTools.extractType2 { inherit name src; };
in
appimageTools.wrapType2 {
inherit name src;
packageJSON = ./package.json;
yarnLock = ./yarn.lock;
yarnNix = ./yarn.nix;
extraInstallCommands = ''
mv $out/bin/${name} $out/bin/${pname}
nativeBuildInputs = [
makeWrapper
];
mkdir -p $out/share/${pname}
cp -a ${appimageContents}/locales $out/share/${pname}
cp -a ${appimageContents}/resources $out/share/${pname}
DISABLE_ESLINT_PLUGIN = "true";
install -m 444 -D ${appimageContents}/heroic.desktop -t $out/share/applications
postBuild = let
yarnCmd = "yarn --production --offline --frozen-lockfile --ignore-engines --ignore-scripts --lockfile ${yarnLock}";
in ''
${yarnCmd} build-electron
${yarnCmd} build
'';
cp -a ${appimageContents}/usr/share/icons $out/share/
# Disable bundling into a tar archive.
doDist = false;
substituteInPlace $out/share/applications/heroic.desktop \
--replace 'Exec=AppRun' 'Exec=heroic'
# --disable-gpu-compositing is to work around upstream bug
# https://github.com/electron/electron/issues/32317
postInstall = let
deps = "$out/libexec/heroic/deps/heroic";
in ''
rm -rf "${deps}/public/bin" "${deps}/build/bin"
mkdir -p "${deps}/public/bin/linux"
ln -s "${gogdl}/bin/gogdl" "${legendary-gl}/bin/legendary" "${deps}/public/bin/linux"
makeWrapper "${electron}/bin/electron" "$out/bin/heroic" \
--inherit-argv0 \
--add-flags --disable-gpu-compositing \
--add-flags "${deps}"
substituteInPlace "${deps}/flatpak/com.heroicgameslauncher.hgl.desktop" \
--replace "Exec=heroic-run" "Exec=heroic"
mkdir -p "$out/share/applications" "$out/share/icons/hicolor/512x512/apps"
ln -s "${deps}/flatpak/com.heroicgameslauncher.hgl.desktop" "$out/share/applications"
ln -s "${deps}/flatpak/com.heroicgameslauncher.hgl.png" "$out/share/icons/hicolor/512x512/apps"
'';
meta = with lib; {
description = "A Native GUI Epic Games Launcher for Linux, Windows and Mac";
description = "A Native GOG and Epic Games Launcher for Linux, Windows and Mac";
homepage = "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher";
license = licenses.gpl3Only;
maintainers = with maintainers; [ wolfangaukang ];
maintainers = with maintainers; [ aidalgol ];
platforms = [ "x86_64-linux" ];
mainProgram = "heroic";
};
}

View file

@ -0,0 +1,109 @@
{ lib
, buildFHSUserEnv
, heroic-unwrapped
, extraPkgs ? pkgs: [ ]
, extraLibraries ? pkgs: [ ]
}:
buildFHSUserEnv {
name = "heroic";
runScript = "heroic";
targetPkgs = pkgs: with pkgs; [
heroic-unwrapped
curl
gawk
gnome.zenity
kdialog
mangohud
nettools
opencl-headers
p7zip
perl
psmisc
python3
which
xorg.xrandr
zstd
] ++ extraPkgs pkgs;
multiPkgs = let
xorgDeps = pkgs: with pkgs.xorg; [
libpthreadstubs
libSM
libX11
libXaw
libxcb
libXcomposite
libXcursor
libXdmcp
libXext
libXi
libXinerama
libXmu
libXrandr
libXrender
libXv
libXxf86vm
];
in pkgs: with pkgs; [
alsa-lib
bash
cairo
coreutils
cups
dbus
freetype
fribidi
giflib
glib
gnutls
gtk3
lcms2
libevdev
libGLU
libglvnd
libjpeg
libkrb5
libmpeg2
libogg
libopus
libpng
libpulseaudio
libselinux
libsndfile
libsndfile
libtheora
libtiff
libusb1
libv4l
libva
libvorbis
libxkbcommon
libxml2
mpg123
ocl-icd
openldap
pipewire
samba4
sane-backends
SDL2
udev
udev
unixODBC
util-linux
vulkan-loader
wayland
zlib
] ++ xorgDeps pkgs
++ extraLibraries pkgs;
extraInstallCommands = ''
mkdir -p $out/share
ln -s ${heroic-unwrapped}/share/applications $out/share
ln -s ${heroic-unwrapped}/share/icons $out/share
'';
meta = heroic-unwrapped.meta;
}

View file

@ -0,0 +1,244 @@
{
"name": "heroic",
"version": "2.4.0",
"private": true,
"main": "public/main.js",
"homepage": "./",
"license": "GPL-3.0-only",
"description": "An Open Source Launcher for GOG and Epic Games",
"repository": {
"type": "Github",
"url": "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher"
},
"author": {
"name": "Heroic Games Launcher",
"email": "heroicgameslauncher@protonmail.com"
},
"build": {
"appId": "com.electron.heroic",
"productName": "Heroic",
"files": [
"build/**/*",
"node_modules/**/*",
"!build/bin/*",
"build/bin/legendary.LICENSE"
],
"asarUnpack": [
"build/icon.png",
"build/icon.icns",
"build/win_icon.ico",
"build/icon-dark.png",
"build/icon-light.png"
],
"directories": {
"buildResources": "public"
},
"protocols": [
{
"name": "heroic",
"schemes": [
"heroic"
]
}
],
"win": {
"artifactName": "Heroic_Setup_${version}.${ext}",
"icon": "build/win_icon.ico",
"asarUnpack": [
"build/bin/win32/legendary.exe",
"build/bin/win32/gogdl.exe"
],
"files": [
"build/bin/win32/*"
]
},
"mac": {
"target": "dmg",
"category": "public.app-category.games",
"icon": "build/icon.icns",
"asarUnpack": [
"build/bin/darwin/legendary",
"build/bin/darwin/gogdl"
],
"files": [
"build/bin/darwin/*"
]
},
"dmg": {
"background": "public/dmg.png",
"window": {
"width": "600",
"height": "500"
},
"contents": [
{
"x": 10,
"y": 215,
"type": "file"
},
{
"x": 420,
"y": 215,
"type": "link",
"path": "/Applications"
}
]
},
"linux": {
"category": "Game",
"icon": "build/icon.icns",
"description": "An Open Source Launcher for GOG and Epic Games",
"desktop": {
"Name": "Heroic Games Launcher",
"Comment[de]": "Ein Open Source Spielelauncher for GOG und Epic Games"
},
"asarUnpack": [
"build/bin/linux/legendary",
"build/bin/linux/gogdl"
],
"files": [
"build/bin/linux/*"
]
},
"deb": {
"packageCategory": "games",
"depends": [
"gawk",
"curl"
]
},
"pacman": {
"packageCategory": "games",
"depends": [
"gawk",
"curl"
]
},
"rpm": {
"packageCategory": "games",
"depends": [
"gawk",
"curl"
]
}
},
"dependencies": {
"@emotion/react": "^11.9.0",
"@emotion/styled": "^11.8.1",
"@fontsource/cabin": "^4.5.5",
"@fontsource/rubik": "^4.5.6",
"@fortawesome/fontawesome-svg-core": "^6.1.1",
"@fortawesome/free-brands-svg-icons": "^6.1.1",
"@fortawesome/free-regular-svg-icons": "^6.1.1",
"@fortawesome/free-solid-svg-icons": "^6.1.1",
"@fortawesome/react-fontawesome": "^0.1.18",
"@mui/icons-material": "^5.6.2",
"@mui/material": "^5.6.2",
"@node-steam/vdf": "^2.2.0",
"axios": "^0.26.1",
"check-disk-space": "^3.3.1",
"classnames": "^2.3.1",
"crc": "^4.1.1",
"discord-rich-presence-typescript": "^0.0.8",
"electron-store": "^8.0.1",
"electron-updater": "^5.0.1",
"filesize": "^8.0.7",
"font-list": "^1.4.5",
"fs-extra": "^10.1.0",
"fuse.js": "^6.6.2",
"graceful-fs": "^4.2.10",
"heroic-wine-downloader": "^1.2.3",
"i18next": "^21.6.16",
"i18next-fs-backend": "^1.1.4",
"i18next-http-backend": "^1.4.0",
"ini": "^3.0.0",
"plist": "^3.0.5",
"react": "17",
"react-dom": "17",
"react-i18next": "^11.16.7",
"react-router-dom": "^6.3.0",
"react-scripts": "^5.0.1",
"shlex": "^2.1.2",
"simple-keyboard": "^3.4.136",
"source-map-support": "^0.5.21",
"steam-shortcut-editor": "^3.1.1",
"systeminformation": "^5.12.3",
"tslib": "^2.4.0"
},
"scripts": {
"start": "DISABLE_ESLINT_PLUGIN=true nf start -p 3000 && electron-start",
"electron-start": "ELECTRON_IS_DEV=1 node public/start-react",
"electron": "yarn build-electron && electron . --trace-warnings",
"react-start": "HOST=localhost BROWSER=none react-scripts start",
"react-start:win": "react-scripts start",
"build": "react-scripts build",
"test": "jest --noStackTrace",
"test-watch": "jest --watch --maxWorkers=25%",
"test:ci": "jest --runInBand --silent",
"eject": "react-scripts eject",
"release:linux": "GH_TOKEN='${{ secrets.WORKFLOW_TOKEN }}' yarn build-electron && yarn build && electron-builder -c.extraMetadata.main=build/main.js -p always --linux deb AppImage rpm pacman tar.xz",
"release:mac": "GH_TOKEN='${{ secrets.WORKFLOW_TOKEN }}' yarn build-electron && yarn build && electron-builder -c.extraMetadata.main=build/main.js -p always --mac",
"release:win": "yarn build-electron && yarn build && electron-builder -c.extraMetadata.main=build/main.js -p always --win nsis portable",
"dist:linux": "GH_TOKEN='${{ secrets.WORKFLOW_TOKEN }}' yarn build-electron && yarn build && electron-builder -c.extraMetadata.main=build/main.js --linux",
"dist:mac": "GH_TOKEN='${{ secrets.WORKFLOW_TOKEN }}' yarn build-electron && yarn build && electron-builder -c.extraMetadata.main=build/main.js --mac",
"dist:win": "yarn build-electron && yarn build && electron-builder -c.extraMetadata.main=build/main.js --win",
"lint": "eslint -c .eslintrc --ext .tsx,ts ./src && eslint -c .eslintrc --ext .ts ./electron",
"lint-fix": "eslint --fix -c .eslintrc --ext .tsx,ts ./src && eslint --fix -c .eslintrc --ext .ts ./electron",
"build-electron": "tsc --project electron/tsconfig.json",
"watch-electron": "tsc --watch --project electron/tsconfig.json",
"dist-flatpak": "cd flatpak && flatpak-builder build local.heroic.yml --install --force-clean --user",
"flatpak-test": "yarn dist:linux appimage && cd flatpak && flatpak-builder build local.heroic.yml --install --force-clean --user",
"i18n": "i18next",
"prepare": "husky install",
"prettier": "prettier --check .",
"prettier-fix": "prettier --write ."
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"devDependencies": {
"@testing-library/dom": "^7.31.0",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.1.1",
"@testing-library/user-event": "^14.1.1",
"@types/classnames": "^2.3.1",
"@types/i18next-fs-backend": "^1.1.2",
"@types/ini": "^1.3.31",
"@types/jest": "^27.4.1",
"@types/node": "^17.0.25",
"@types/plist": "^3.0.2",
"@types/react": "^18.0.6",
"@types/react-dom": "^18.0.2",
"@types/react-router-dom": "^5.3.3",
"@types/tmp": "^0.2.3",
"@typescript-eslint/eslint-plugin": "^5.20.0",
"@typescript-eslint/parser": "^5.20.0",
"electron": "^20.0.1",
"electron-builder": "^23.1.0",
"electron-devtools-installer": "^3.2.0",
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-react": "^7.29.4",
"foreman": "^3.0.1",
"husky": "^7.0.4",
"i18next-parser": "^6.3.0",
"prettier": "^2.6.2",
"pretty-quick": "^3.1.3",
"tmp": "^0.2.1",
"ts-jest": "^27.1.4",
"typescript": "^4.6.3"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version"
]
}
}

11716
pkgs/games/heroic/yarn.lock Normal file

File diff suppressed because it is too large Load diff

12317
pkgs/games/heroic/yarn.nix Normal file

File diff suppressed because it is too large Load diff

View file

@ -33147,7 +33147,11 @@ with pkgs;
gotypist = callPackage ../games/gotypist { };
heroic = callPackage ../games/heroic { };
heroic-unwrapped = callPackage ../games/heroic { };
heroic = callPackage ../games/heroic/fhsenv.nix {
buildFHSUserEnv = buildFHSUserEnvBubblewrap;
};
julius = callPackage ../games/julius { };