Instalar Trine 2 en debian

2021/01/17

Se busca instalar el juego Trine 2 comprado en GOG.

Se instala gog_trine_2_complete_story_2.0.0.5.sh ejecutando como root en /opt.

Al ejecutar el programa llegamos al siguiente error:

$ export LD_LIBRARY_PATH="/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32"
$ "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
-bash: /opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit: No such file or directory

Revisando el archivo:

$ file "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.32, BuildID[sha1]=35c6e71eb1d64dc34c2177bd7c0fc89b7fd0c065, not stripped
$ ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
	not a dynamic executable

encontramos que es un ejecutable de 32 bits y para ejecutarlo en debian debemos agregar la arquitectura de 32 bits utilizando Multiarch. Para esto se siguen los pasos descriptos en la wiki de debian:

$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install -V libc6:i386

Ahora ya podemos ver que librerías están faltando:

$ export LD_LIBRARY_PATH="/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32"
$ { ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"; \
    ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_32bit"; \
  } | sed -n 's/\s*\([^ ]*\) => not found/\1/p' | LC_ALL=C sort -u | tee /tmp/libs
libGL.so.1
libGLU.so.1
libX11.so.6
libasound.so.2
libatk-1.0.so.0
libdbus-1.so.3
libexpat.so.1
libfontconfig.so.1
libfreetype.so.6
libgdk-x11-2.0.so.0
libgdk_pixbuf-2.0.so.0
libgio-2.0.so.0
libglib-2.0.so.0
libgobject-2.0.so.0
libgthread-2.0.so.0
libgtk-x11-2.0.so.0
libopenal.so.1
libpango-1.0.so.0
libpangoft2-1.0.so.0
libpng12.so.0
libstdc++.so.6
libuuid.so.1
libvorbisfile.so.3
libz.so.1

Para buscar los paquetes que contienen los archivos anteriores se utiliza el comando apt-file (del paquete apt-file):

$ sudo apt-file update
$ for i in $(cat /tmp/libs); do apt-file search -a i386 -x $i'$'; done | tee /tmp/packages

Y aquí hay que hacer una elección manual, ya que revisando los primeros resultados se encuentra que varios paquetes instalan una misma librería:

$ head /tmp/packages
libgl1: /usr/lib/i386-linux-gnu/libGL.so.1
libgl1-nvidia-legacy-340xx-glx: /usr/lib/i386-linux-gnu/nvidia/legacy-340xx/libGL.so.1
libgl1-nvidia-legacy-390xx-glx: /usr/lib/i386-linux-gnu/nvidia/legacy-390xx/libGL.so.1
libgl1-nvidia-tesla-418-glx: /usr/lib/i386-linux-gnu/nvidia/tesla-418/libGL.so.1
primus-libs: /usr/lib/i386-linux-gnu/primus/libGL.so.1
libglu1-mesa: /usr/lib/i386-linux-gnu/libGLU.so.1
libx11-6: /usr/lib/i386-linux-gnu/libX11.so.6
nxagent: /usr/lib/i386-linux-gnu/nx/X11/libX11.so.6
libasound2: /usr/lib/i386-linux-gnu/libasound.so.2
libatk1.0-0: /usr/lib/i386-linux-gnu/libatk-1.0.so.0

En el caso anterior, la librería libGL.so.1 y libX11.so.6 es instalada por varios paquetes.

Lo que se hará a continuación es editar manualmente el archivo anterior, eliminando la linea con los paquetes que no se desea instalar. En el ejemplo anterior, se desea instalar libGL.so.1 del paquete libgl1, por lo que se borran las lineas correspondientes a los paquetes libgl1-nvidia-legacy-340xx-glx, libgl1-nvidia-legacy-390xx-glx, libgl1-nvidia-tesla-418-glx y primus-libs. Esto se hace hasta dejar un solo paquete por librería.

Luego de editar el archivo nos queda:

