qemu-arm-eabi updated, fakeroot bug fixed, post posted

As some of you already know Lauro Venâncio maintains a version of qemu with a set of patches that provides arm-eabi compatibility (which is needed if you want to build/use PyMaemo in Scratchbox). He does so because many of these patches where not yet accepted upstream and the world can not wait.

The version of qemu-arm-eabi in the sourceforge repository included the full source of qemu from its cvs with the patches already applied. Since the qemu source was a bit old (the current version uses svn) I spent some time updating Lauro’s qemu-arm-eabi. Now the sourceforge repository includes only the patches and a script to checkout qemu source from its own svn and apply the patches with quilt. There are also scripts to build and install the qemu-arm-eabi in scratchbox.

But nobody expects that a new bug would crawl in. When running a program through fakeroot and that program tries to call popen libfakeroot will not be found. I find out that the problem was in the fakeroot-tcp script that was using ‘,’ as separator in the environment variable SBOX_PRELOAD. This works with the qemu versions provided by scratchbox, but not with our patched version. I take a look at the scratchbox patches and other places for the source of the problem and found nothing. Since my time to deal with this was limited I just changed ‘,‘ to ‘:‘ in fakeroot-tcp. This worked fine when you do “fakeroot ./progthatusespopen” but Jesus couldn’t do a “dpkg-buildpackage -rfakeroot“. Caio (from Canola fame) solved this by removing the separator and the second item of the SBOX_PRELOAD variable.

The fix described is not the best but works for now. If you have any idea on how to solve this in a proper way your help is appreciated.

Instructions on how to install in the qemu-arm-eabi wiki.

Qemu ARM EABI no Scratchbox

Se você está usando o PyMaemo deve ter reparado na mensagem de erro "sem_post: Function not implemented" quando chama o Python2.5 no target ARMEL do Chinook. Isso tem a ver, entre outras coisas, com funcionalidades não implementadas na versão do Qemu usada no Scratchbox. O Lauro Venâncio reuniu os patches necessários pra modernizar esse bicho, criou um projeto no SourceForge e pretende mantê-los sincronizados com o head do CVS do Qemu até os caras se dignarem a implementar as melhorias.

Se você quer usar o Qemu ARM EABI em seu Scratchbox, siga as instruções abaixo. Lembre de fechar quaisquer seções abertas do Scratchbox.

Compilar o Qemu ARM EABI

Na máquina host, instale o gcc-3.4 e baixe o qemu com os patches já aplicados.

$ sudo apt-get install gcc-3.4
$ svn co https://qemu-arm-eabi.svn.sourceforge.net/svnroot/qemu-arm-eabi/trunk qemu-arm-eabi
$ cd qemu-arm-eabi
$ ./configure --target-list=arm-linux-user --static
$ make

Update: o luck sentiu falta da zlib no processo de compilação:

$ sudo apt-get install zlib1g-dev

Update 2: o lauro resolveu organizar o repo dele, criando branches, tag e trunk. As instruções acima foram atualizadas.

Instalar no Qemu ARM EABI no Scratchbox

Como se pode ver, o binário gerado foi linkado estaticamente, então nada de dependências cabulosas, basta copiar para o lugar certo:

$ sudo cp arm-linux-user/qemu-arm /scratchbox/devkits/cputransp/bin/qemu-arm-eabi-sb2

Edite o cputransp-methods:

$ sudo vim /scratchbox/devkits/cputransp/etc/cputransp-methods

e adicione a linha:

qemu-arm-eabi-sb2

Depois edite o arquivo config do seu target (ou dos targets) ARMEL:

vim /scratchbox/users/USERNAME/targets/SDK_ARMEL.config

e altere a variável do método de transparência do CPU para:

SBOX_CPUTRANSPARENCY_METHOD=/scratchbox/devkits/cputransp/bin/qemu-arm-eabi-sb2

Veja também:

portemu (no windows da escola)

Agora no Windows(TM):

portemu-win

Funcionou como devia. Recapitulando o que é necessário:

Mais tarde vou investigar o Py2Exe pra gerar um executável pro Win32 com todas as DLLs embutidas. Claro que vai ficar enorme, mas hei, banda larga está aí e seu HD é enorme, e acredite em mim quando digo que é menos chato um grande download do que vários downloads e instalações pra chegar num programinha simples.
E quem já tem essas coisas instaladas sempre vai poder baixar o arquivo .py

Até lá Lauro e eu destemidamente aprimoraremos o portemu pra tentar uma inclusão na disciplina de IHS. Isso se eles já não mudarem pra USB no próximo período… mas aí mudamos também. =D

portemu

Meio caminho andado com a interface PyGTK para brincar com as portas serial e paralela emuladas pelo QEmu.

Aqui vai uma foto de um teste, a janela de trás é o infame, mas muito útil, debug DOS (nesse caso, FreeDOS), enviando e recebendo alguns bytes via porta serial.

portemu

A interface é bem simples e (espero) intuitiva, e o programa não foi pensado para ser super poderoso, só pra ajudar na prototipagem básica envolvendo as portas do PC. Só vou falar sobre os botões no alto: o primeiro inicia e pára o QEmu com os parâmetros que redirecionam as portas serial e paralela para sockets tcp. Bem, esse botão ainda não está funcionando! ;P É preciso iniciar o QEmu antes:

 qemu freedos.img -no-kqemu -localtime -serial tcp::4444,server,nowait

Como se pode notar a porta paralela não é redirecionada, somente a serial. Hmmm… “Release Early, Release Often!” e saia correndo.

Também é necessária uma imagem do FreeDOS, como essa:

http://fabrice.bellard.free.fr/qemu/freedos.img.bz2

Outro detalhe a versão necessária do QEmu é a 0.8.2, que no Ubuntu está disponível a partir do Edgy, ou você pode baixar do site do QEmu, cujo endereço está no meu último post.

Resumão para usar: instale o QEmu 0.8.2, rode-o com a imagem indicada acima, usando a linha indicada mais acima ainda, rode o PortEmu, clique no botão QEmu, depois no botão Conectar, e comece a brincadeira. =D

Baixe aqui: http://www.cin.ufpe.br/~mls/portemu http://code.google.com/p/portemu

Brincando com o QEmu

Com uma imagem do Freedos, um cliente telnet e essa linha

 qemu.exe -L . -m 128 -hda freedos.img -soundhw all -localtime -serial telnet::4444,server,nowait

pude pegar a saida da porta 3f8 (serial). Quando acabar o Drama do Servidor Bastardo do Inferno no meu trabalho, voltarei a isso, com uma interface bunitinha em PyGTK.Porta Serial para Telnet

Na linha do QEmu, alguns parâmetros são dispensáveis (copiarcolar;), o que importa é

-serial telnet::4444,server,nowait

E a linha de invocação do telnet

telnet localhost 4444

Alguns links relevantes: