├── .github └── workflows │ ├── CI.yml │ └── main.yml ├── README.md ├── build_lutris.sh ├── loaders.cache ├── lutris-junest.sh ├── lutris.desktop ├── lutris.png ├── lutris.yml ├── mime.tar.gz └── sitecustomize.py /.github/workflows/CI.yml: -------------------------------------------------------------------------------- 1 | name: Lutris Appimage 2 | concurrency: 3 | group: build-${{ github.ref }} 4 | cancel-in-progress: true 5 | 6 | on: 7 | schedule: 8 | - cron: "0 21 * * 0" 9 | workflow_dispatch: 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-22.04 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: build 18 | if: always() 19 | run: | 20 | sudo apt update && sudo apt install desktop-file-utils 21 | chmod a+x ./lutris-junest.sh 22 | ./lutris-junest.sh 23 | mkdir dist 24 | mv *AppImage* dist/ 25 | 26 | - name: Upload artifact 27 | uses: actions/upload-artifact@v4.4.0 28 | with: 29 | name: AppImage 30 | path: 'dist' 31 | 32 | release: 33 | needs: [build] 34 | permissions: write-all 35 | runs-on: ubuntu-latest 36 | 37 | steps: 38 | - uses: actions/download-artifact@v4.1.8 39 | with: 40 | name: AppImage 41 | 42 | - name: release 43 | uses: marvinpinto/action-automatic-releases@latest 44 | with: 45 | title: 'Continuous' 46 | automatic_release_tag: 'continuous' 47 | prerelease: false 48 | draft: false 49 | files: | 50 | *.AppImage* 51 | repo_token: ${{ secrets.GITHUB_TOKEN }} 52 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: lutris CI 2 | 3 | # Controls when the action will run. 4 | on: 5 | # Build at 00:00 every 6th day 6 | #schedule: 7 | # - cron: "0 0 */6 * *" 8 | workflow_dispatch: 9 | # Triggers the workflow on push or pull request events but only for the main branch 10 | #push: 11 | # branches: [ main ] 12 | # paths-ignore: [ '**/README.md' ] 13 | #pull_request: 14 | # branches: [ main ] 15 | # paths-ignore: [ '**/README.md' ] 16 | 17 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 18 | jobs: 19 | build: 20 | runs-on: ubuntu-latest 21 | steps: 22 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 23 | - uses: actions/checkout@v4 24 | 25 | - name: Make AppImage 26 | run: | 27 | chmod +x ./build_lutris.sh 28 | ./build_lutris.sh 29 | mkdir dist 30 | echo "$PWD" 31 | ls . 32 | mv *.AppImage* dist/ 33 | echo "latest" > dist/version # Define version dynamically if needed 34 | 35 | - name: Upload artifact 36 | uses: actions/upload-artifact@v4 37 | with: 38 | name: AppImage 39 | path: 'dist/*.AppImage*' 40 | 41 | - name: Upload version artifact 42 | uses: actions/upload-artifact@v4 43 | with: 44 | name: version 45 | path: 'dist/version' 46 | 47 | release: 48 | needs: [build] 49 | permissions: 50 | contents: write 51 | runs-on: ubuntu-latest 52 | 53 | steps: 54 | - name: Download AppImage artifact 55 | uses: actions/download-artifact@v4 56 | with: 57 | name: AppImage 58 | 59 | - name: Delete Previous Release 60 | run: | 61 | gh release delete "${APP_VERSION}" --repo "${GITHUB_REPOSITORY}" --cleanup-tag -y || echo "No release to delete" 62 | env: 63 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 64 | continue-on-error: true 65 | 66 | - name: Create Release 67 | uses: softprops/action-gh-release@v2 68 | with: 69 | name: "Lutris AppImage ${{ env.APP_VERSION }}" 70 | tag_name: latest 71 | prerelease: false 72 | draft: false 73 | generate_release_notes: false 74 | make_latest: true 75 | files: | 76 | *.AppImage* 77 | env: 78 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lutris AppImage 2 |

This is an unofficial AppImage package for Lutris

3 | 4 | 5 | ### [Telegram Group](https://t.me/appimagelucasmz1) 6 | -------------------------------------------------------------------------------- /build_lutris.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | set -x 4 | sudo apt install -y wget binutils coreutils desktop-file-utils libfuse2 5 | wget -c -q "https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage" -O appimage-builder ; chmod +x appimage-builder 6 | ./appimage-builder --recipe lutris.yml --skip-appimage --skip-tests 7 | cp -f sitecustomize.py ./AppDir/etc/python3.*/ 8 | cp -f loaders.cache ./AppDir/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/ 9 | cp -f lutris.desktop ./AppDir/ 10 | cp -f lutris.png ./AppDir/ 11 | wget -c -q "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" -O appimagetool ; chmod +x appimagetool 12 | tar xvf mime.tar.gz -C ./AppDir/usr/share/ 13 | ARCH=x86_64 ./appimagetool -n ./AppDir/ 14 | -------------------------------------------------------------------------------- /loaders.cache: -------------------------------------------------------------------------------- 1 | # GdkPixbuf Image Loader Modules file 2 | # Automatically generated file, do not edit 3 | # Created by gdk-pixbuf-query-loaders from gdk-pixbuf-2.40.0 4 | # 5 | "libpixbufloader-ani.so" 6 | "ani" 4 "gdk-pixbuf" "Windows animated cursor" "LGPL" 7 | "application/x-navi-animation" "" 8 | "ani" "" 9 | "RIFF ACON" " xxxx " 100 10 | 11 | "libpixbufloader-bmp.so" 12 | "bmp" 5 "gdk-pixbuf" "BMP" "LGPL" 13 | "image/bmp" "image/x-bmp" "image/x-MS-bmp" "" 14 | "bmp" "" 15 | "BM" "" 100 16 | 17 | "libpixbufloader-gif.so" 18 | "gif" 4 "gdk-pixbuf" "GIF" "LGPL" 19 | "image/gif" "" 20 | "gif" "" 21 | "GIF8" "" 100 22 | 23 | "libpixbufloader-icns.so" 24 | "icns" 4 "gdk-pixbuf" "MacOS X icon" "GPL" 25 | "image/x-icns" "" 26 | "icns" "" 27 | "icns" "" 100 28 | 29 | "libpixbufloader-ico.so" 30 | "ico" 5 "gdk-pixbuf" "Windows icon" "LGPL" 31 | "image/x-icon" "image/x-ico" "image/x-win-bitmap" "image/vnd.microsoft.icon" "application/ico" "image/ico" "image/icon" "text/ico" "" 32 | "ico" "cur" "" 33 | " \001 " "zz znz" 100 34 | " \002 " "zz znz" 100 35 | 36 | "libpixbufloader-jpeg.so" 37 | "jpeg" 5 "gdk-pixbuf" "JPEG" "LGPL" 38 | "image/jpeg" "" 39 | "jpeg" "jpe" "jpg" "" 40 | "\377\330" "" 100 41 | 42 | "libpixbufloader-png.so" 43 | "png" 5 "gdk-pixbuf" "PNG" "LGPL" 44 | "image/png" "" 45 | "png" "" 46 | "\211PNG\r\n\032\n" "" 100 47 | 48 | "libpixbufloader-pnm.so" 49 | "pnm" 4 "gdk-pixbuf" "PNM/PBM/PGM/PPM" "LGPL" 50 | "image/x-portable-anymap" "image/x-portable-bitmap" "image/x-portable-graymap" "image/x-portable-pixmap" "" 51 | "pnm" "pbm" "pgm" "ppm" "" 52 | "P1" "" 100 53 | "P2" "" 100 54 | "P3" "" 100 55 | "P4" "" 100 56 | "P5" "" 100 57 | "P6" "" 100 58 | 59 | "libpixbufloader-qtif.so" 60 | "qtif" 4 "gdk-pixbuf" "QuickTime" "LGPL" 61 | "image/x-quicktime" "image/qtif" "" 62 | "qtif" "qif" "" 63 | "abcdidsc" "xxxx " 100 64 | "abcdidat" "xxxx " 100 65 | 66 | "libpixbufloader-svg.so" 67 | "svg" 6 "gdk-pixbuf" "Scalable Vector Graphics" "LGPL" 68 | "image/svg+xml" "image/svg" "image/svg-xml" "image/vnd.adobe.svg+xml" "text/xml-svg" "image/svg+xml-compressed" "" 69 | "svg" "svgz" "svg.gz" "" 70 | " > ./.junest/etc/pacman.conf 53 | } 54 | 55 | _enable_chaoticaur() { 56 | # This function is ment to be used during the installation of JuNest, see "_pacman_patches" 57 | ./.local/share/junest/bin/junest -- sudo pacman-key --recv-key 3056513887B78AEB --keyserver keyserver.ubuntu.com 58 | ./.local/share/junest/bin/junest -- sudo pacman-key --lsign-key 3056513887B78AEB 59 | ./.local/share/junest/bin/junest -- sudo pacman-key --populate chaotic 60 | ./.local/share/junest/bin/junest -- sudo pacman --noconfirm -U 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst' 61 | printf "\n[chaotic-aur]\nInclude = /etc/pacman.d/chaotic-mirrorlist" >> ./.junest/etc/pacman.conf 62 | } 63 | 64 | _enable_archlinuxcn() { 65 | ./.local/share/junest/bin/junest -- sudo pacman --noconfirm -U "https://repo.archlinuxcn.org/x86_64/$(curl -Ls https://repo.archlinuxcn.org/x86_64/ | tr '"' '\n' | grep "^archlinuxcn-keyring.*zst$" | tail -1)" 66 | printf "\n[archlinuxcn]\n#SigLevel = Never\nServer = http://repo.archlinuxcn.org/\$arch" >> ./.junest/etc/pacman.conf 67 | } 68 | 69 | _custom_mirrorlist() { 70 | COUNTRY=$(curl -i ipinfo.io 2>/dev/null | grep country | cut -c 15- | cut -c -2) 71 | if [ -n "$GITHUB_REPOSITORY_OWNER" ] || ! curl --output /dev/null --silent --head --fail "https://archlinux.org/mirrorlist/?country=$COUNTRY" 1>/dev/null; then 72 | curl -Ls https://archlinux.org/mirrorlist/all | awk NR==2 RS= | sed 's/#Server/Server/g' > ./.junest/etc/pacman.d/mirrorlist 73 | else 74 | curl -Ls "https://archlinux.org/mirrorlist/?country=$COUNTRY" | sed 's/#Server/Server/g' > ./.junest/etc/pacman.d/mirrorlist 75 | fi 76 | } 77 | 78 | _bypass_signature_check_level() { 79 | sed -i 's/#SigLevel/SigLevel/g; s/Required DatabaseOptional/Never/g' ./.junest/etc/pacman.conf 80 | } 81 | 82 | _install_junest() { 83 | echo "-----------------------------------------------------------------------------" 84 | echo "◆ Clone JuNest from https://github.com/fsquillace/junest" 85 | echo "-----------------------------------------------------------------------------" 86 | git clone https://github.com/fsquillace/junest.git ./.local/share/junest 87 | echo "-----------------------------------------------------------------------------" 88 | echo "◆ Downloading JuNest archive from https://github.com/ivan-hc/junest" 89 | echo "-----------------------------------------------------------------------------" 90 | curl -#Lo junest-x86_64.tar.gz https://github.com/ivan-hc/junest/releases/download/continuous/junest-x86_64.tar.gz 91 | ./.local/share/junest/bin/junest setup -i junest-x86_64.tar.gz 92 | rm -f junest-x86_64.tar.gz 93 | echo " Apply patches to PacMan..." 94 | _enable_multilib 95 | #_enable_chaoticaur 96 | #_enable_archlinuxcn 97 | _custom_mirrorlist 98 | _bypass_signature_check_level 99 | 100 | # Update arch linux in junest 101 | ./.local/share/junest/bin/junest -- sudo pacman -Syy 102 | ./.local/share/junest/bin/junest -- sudo pacman --noconfirm -Syu 103 | } 104 | 105 | if ! test -d "$HOME/.local/share/junest"; then 106 | echo "-----------------------------------------------------------------------------" 107 | echo " DOWNLOAD, INSTALL AND CONFIGURE JUNEST" 108 | echo "-----------------------------------------------------------------------------" 109 | _install_junest 110 | else 111 | echo "-----------------------------------------------------------------------------" 112 | echo " RESTART JUNEST" 113 | echo "-----------------------------------------------------------------------------" 114 | fi 115 | 116 | ############################################################################# 117 | # INSTALL PROGRAMS USING YAY 118 | ############################################################################# 119 | 120 | ./.local/share/junest/bin/junest -- yay -Syy 121 | #./.local/share/junest/bin/junest -- gpg --keyserver keyserver.ubuntu.com --recv-key C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF # UNCOMMENT IF YOU USE THE AUR 122 | if [ -n "$BASICSTUFF" ]; then 123 | ./.local/share/junest/bin/junest -- yay --noconfirm -S $BASICSTUFF 124 | fi 125 | if [ -n "$COMPILERS" ]; then 126 | ./.local/share/junest/bin/junest -- yay --noconfirm -S $COMPILERS 127 | ./.local/share/junest/bin/junest -- yay --noconfirm -S python # to force one Python version and prevent modules from being installed in different directories (e.g. "mesonbuild") 128 | fi 129 | if [ -n "$DEPENDENCES" ]; then 130 | ./.local/share/junest/bin/junest -- yay --noconfirm -S $DEPENDENCES 131 | fi 132 | if [ -n "$APP" ]; then 133 | ./.local/share/junest/bin/junest -- yay --noconfirm -S alsa-lib gtk3 xapp 134 | ./.local/share/junest/bin/junest -- yay --noconfirm -S "$APP" 135 | ./.local/share/junest/bin/junest -- glib-compile-schemas /usr/share/glib-2.0/schemas/ 136 | else 137 | echo "No app found, exiting"; exit 1 138 | fi 139 | 140 | cd .. 141 | 142 | echo "" 143 | echo "-----------------------------------------------------------------------------" 144 | echo " CREATING THE APPDIR" 145 | echo "-----------------------------------------------------------------------------" 146 | echo "" 147 | 148 | # Set locale 149 | rm -f archlinux/.junest/etc/locale.conf 150 | sed -i 's/LANG=${LANG:-C}/LANG=$LANG/g' archlinux/.junest/etc/profile.d/locale.sh 151 | 152 | # Add launcher and icon 153 | rm -f ./*.desktop 154 | LAUNCHER=$(grep -iRl "$BIN" archlinux/.junest/usr/share/applications/* | grep ".desktop" | head -1) 155 | cp -r "$LAUNCHER" "$APP".AppDir/ 156 | ICON=$(cat "$LAUNCHER" | grep "Icon=" | cut -c 6-) 157 | [ -z "$ICON" ] && ICON="$BIN" 158 | cp -r archlinux/.junest/usr/share/icons/*"$ICON"* "$APP".AppDir/ 2>/dev/null 159 | cp -r archlinux/.junest/usr/share/icons/hicolor/22x22/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 160 | cp -r archlinux/.junest/usr/share/icons/hicolor/24x24/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 161 | cp -r archlinux/.junest/usr/share/icons/hicolor/32x32/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 162 | cp -r archlinux/.junest/usr/share/icons/hicolor/48x48/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 163 | cp -r archlinux/.junest/usr/share/icons/hicolor/64x64/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 164 | cp -r archlinux/.junest/usr/share/icons/hicolor/128x128/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 165 | cp -r archlinux/.junest/usr/share/icons/hicolor/192x192/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 166 | cp -r archlinux/.junest/usr/share/icons/hicolor/256x256/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 167 | cp -r archlinux/.junest/usr/share/icons/hicolor/512x512/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 168 | cp -r archlinux/.junest/usr/share/icons/hicolor/scalable/apps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 169 | cp -r archlinux/.junest/usr/share/pixmaps/*"$ICON"* "$APP".AppDir/ 2>/dev/null 170 | 171 | # Test if the desktop file and the icon are in the root of the future appimage (./*appdir/*) 172 | if test -f "$APP".AppDir/*.desktop; then 173 | echo "◆ The .desktop file is available in $APP.AppDir/" 174 | elif test -f archlinux/.junest/usr/bin/"$BIN"; then 175 | echo "◆ No .desktop file available for $APP, creating a new one" 176 | cat <<-HEREDOC >> "$APP".AppDir/"$APP".desktop 177 | [Desktop Entry] 178 | Version=1.0 179 | Type=Application 180 | Name=$(echo "$APP" | tr '[:lower:]' '[:upper:]') 181 | Comment= 182 | Exec=$BIN 183 | Icon=tux 184 | Categories=Utility; 185 | Terminal=true 186 | StartupNotify=true 187 | HEREDOC 188 | curl -Lo "$APP".AppDir/tux.png https://raw.githubusercontent.com/Portable-Linux-Apps/Portable-Linux-Apps.github.io/main/favicon.ico 2>/dev/null 189 | else 190 | echo "No binary in path... aborting all the processes." 191 | exit 0 192 | fi 193 | 194 | if [ ! -d "$APP".AppDir/.local ]; then 195 | mkdir -p "$APP".AppDir/.local 196 | rsync -av archlinux/.local/ "$APP".AppDir/.local/ | echo "◆ Rsync .local directory to the AppDir" 197 | # Made JuNest a portable app and remove "read-only file system" errors 198 | sed -i 's#${JUNEST_HOME}/usr/bin/junest_wrapper#${HOME}/.cache/junest_wrapper.old#g' "$APP".AppDir/.local/share/junest/lib/core/wrappers.sh 199 | sed -i 's/rm -f "${JUNEST_HOME}${bin_path}_wrappers/#rm -f "${JUNEST_HOME}${bin_path}_wrappers/g' "$APP".AppDir/.local/share/junest/lib/core/wrappers.sh 200 | sed -i 's/ln/#ln/g' "$APP".AppDir/.local/share/junest/lib/core/wrappers.sh 201 | sed -i 's/rm -f "$file"/test -f "$file"/g' "$APP".AppDir/.local/share/junest/lib/core/wrappers.sh 202 | sed -i 's#--bind "$HOME" "$HOME"#--bind-try /home /home --bind-try /run/user /run/user#g' "$APP".AppDir/.local/share/junest/lib/core/namespace.sh 203 | fi 204 | 205 | echo "◆ Rsync .junest directories structure to the AppDir" 206 | rm -Rf "$APP".AppDir/.junest/* 207 | archdirs=$(find archlinux/.junest -type d | sed 's/^archlinux\///g') 208 | for d in $archdirs; do 209 | mkdir -p "$APP".AppDir/"$d" 210 | done 211 | symlink_dirs=" bin sbin lib lib64 usr/sbin usr/lib64" 212 | for l in $symlink_dirs; do 213 | cp -r archlinux/.junest/"$l" "$APP".AppDir/.junest/"$l" 214 | done 215 | 216 | rsync -av archlinux/.junest/usr/bin_wrappers/ "$APP".AppDir/.junest/usr/bin_wrappers/ | echo "◆ Rsync bin_wrappers to the AppDir" 217 | rsync -av archlinux/.junest/etc/* "$APP".AppDir/.junest/etc/ | echo "◆ Rsync /etc" 218 | 219 | ############################################################################# 220 | # APPRUN 221 | ############################################################################# 222 | 223 | rm -f "$APP".AppDir/AppRun 224 | cat <<-'HEREDOC' >> "$APP".AppDir/AppRun 225 | #!/bin/sh 226 | HERE="$(dirname "$(readlink -f "$0")")" 227 | export UNION_PRELOAD="$HERE" 228 | export JUNEST_HOME="$HERE"/.junest 229 | 230 | if command -v unshare >/dev/null 2>&1 && ! unshare --user -p /bin/true >/dev/null 2>&1; then 231 | PROOT_ON=1 232 | export PATH="$HERE"/.local/share/junest/bin/:"$PATH" 233 | mkdir -p "$HOME"/.cache 234 | else 235 | export PATH="$PATH":"$HERE"/.local/share/junest/bin 236 | fi 237 | 238 | [ -z "$NVIDIA_ON" ] && NVIDIA_ON=1 239 | if [ "$NVIDIA_ON" = 1 ]; then 240 | DATADIR="${XDG_DATA_HOME:-$HOME/.local/share}" 241 | CONTY_DIR="${DATADIR}/Conty/overlayfs_shared" 242 | [ -f /sys/module/nvidia/version ] && nvidia_driver_version="$(cat /sys/module/nvidia/version)" 243 | if [ -n "$nvidia_driver_version" ]; then 244 | mkdir -p "${CONTY_DIR}"/nvidia "${CONTY_DIR}"/up/usr/lib "${CONTY_DIR}"/up/usr/share 245 | nvidia_data_dirs="egl glvnd nvidia vulkan" 246 | for d in $nvidia_data_dirs; do [ ! -d "${CONTY_DIR}"/up/usr/share/"$d" ] && ln -s /usr/share/"$d" "${CONTY_DIR}"/up/usr/share/ 2>/dev/null; done 247 | [ ! -f "${CONTY_DIR}"/nvidia/current-nvidia-version ] && echo "${nvidia_driver_version}" > "${CONTY_DIR}"/nvidia/current-nvidia-version 248 | [ -f "${CONTY_DIR}"/nvidia/current-nvidia-version ] && nvidia_driver_conty=$(cat "${CONTY_DIR}"/nvidia/current-nvidia-version) 249 | if [ "${nvidia_driver_version}" != "${nvidia_driver_conty}" ]; then 250 | rm -f "${CONTY_DIR}"/up/usr/lib/*; echo "${nvidia_driver_version}" > "${CONTY_DIR}"/nvidia/current-nvidia-version 251 | fi 252 | /sbin/ldconfig -p > "${CONTY_DIR}"/nvidia/host_libs 253 | grep -i "nvidia\|libcuda" "${CONTY_DIR}"/nvidia/host_libs | cut -d ">" -f 2 > "${CONTY_DIR}"/nvidia/host_nvidia_libs 254 | libnv_paths=$(grep "libnv" "${CONTY_DIR}"/nvidia/host_libs | cut -d ">" -f 2) 255 | for f in $libnv_paths; do strings "${f}" | grep -qi -m 1 "nvidia" && echo "${f}" >> "${CONTY_DIR}"/nvidia/host_nvidia_libs; done 256 | nvidia_libs=$(cat "${CONTY_DIR}"/nvidia/host_nvidia_libs) 257 | for n in $nvidia_libs; do libname=$(echo "$n" | sed 's:.*/::') && [ ! -f "${CONTY_DIR}"/up/usr/lib/"$libname" ] && cp "$n" "${CONTY_DIR}"/up/usr/lib/; done 258 | libvdpau_nvidia="${CONTY_DIR}/up/usr/lib/libvdpau_nvidia.so" 259 | if ! test -f "${libvdpau_nvidia}*"; then cp "$(find /usr/lib -type f -name 'libvdpau_nvidia.so*' -print -quit 2>/dev/null | head -1)" "${CONTY_DIR}"/up/usr/lib/; fi 260 | [ -f "${libvdpau_nvidia}"."${nvidia_driver_version}" ] && [ ! -f "${libvdpau_nvidia}" ] && ln -s "${libvdpau_nvidia}"."${nvidia_driver_version}" "${libvdpau_nvidia}" 261 | [ -d "${CONTY_DIR}"/up/usr/lib ] && export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":"${CONTY_DIR}"/up/usr/lib:"${LD_LIBRARY_PATH}" 262 | [ -d "${CONTY_DIR}"/up/usr/share ] && export XDG_DATA_DIRS="${XDG_DATA_DIRS}":"${CONTY_DIR}"/up/usr/share:"${XDG_DATA_DIRS}" 263 | fi 264 | fi 265 | 266 | PROOT_BINDINGS="" 267 | BWRAP_BINDINGS="" 268 | 269 | bind_files="/etc/resolv.conf /etc/hosts /etc/nsswitch.conf /etc/passwd /etc/group /etc/machine-id /etc/asound.conf /etc/localtime " 270 | for f in $bind_files; do [ -f "$f" ] && PROOT_BINDINGS=" $PROOT_BINDINGS --bind=$f" && BWRAP_BINDINGS=" $BWRAP_BINDINGS --ro-bind-try $f $f"; done 271 | 272 | bind_dirs=" /media /mnt /opt /run/media /usr/lib/locale /usr/share/fonts /usr/share/themes /var" 273 | for d in $bind_dirs; do [ -d "$d" ] && PROOT_BINDINGS=" $PROOT_BINDINGS --bind=$d" && BWRAP_BINDINGS=" $BWRAP_BINDINGS --bind-try $d $d"; done 274 | 275 | PROOT_BINDS=" --bind=/dev --bind=/sys --bind=/tmp --bind=/proc $PROOT_BINDINGS --bind=/home --bind=/home/$USER " 276 | BWRAP_BINDS=" --dev-bind /dev /dev --ro-bind /sys /sys --bind-try /tmp /tmp --proc /proc $BWRAP_BINDINGS --cap-add CAP_SYS_ADMIN " 277 | 278 | _JUNEST_CMD() { 279 | if [ "$PROOT_ON" = 1 ]; then 280 | "$HERE"/.local/share/junest/bin/junest proot -n -b "$PROOT_BINDS" "$@" 281 | else 282 | "$HERE"/.local/share/junest/bin/junest -n -b "$BWRAP_BINDS" "$@" 283 | fi 284 | } 285 | 286 | EXEC=$(grep -e '^Exec=.*' "${HERE}"/*.desktop | head -n 1 | cut -d "=" -f 2- | sed -e 's|%.||g') 287 | if ! echo "$EXEC" | grep -q "/usr/bin"; then EXEC="/usr/bin/$EXEC"; fi 288 | _JUNEST_CMD -- $EXEC "$@" 289 | 290 | HEREDOC 291 | chmod a+x "$APP".AppDir/AppRun 292 | 293 | ############################################################################# 294 | # EXTRACT PACKAGES 295 | ############################################################################# 296 | 297 | [ -z "$extraction_count" ] && extraction_count=2 298 | [ ! -f ./autodeps ] && echo "$extraction_count" > ./autodeps 299 | [ -f ./autodeps ] && autodeps=$(cat ./autodeps) 300 | [ "$autodeps" != "$extraction_count" ] && rm -Rf ./deps ./packages && echo "$extraction_count" > ./autodeps 301 | 302 | [ ! -f ./userdeps ] && echo "$DEPENDENCES" > ./userdeps 303 | [ -f ./userdeps ] && userdeps=$(cat ./userdeps) 304 | [ "$userdeps" != "$DEPENDENCES" ] && rm -Rf ./deps ./packages && echo "$DEPENDENCES" > ./userdeps 305 | 306 | _extract_main_package() { 307 | mkdir -p base 308 | rm -Rf ./base/* 309 | pkg_full_path=$(find ./archlinux -type f -name "$APP-*zst") 310 | if [ "$(echo "$pkg_full_path" | wc -l)" = 1 ]; then 311 | pkg_full_path=$(find ./archlinux -type f -name "$APP-*zst") 312 | else 313 | for p in $pkg_full_path; do 314 | if tar fx "$p" .PKGINFO -O | grep -q "pkgname = $APP$"; then 315 | pkg_full_path="$p" 316 | fi 317 | done 318 | fi 319 | [ -z "$pkg_full_path" ] && echo "💀 ERROR: no package found for \"$APP\", operation aborted!" && exit 0 320 | tar fx "$pkg_full_path" -C ./base/ 321 | VERSION=$(cat ./base/.PKGINFO | grep pkgver | cut -c 10- | sed 's@.*:@@') 322 | mkdir -p deps 323 | } 324 | 325 | _download_missing_packages() { 326 | localpackage=$(find ./archlinux -name "$arg-[0-9]*zst") 327 | if ! test -f "$localpackage"; then 328 | ./archlinux/.local/share/junest/bin/junest -- yay --noconfirm -Sw "$arg" 329 | fi 330 | } 331 | 332 | _extract_package() { 333 | _download_missing_packages &> /dev/null 334 | pkg_full_path=$(find ./archlinux -name "$arg-[0-9]*zst") 335 | pkgname=$(echo "$pkg_full_path" | sed 's:.*/::') 336 | [ ! -f ./packages ] && rm -Rf ./deps/* && touch ./packages 337 | if [ -z "$( ls -A './deps' )" ]; then 338 | rm -f ./packages 339 | echo "" 340 | echo "-----------------------------------------------------------------------------" 341 | echo " EXTRACTING PACKAGES" 342 | echo "-----------------------------------------------------------------------------" 343 | echo "" 344 | fi 345 | if test -f "$pkg_full_path"; then 346 | if ! grep -q "$pkgname" ./packages 2>/dev/null;then 347 | echo "◆ Extracting $pkgname" 348 | tar fx "$pkg_full_path" -C ./deps/ --warning=no-unknown-keyword 349 | echo "$pkgname" >> ./packages 350 | fi 351 | [ -n "$lib_browser_launcher" ] && [[ "$arg" =~ (hicolor-icon-theme|xapp) ]] && tar fx "$pkg_full_path" -C ./base/ --warning=no-unknown-keyword --exclude='.PKGINFO' 352 | fi 353 | } 354 | 355 | _determine_packages_and_libraries() { 356 | if echo "$arg" | grep -q "\.so"; then 357 | LIBSAVED="$LIBSAVED $arg" 358 | elif [ "$arg" != autoconf ] && [ "$arg" != autoconf ] && [ "$arg" != automake ] && [ "$arg" != bison ] && [ "$arg" != debugedit ] && [ "$arg" != dkms ] && [ "$arg" != fakeroot ] && [ "$arg" != flatpak ] && [ "$arg" != linux ] && [ "$arg" != gcc ] && [ "$arg" != make ] && [ "$arg" != pacman ] && [ "$arg" != patch ] && [ "$arg" != systemd ]; then 359 | _extract_package 360 | cat ./deps/.PKGINFO 2>/dev/null | grep "^depend = " | cut -c 10- | sed 's/=.*//' >> depdeps 361 | rm -f ./deps/.* 362 | fi 363 | } 364 | 365 | _extract_deps() { 366 | DEPS=$(sort -u ./depdeps) 367 | for arg in $DEPS; do 368 | _determine_packages_and_libraries 369 | done 370 | } 371 | 372 | _extract_all_dependences() { 373 | rm -f ./depdeps 374 | 375 | OPTDEPS=$(cat ./base/.PKGINFO 2>/dev/null | grep "^optdepend = " | sed 's/optdepend = //g' | sed 's/=.*//' | sed 's/:.*//') 376 | for arg in $OPTDEPS; do 377 | _determine_packages_and_libraries 378 | done 379 | [ -f ./depdeps ] && _extract_deps 380 | rm -f ./depdeps 381 | 382 | ARGS=$(echo "$DEPENDENCES" | tr " " "\n") 383 | for arg in $ARGS; do 384 | _determine_packages_and_libraries 385 | done 386 | 387 | DEPS=$(cat ./base/.PKGINFO 2>/dev/null | grep "^depend = " | sed 's/depend = //g' | sed 's/=.*//') 388 | for arg in $DEPS; do 389 | _determine_packages_and_libraries 390 | done 391 | 392 | # Set the level of sub-dependencies extraction, the higher the number, the bigger the AppImage will be 393 | if [ "$extraction_count" != 0 ]; then 394 | for e in $(seq "$extraction_count"); do _extract_deps; done 395 | fi 396 | } 397 | 398 | _extract_main_package 399 | _extract_all_dependences 400 | 401 | echo "" 402 | echo "-----------------------------------------------------------------------------" 403 | echo " IMPLEMENTING NECESSARY LIBRARIES (MAY TAKE SEVERAL MINUTES)" 404 | echo "-----------------------------------------------------------------------------" 405 | echo "" 406 | 407 | # Save files in /usr/bin 408 | _savebins() { 409 | echo "◆ Saving files in /usr/bin" 410 | cp -r ./archlinux/.junest/usr/bin/bwrap ./"$APP".AppDir/.junest/usr/bin/ 411 | cp -r ./archlinux/.junest/usr/bin/proot* ./"$APP".AppDir/.junest/usr/bin/ 412 | cp -r ./archlinux/.junest/usr/bin/*$BIN* ./"$APP".AppDir/.junest/usr/bin/ 413 | coreutils="[ basename cat chmod chown cp cut dir dirname du echo env expand expr fold head id ln ls mkdir mv readlink realpath rm rmdir seq sleep sort stty sum sync tac tail tee test timeout touch tr true tty uname uniq wc who whoami yes" 414 | utils_bin="awk bash $coreutils gawk gio grep ld ldd sed sh strings xdg-open" 415 | for b in $utils_bin; do 416 | cp -r ./archlinux/.junest/usr/bin/"$b" ./"$APP".AppDir/.junest/usr/bin/ 417 | done 418 | for arg in $BINSAVED; do 419 | cp -r ./archlinux/.junest/usr/bin/*"$arg"* ./"$APP".AppDir/.junest/usr/bin/ 420 | done 421 | } 422 | 423 | # Save files in /usr/lib 424 | _savelibs() { 425 | echo "◆ Detect libraries related to /usr/bin files" 426 | libs4bin=$(readelf -d ./"$APP".AppDir/.junest/usr/bin/* 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so") 427 | 428 | echo "◆ Saving JuNest core libraries" 429 | cp -r ./archlinux/.junest/usr/lib/ld-linux-x86-64.so* ./"$APP".AppDir/.junest/usr/lib/ 430 | lib_preset="$APP $BIN gconv libdw libelf libresolv.so libtinfo.so $libs4bin" 431 | LIBSAVED="$lib_preset $LIBSAVED $SHARESAVED" 432 | for arg in $LIBSAVED; do 433 | LIBPATHS="$LIBPATHS $(find ./archlinux/.junest/usr/lib -maxdepth 20 -wholename "*$arg*" | sed 's/\.\/archlinux\///g')" 434 | done 435 | for arg in $LIBPATHS; do 436 | [ ! -d "$APP".AppDir/"$arg" ] && cp -r ./archlinux/"$arg" "$APP".AppDir/"$arg" & 437 | done 438 | wait 439 | core_libs=$(find ./"$APP".AppDir -type f) 440 | lib_core=$(for c in $core_libs; do readelf -d "$c" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 441 | 442 | echo "◆ Detect libraries of the main package" 443 | base_libs=$(find ./base -type f | uniq) 444 | lib_base_0=$(for b in $base_libs; do readelf -d "$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 445 | 446 | echo "◆ Detect libraries of the dependencies" 447 | dep_libs=$(find ./deps -executable -name "*.so*") 448 | lib_deps=$(for d in $dep_libs; do readelf -d "$d" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 449 | 450 | echo "◆ Detect and copy base libs" 451 | basebin_libs=$(find ./base -executable -name "*.so*") 452 | lib_base_1=$(for b in $basebin_libs; do readelf -d "$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 453 | lib_base_1=$(echo "$lib_base_1" | tr ' ' '\n' | sort -u | xargs) 454 | lib_base_2=$(for b in $lib_base_1; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 455 | lib_base_2=$(echo "$lib_base_2" | tr ' ' '\n' | sort -u | xargs) 456 | lib_base_3=$(for b in $lib_base_2; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 457 | lib_base_3=$(echo "$lib_base_3" | tr ' ' '\n' | sort -u | xargs) 458 | lib_base_4=$(for b in $lib_base_3; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 459 | lib_base_4=$(echo "$lib_base_4" | tr ' ' '\n' | sort -u | xargs) 460 | lib_base_5=$(for b in $lib_base_4; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 461 | lib_base_5=$(echo "$lib_base_5" | tr ' ' '\n' | sort -u | xargs) 462 | lib_base_6=$(for b in $lib_base_5; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 463 | lib_base_6=$(echo "$lib_base_6" | tr ' ' '\n' | sort -u | xargs) 464 | lib_base_7=$(for b in $lib_base_6; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 465 | lib_base_7=$(echo "$lib_base_7" | tr ' ' '\n' | sort -u | xargs) 466 | lib_base_8=$(for b in $lib_base_7; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 467 | lib_base_8=$(echo "$lib_base_8" | tr ' ' '\n' | sort -u | xargs) 468 | lib_base_9=$(for b in $lib_base_8; do readelf -d ./archlinux/.junest/usr/lib/"$b" 2>/dev/null | grep NEEDED | tr '[] ' '\n' | grep ".so"; done) 469 | lib_base_9=$(echo "$lib_base_9" | tr ' ' '\n' | sort -u | xargs) 470 | lib_base_libs="$lib_core $lib_base_0 $lib_base_1 $lib_base_2 $lib_base_3 $lib_base_4 $lib_base_5 $lib_base_6 $lib_base_7 $lib_base_8 $lib_base_9 $lib_deps" 471 | lib_base_libs=$(echo "$lib_base_libs" | tr ' ' '\n' | sort -u | sed 's/.so.*/.so/' | xargs) 472 | for l in $lib_base_libs; do 473 | rsync -av ./archlinux/.junest/usr/lib/"$l"* ./"$APP".AppDir/.junest/usr/lib/ & 474 | done 475 | wait 476 | for l in $lib_base_libs; do 477 | rsync -av ./deps/usr/lib/"$l"* ./"$APP".AppDir/.junest/usr/lib/ & 478 | done 479 | wait 480 | } 481 | 482 | # Save files in /usr/share 483 | _saveshare() { 484 | echo "◆ Saving directories in /usr/share" 485 | SHARESAVED="$SHARESAVED $APP $BIN fontconfig glib- locale mime wayland X11" 486 | for arg in $SHARESAVED; do 487 | cp -r ./archlinux/.junest/usr/share/*"$arg"* ./"$APP".AppDir/.junest/usr/share/ 488 | done 489 | } 490 | 491 | _savebins 2>/dev/null 492 | _savelibs 2>/dev/null 493 | _saveshare 2>/dev/null 494 | 495 | echo "" 496 | echo "-----------------------------------------------------------------------------" 497 | echo " ASSEMBLING THE APPIMAGE" 498 | echo "-----------------------------------------------------------------------------" 499 | echo "" 500 | 501 | _rsync_main_package() { 502 | rm -Rf ./base/.* 503 | rsync -av ./base/ ./"$APP".AppDir/.junest/ | echo "◆ Rsync the content of the \"$APP\" package" 504 | } 505 | 506 | _rsync_dependences() { 507 | rm -Rf ./deps/.* 508 | chmod -R 777 ./deps/* 509 | rsync -av ./deps/ ./"$APP".AppDir/.junest/ | echo "◆ Rsync all dependencies, please wait" 510 | } 511 | 512 | _rsync_main_package 513 | _rsync_dependences 514 | 515 | ############################################################################# 516 | # REMOVE BLOATWARES, ENABLE MOUNTPOINTS 517 | ############################################################################# 518 | 519 | _remove_more_bloatwares() { 520 | etc_remove="makepkg.conf pacman" 521 | for r in $etc_remove; do 522 | rm -Rf ./"$APP".AppDir/.junest/etc/"$r"* 523 | done 524 | bin_remove="gcc" 525 | for r in $bin_remove; do 526 | rm -Rf ./"$APP".AppDir/.junest/usr/bin/"$r"* 527 | done 528 | lib_remove="gcc wine libwebkit libjavascript" 529 | for r in $lib_remove; do 530 | rm -Rf ./"$APP".AppDir/.junest/usr/lib/"$r"* 531 | done 532 | share_remove="gcc gir perl i18n terminfo help" 533 | for r in $share_remove; do 534 | rm -Rf ./"$APP".AppDir/.junest/usr/share/"$r"* 535 | done 536 | echo Y | rm -Rf ./"$APP".AppDir/.cache/yay/* 537 | find ./"$APP".AppDir/.junest/usr/share/doc/* -not -iname "*$BIN*" -a -not -name "." -delete 2> /dev/null #REMOVE ALL DOCUMENTATION NOT RELATED TO THE APP 538 | find ./"$APP".AppDir/.junest/usr/share/locale/*/*/* -not -iname "*$BIN*" -a -not -name "." -delete 2> /dev/null #REMOVE ALL ADDITIONAL LOCALE FILES 539 | rm -Rf ./"$APP".AppDir/.junest/home # remove the inbuilt home 540 | rm -Rf ./"$APP".AppDir/.junest/usr/include # files related to the compiler 541 | rm -Rf ./"$APP".AppDir/.junest/usr/share/man # AppImages are not ment to have man command 542 | rm -Rf ./"$APP".AppDir/.junest/usr/lib/python*/__pycache__/* # if python is installed, removing this directory can save several megabytes 543 | #rm -Rf ./"$APP".AppDir/.junest/usr/lib/libgallium* 544 | rm -Rf ./"$APP".AppDir/.junest/usr/lib/libgo.so* 545 | #rm -Rf ./"$APP".AppDir/.junest/usr/lib/libLLVM* # included in the compilation phase, can sometimes be excluded for daily use 546 | rm -Rf ./"$APP".AppDir/.junest/var/* # remove all packages downloaded with the package manager 547 | } 548 | 549 | _enable_mountpoints_for_the_inbuilt_bubblewrap() { 550 | mkdir -p ./"$APP".AppDir/.junest/home 551 | mkdir -p ./"$APP".AppDir/.junest/media 552 | mkdir -p ./"$APP".AppDir/.junest/usr/lib/locale 553 | mkdir -p ./"$APP".AppDir/.junest/usr/share/fonts 554 | mkdir -p ./"$APP".AppDir/.junest/usr/share/themes 555 | mkdir -p ./"$APP".AppDir/.junest/run/media 556 | mkdir -p ./"$APP".AppDir/.junest/run/user 557 | rm -f ./"$APP".AppDir/.junest/etc/localtime && touch ./"$APP".AppDir/.junest/etc/localtime 558 | [ ! -f ./"$APP".AppDir/.junest/etc/asound.conf ] && touch ./"$APP".AppDir/.junest/etc/asound.conf 559 | [ ! -e ./"$APP".AppDir/.junest/usr/share/X11/xkb ] && rm -f ./"$APP".AppDir/.junest/usr/share/X11/xkb && mkdir -p ./"$APP".AppDir/.junest/usr/share/X11/xkb && sed -i -- 's# /var"$# /usr/share/X11/xkb /var"#g' ./"$APP".AppDir/AppRun 560 | } 561 | 562 | # Fix libcurl 563 | if test -f ./"$APP".AppDir/.junest/usr/lib/libcurl*; then 564 | rm -f ./"$APP".AppDir/.junest/usr/lib/libcurl* && cp -r ./archlinux/.junest/usr/lib/libcurl* ./"$APP".AppDir/.junest/usr/lib/ 565 | fi 566 | 567 | _remove_more_bloatwares 568 | find ./"$APP".AppDir/.junest/usr/lib ./"$APP".AppDir/.junest/usr/lib32 -type f -regex '.*\.a' -exec rm -f {} \; 2>/dev/null 569 | find ./"$APP".AppDir/.junest/usr -type f -regex '.*\.so.*' -exec strip --strip-debug {} \; 570 | find ./"$APP".AppDir/.junest/usr/bin -type f ! -regex '.*\.so.*' -exec strip --strip-unneeded {} \; 571 | find ./"$APP".AppDir/.junest/usr -type d -empty -delete 572 | _enable_mountpoints_for_the_inbuilt_bubblewrap 573 | 574 | # Replace BubbleWrap with the static one 575 | rm -f ./"$APP".AppDir/.junest/usr/bin/bwrap && cp -r bwrap-x86_64 ./"$APP".AppDir/.junest/usr/bin/bwrap 576 | 577 | ############################################################################# 578 | # CREATE THE APPIMAGE 579 | ############################################################################# 580 | 581 | if test -f ./*.AppImage; then rm -Rf ./*archimage*.AppImage; fi 582 | 583 | APPNAME=$(cat ./"$APP".AppDir/*.desktop | grep 'Name=' | head -1 | cut -c 6- | sed 's/ /-/g') 584 | REPO="Lutris_AppImage" 585 | TAG="latest" 586 | VERSION="$VERSION" 587 | UPINFO="gh-releases-zsync|$GITHUB_REPOSITORY_OWNER|$REPO|$TAG|*x86_64.AppImage.zsync" 588 | 589 | ARCH=x86_64 ./appimagetool --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 20 \ 590 | -u "$UPINFO" \ 591 | ./"$APP".AppDir "$APPNAME"_"$VERSION"-archimage4.3-x86_64.AppImage 592 | -------------------------------------------------------------------------------- /lutris.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name[ar]=لوترس 3 | Name[de]=Lutris 4 | Name[el]=Lutris 5 | Name[es]=Lutris 6 | Name[fr]=Lutris 7 | Name[hr]=Lutris 8 | Name[it]=Lutris 9 | Name[ka]=Lutris 10 | Name[ko]=Lutris 11 | Name[nl]=Lutris 12 | Name[pl]=Lutris 13 | Name[pt_BR]=Lutris 14 | Name[ru]=Lutris 15 | Name[zh_CN]=Lutris 16 | Name=Lutris 17 | StartupWMClass=Lutris 18 | Comment[ar]=منصَّة حفظ ألعاب الفيديو 19 | Comment[el]=Πλατφόρμα Διατήρησης Βιντεοπαιχνιδιών 20 | Comment[es]=Plataforma de Preservación de Videojuegos 21 | Comment[fr]=Plateforme de préservation de jeux vidéo 22 | Comment[it]=Piattaforma di Preservazione di Videogiochi 23 | Comment[ka]=პლატფორმა ვიდეოთამაშების შესანახად 24 | Comment[ko]=오픈소스 비디오 게임 플랫폼 25 | Comment[nl]=Videogame-bewaarplatform 26 | Comment[pt_BR]=Plataforma de preservação de video games 27 | Comment[ru]=Площадка для сохранения видеоигр 28 | Comment[tr]=Video Oyunu Depolama Platformu 29 | Comment[zh_CN]=电子游戏保存平台 30 | Comment=Video Game Preservation Platform 31 | Categories=Game; 32 | Keywords[ar]=gaming;wine;emulator;لعب;واين;محاكي; 33 | Keywords[de]=gaming;spielen;wine;emulator; 34 | Keywords[el]=gaming;wine;εξομοιωτής; 35 | Keywords[es]=juego;wine;emulador; 36 | Keywords[fr]=gaming;wine;emulator;jeux;émulateur; 37 | Keywords[hr]=igranje;wine;emulator; 38 | Keywords[it]=gaming;wine;emulatore; 39 | Keywords[ka]=gaming;wine;emulator;თამაშები; 40 | Keywords[ko]=gaming;wine;emulator; 41 | Keywords[nl]=gaming;spellen;wine;emulator; 42 | Keywords[pt_BR]=gaming;wine;emulação; 43 | Keywords[ru]=gaming;wine;emulator; 44 | Keywords[tr]=oyun;wine;emülatör 45 | Keywords[zh_CN]=游戏;wine;模拟器; 46 | Keywords=gaming;wine;emulator; 47 | Exec=lutris %U 48 | Icon=lutris 49 | Terminal=false 50 | Type=Application 51 | StartupNotify=true 52 | MimeType=x-scheme-handler/lutris; 53 | X-GNOME-UsesNotifications=true 54 | -------------------------------------------------------------------------------- /lutris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasmz1/Lutris_AppImage/4d688f05eb300b347cd41b6a5f7484cd0ffbadee/lutris.png -------------------------------------------------------------------------------- /lutris.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | script: 3 | - rm -rf $TARGET_APPDIR || true 4 | 5 | AppDir: 6 | app_info: 7 | id: lutris 8 | name: lutris 9 | icon: lutris.png 10 | version: latest 11 | exec: usr/bin/python3 12 | exec_args: $APPDIR/usr/games/lutris $@ 13 | 14 | apt: 15 | arch: amd64 16 | sources: 17 | - sourceline: 'deb [trusted=yes] https://ppa.launchpadcontent.net/lutris-team/lutris/ubuntu jammy main' 18 | - sourceline: 'deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse' 19 | - sourceline: 'deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse' 20 | - sourceline: 'deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse' 21 | - sourceline: 'deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ jammy-proposed main restricted universe multiverse' 22 | - sourceline: 'deb [trusted=yes] http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse' 23 | include: 24 | - librsvg2-2 25 | - librsvg2-common 26 | - lutris 27 | - cabextract 28 | - curl 29 | - fluid-soundfont-gs 30 | - gir1.2-gnomedesktop-3.0 31 | - gir1.2-gtk-3.0 32 | - gir1.2-notify-0.7 33 | - gir1.2-webkit2-4.0 34 | - mesa-utils 35 | - p7zip 36 | - psmisc 37 | - python3-dbus 38 | - python3-distro 39 | - python3-gi 40 | - python3-lxml 41 | - python3-magic 42 | - python3-pil 43 | - python3-requests 44 | - python3-setproctitle 45 | - python3-yaml 46 | - python3 47 | - unzip 48 | - x11-xserver-utils 49 | 50 | files: 51 | exclude: 52 | - usr/lib/x86_64-linux-gnu/gconv 53 | - usr/share/man 54 | - usr/share/doc/*/README.* 55 | - usr/share/doc/*/changelog.* 56 | - usr/share/doc/*/NEWS.* 57 | - usr/share/doc/*/TODO.* 58 | - usr/share/metainfo/org.kde.kcalc.appdata.xml 59 | test: 60 | debian: 61 | image: appimagecrafters/tests-env:debian-stable 62 | command: "dbus-launch ./AppRun" 63 | centos: 64 | image: appimagecrafters/tests-env:centos-7 65 | command: "dbus-launch ./AppRun" 66 | arch: 67 | image: appimagecrafters/tests-env:archlinux-latest 68 | command: "dbus-launch ./AppRun" 69 | fedora: 70 | image: appimagecrafters/tests-env:fedora-30 71 | command: "dbus-launch ./AppRun" 72 | ubuntu: 73 | image: appimagecrafters/tests-env:ubuntu-jammy 74 | command: "dbus-launch ./AppRun" 75 | 76 | AppImage: 77 | arch: x86_64 78 | -------------------------------------------------------------------------------- /mime.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucasmz1/Lutris_AppImage/4d688f05eb300b347cd41b6a5f7484cd0ffbadee/mime.tar.gz -------------------------------------------------------------------------------- /sitecustomize.py: -------------------------------------------------------------------------------- 1 | import sys,os 2 | import _strptime 3 | import lutris 4 | import gettext 5 | import json 6 | import logging 7 | import signal 8 | import tempfile 9 | import datetime 10 | import typing 11 | import gi 12 | import socket 13 | import optparse 14 | import pickle 15 | import queue 16 | import copy 17 | import configparser 18 | import urllib 19 | import base64 20 | import email 21 | import hashlib 22 | import http 23 | import quopri 24 | import calendar 25 | import uu 26 | import requests 27 | import subprocess 28 | import pathlib 29 | import glob 30 | import platform 31 | import resource 32 | import ctypes 33 | import shlex 34 | import uuid 35 | import sqlite3 36 | import inspect 37 | import dbus 38 | import yaml 39 | import concurrent 40 | import gzip 41 | import tarfile 42 | import secrets 43 | import dataclasses 44 | import PIL 45 | import numbers 46 | import lxml 47 | import multiprocessing 48 | import filecmp 49 | import collections 50 | import encodings 51 | import importlib 52 | import concurrent 53 | prefix = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(sys.path[0])))) 54 | sys.path = [ prefix+s for s in sys.path if not s.startswith(prefix) ] 55 | --------------------------------------------------------------------------------