$ cat /tmp/packages
libgl1: /usr/lib/i386-linux-gnu/libGL.so.1
libglu1-mesa: /usr/lib/i386-linux-gnu/libGLU.so.1
libx11-6: /usr/lib/i386-linux-gnu/libX11.so.6
libasound2: /usr/lib/i386-linux-gnu/libasound.so.2
libatk1.0-0: /usr/lib/i386-linux-gnu/libatk-1.0.so.0
libdbus-1-3: /lib/i386-linux-gnu/libdbus-1.so.3
libexpat1: /lib/i386-linux-gnu/libexpat.so.1
libfontconfig1: /usr/lib/i386-linux-gnu/libfontconfig.so.1
libfreetype6: /usr/lib/i386-linux-gnu/libfreetype.so.6
libgtk2.0-0: /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0
libgdk-pixbuf-2.0-0: /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libgio-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libglib-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libgthread-2.0.so.0
libgtk2.0-0: /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0
libopenal1: /usr/lib/i386-linux-gnu/libopenal.so.1
libpango-1.0-0: /usr/lib/i386-linux-gnu/libpango-1.0.so.0
libpangoft2-1.0-0: /usr/lib/i386-linux-gnu/libpangoft2-1.0.so.0
libuuid1: /usr/lib/i386-linux-gnu/libuuid.so.1
libvorbisfile3: /usr/lib/i386-linux-gnu/libvorbisfile.so.3
zlib1g: /lib/i386-linux-gnu/libz.so.1

Ahora pasamos a instalar los paquetes para la arquitectura i386:

$ sudo apt-get install -V $(sed 's/^\([^:]*\):.*$/\1:i386/' /tmp/packages | LC_ALL=C sort -u)

A pesar de lo anterior, ejecutando el programa obtenemos el siguiente mensaje:

$ "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory

Esto es, hubo archivo que apt-file no encontró, pero tampoco nos avisó de ello. Volviendo a ver las librerías faltantes:

$ { ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"; \
    ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_32bit"; \
  } | sed -n 's/\s*\([^ ]*\) => not found/\1/p' | LC_ALL=C sort -u | tee /tmp/libs
libpng12.so.0

En el caso de libpng12, la versión utilizada por debian actualmente es libpng16. Buscando por nombre de paquetes en la web de debian, https://packages.debian.org/search?keywords=libpng12, encontramos que el paquete corresponde a libpng12-0 de debian jessie.

Siguiendo links, se descarga el paquete de la web:

$ wget 'http://ftp.us.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_i386.deb'

Aquí revisamos:

  1. Si el paquete contiene efectivamente el archivo libpng12.so.0
  2. Las dependencias del paquete, para asegurarnos de que la librería pueda ser utilizada sin problemas o si es necesario descargar más paquetes:
$ dpkg -c libpng12-0_1.2.50-2+deb8u3_i386.deb | grep libpng12.so
-rw-r--r-- root/root    177984 2017-01-07 00:23 ./lib/i386-linux-gnu/libpng12.so.0.50.0
lrwxrwxrwx root/root         0 2017-01-07 00:23 ./lib/i386-linux-gnu/libpng12.so.0 -> libpng12.so.0.50.0
lrwxrwxrwx root/root         0 2017-01-07 00:23 ./usr/lib/i386-linux-gnu/libpng12.so.0 -> /lib/i386-linux-gnu/libpng12.so.0
$ dpkg -I libpng12-0_1.2.50-2+deb8u3_i386.deb | grep Depends:
 Pre-Depends: multiarch-support
 Depends: libc6 (>= 2.11), zlib1g (>= 1:1.1.4)

De lo anterior podemos obtener la librería del paquete. Ya que es un paquete correspondiente a una versión vieja de debian, no se instalará en el sistema con dpkg, sinó que se copiará la librería en el directorio de librerías del juego, "/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32/":

$ dpkg -x libpng12-0_1.2.50-2+deb8u3_i386.deb /tmp/libpng12-0
$ sudo cp /tmp/libpng12-0/lib/i386-linux-gnu/libpng12.so.* "/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32/"

Corroboramos que se encuentren todas las librerías de 32bits que utilizan los binarios del juego:

$ { ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"; \
    ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_32bit"; \
  } | grep "not found"

y vemos que no hay coincidencias.

Volvemos a ejecutar el binario y esta vez si ya tenemos andando el juego:

$ export LD_LIBRARY_PATH="/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32"
$ "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"