Programação e Linux.

segunda-feira, 3 de setembro de 2007

Quake 2 num debian com processador intel 64 bits

Aqui eu mostro, entre outras coisas, como recompilar um pacote .deb , como compilar para 32 bits em uma máquina 64, como rodar quake 2 e resolver alguns problemas de audio e vídeo do jogo.

Primeiro uma palavrinha, esta incompatibilidade 32 bits/64 bits as vezes incomoda, ok, incomoda demais. A AMD fez a tecnologia 64 bits (x86_64/amd64) de forma que fosse possível rodar rodar aplicativos 32 bis em uma máquina 64 bits, esta parte até agora funcionou muito bem, o problema é justamente mas rodar (compilando primeiro) um aplicativo 64 bits em uma máquina 64 bits. Isto pode ser o fato que os programadores não se importaram muito em prever que um dia alguém iria recompilar seu aplicativo para pode rodá-lo em uma máquina 64 bits, alguem poderia dizer que é um problema de design de hardware, mas culpar isto considero um absurdo (apesar de ser a primeira vez em que a AMD inventa algo que a Intel copia e não o inverso, alguem aqui acompanhou a migração 16 bits para 32 bits?). Vivo no pacífico, se algo não funciona bem em 64 bits, compilo para 32 bits ou tento ver se dar para fazer um patch no código.

Compilando um pacote deb
Vamos ao quake2, já que não tinha no repositório do debian uma versão compilada do quake2 para 64 bits, eu baixei o pacote para do sarge para compila-lo (eu estou usando o etch, quake2 para 64, só existe no sarge e no sid). O pacote do sarge pode ser encontrado neste local: http://packages.debian.org/sarge/quake2

São três arquivos: quake2_0.3-1.1.dsc, quake2_0.3.orig.tar.gz, quake2_0.3-1.1.diff.gz

Para quem nunca recompilou um pacote do debian é necessário ter estes 3 arquivos (src, dsc e diff) de preferência numa mesma pasta e executar estes comandos:
dpkg-source -x quake2_0.3-1.1.dsc
cd quake2-0.3
dpkg-buildpackage -rfakeroot


Neste ponto, você pode precisar também neste ponto instalar mais pacotes que são necessários para compilar quake2, use a força do apt-get. Aqui você já enfrenta seu primeiro problema, este pacote é do sarge e exige uma dependência que não existe no etch(xlibs-pic). Para resolve o problema da xlibs-pic vá no arquivo debian/control e remova ela, após isto é só mandar compilar:
dpkg-buildpackage -rfakeroot

Mais um problema, o quake2 usa como diretiva de compilação -Werror, que significa que qualquer warning será tratado como erro e pasmem, existem warnings com o gcc-4.1.2.

A solução é adicionar o parâmetro -Wno-error ao compilador, é possível fazer isto abirndo o arquivo debian/rules (este arquivo contém as regras de como fazer o pacote) e colocar esta linha no início:
CFLAGS += -Wno-error

Outra solução é executar esta linha antes de chamar o dpkg-buildpackage:
export CFLAGS="-Wno-error"

Após isto, tente recompilar novamente:
dpkg-buildpackage -rfakeroot

Além deste pacote é necessário refazer o pacote quake2-data_13_all.deb, ele está disponível aqui nestes links:
http://ftp.de.debian.org/debian/pool/contrib/q/quake2-data/quake2-data_13.dsc http://ftp.de.debian.org/debian/pool/contrib/q/quake2-data/quake2-data_13.tar.gz

Faça o mesmo procedimento:
dpkg-source -x quake2-data_13.dsc
cd quake2-data-13/
dpkg-buildpackage -rfakeroot


Os pacotes prontos ficarão no diretório anterior ao do fonte de cada pacote, instale-os com:
dpkg -i quake2_0.3-1.1_amd64.deb quake2-data_13_all.deb

Instalando as fases e os modelos de jogo
Ao executar quake2, você pode receber a seguinte mensagem:
Error: Couldn't load pics/colormap.pcx

Isto se deve ao fato de você não ter o pacote de fases do jogo (*.pak) e os modelos de jogadores (players/*), pegue-os de uma versão shareware ou de sua versão completa se você tiver uma. Coloque estes arquivos em um dos seguintes diretórios:
/usr/lib/games/quake2/baseq2
$HOME/.quake2/baseq2/

Você terá uma estrutura mais ou menos assim:
quake2/baseq2/ quake2/baseq2/maps/ quake2/baseq2/save/ quake2/baseq2/pak0.pak quake2/baseq2/pak2.pak quake2/baseq2/players/ quake2/baseq2/players/male/ quake2/baseq2/players/male/w_hyperblaster.md2 quake2/baseq2/players/male/howitze2.pcx quake2/baseq2/players/crakhor/ quake2/baseq2/players/crakhor/w_hyperblaster.md2 quake2/baseq2/players/cyborg/ quake2/baseq2/players/cyborg/w_disrupt.md2 quake2/baseq2/players/female/ quake2/baseq2/players/female/w_hyperblaster.md2 quake2/baseq2/players/female/w_disrupt.md2

Problemas com o vídeo
Quake2 deve entrar, mas o driver padrão (softx11) não funcionou bem em 64 bits, se você tiver uma placa de vídeo com um driver descente para linux, tente usar o opengl assim:
quake2 +set vid_ref glx
quake2 +set vid_ref sdlgl

Infelizmente minha placa não é, mas o OpenGL me pareceu estável.

Existe um driver de vídeo com renderização por software via SDL que chega até a entrar no game, mas não foi possível jogar:
quake2 +set vid_ref softsdl
Para uma lista de drivers de vídeo, procure pelos arquivos ref_*.so em: /usr/lib/games/quake2/
Problemas com o aúdio
O driver padrão de áudio é o OSS, no meu caso que não funcionou e saiu com a seguinte mensagem:
loading oss sound output driver, ok
/dev/dsp: Input/output error
SNDDMA_Init: Could not mmap /dev/dsp.


Para usar OSS, eu precisei fazer este hack como root:
echo "quake2.real 0 0 direct" > /proc/asound/card0/pcm0p/oss

O driver de áudio alsa pode ser carregado usando:
quake2 +set snddriver alsa

Mas também apresentou um problema comigo:
loading alsa sound output driver, ok
ALSA lib pcm.c:2143:(snd_pcm_open_noupdate) Unknown PCM /dev/dsp
ALSA snd error, cannot open device /dev/dsp (No such file or directory)

O driver sdl e o driver ao funcionaram bem:
quake2 +set snddriver ao
quake2 +set snddriver sdl
Para uma lista de drivers de audio, procure pelos arquivos snd_*.so em: /usr/lib/games/quake2/
Compilando para 32bits
A única solução que achei para usar renderização por software foi recompilar para para 32bits.

O problema de usar um software 32 bits em uma máquina 64 bits é que você precisa também de todas as bibliotecas necessárias ao software em sua versão 32bits, o debian vem com algumas prontas para instalar a partir do apt-get, o básico é ter a libc e a libstdc++. Eu tenho estes pacotes instalados:

libc6-i386 libc6-dev-i386 lib32bz2-1.0 lib32bz2-dev lib32gcc1 lib32ncurses5 lib32z1 lib32z1-dev ia32-libs

Para se compilar algo para 32 bits basta chamar o gcc como:
gcc -m32

No caso de quake eu fiz isto:
./configure \
CFLAGS=-Wno-error \
CC=gcc\ -m32 \
--without-alsa \
--without-ao \
--without-svgalib \
--without-opengl \
--disable-sdl \
--enable-shared=yes \
--enable-static=no \
--program-prefix=32bits- \
--prefix=/usr \
--bindir=/usr/games \
--libdir=/usr/lib32/games \
--datadir=/usr/share/games && \
make clean && \
make && \
sudo make install-exec

Assim eu mative as duas versões 64bits e 32bits. Se você não colocou os arquivos *.pak em seu $HOME/.quake2/baseq2 você precisará criar um link simbólico para eles em /usr/lib/games/quake2/baseq2

Nesta configuração habilitei somente o suporte a vídeo X11 e a áudio OSS, o OSS precisa que se faça este hack como root:
echo "32bits-quake2 0 0 direct" > /proc/asound/card0/pcm0p/oss

Para finalmente rodar quake2 execute:
32bits-quake2 +set snddriver oss +set vid_ref softx11

Nas próximas execuções use somente:
32bits-quake2

Bom jogo.