Hola amigos!! Bienvenidos a una nueva entrega de las aventuras de un desarrollador de la Dreamcast!! Jajaja, hoy aprenderemos qué es libronin, cómo compilarlo y disfrutarlo!! Así que relájense, vayan a buscar su bebida / comida / peluche favorito, y vuelvan para ver un apasionante viaje!!
[color=#ff0000]Aviso[/color]: Tutorial de dificultad media / avanzada. Debes saber un poco sobre KOS, y al menos, tener una toolchain de Dreamcast funcional.
[color=#0066ff]Libronin, ¿"ezo que eh"?[/color]
Reconocerán que la gran mayoría del homebrew de Dreamcast, se basa en KallistiOS, un excelente sistema operativo para la consola con multitud de funcionalidades, y aún dando mucha guerra (un gran saludo para el maestro BlueCrab!). Pero amigos, no es el único. Hay otro OS, más liviano (no menos potente!) llamado libronin.
Lo más importante:
libronin NO ES ninguna librería o módulo de KOS!. Tiene una instalación completamente diferente y independiente, e incluso diría yo su filosofía!
Libronin es desarrollado y mantenido por Marcus Comstedt. Quizá los más novatos no os dice nada, pero si os digo que es el responsable oficial de SCUMMVM, y que su librería se ha usado para hacer SCUMMVM, Cave History y otros emus, la cosa cambia :)
[color=#0066ff]¡Me gusta me gusta! ¿De dónde me lo bajo?[/color]
¡¡Eeeh, quieto parao!! Aquí no encontrarán ningún binario amigos, tocará compilar y compilar :) . Empecemos por lo básico.
El repo "oficial" de la libronin está alojado en BitBucket:
https://bitbucket.org/ihi/libronin (
Tip: Den una ojeada a otros proyectos de Marcus ;)
La última versión es la 0.5, pero utilicen GIT para clonar el repositorio (tiene algunos ejemplos que no están en la distribución).
git clone https://bitbucket.org/ihi/libronin.git
Les recomiendo que lo pongan en un lugar diferente de KOS, por ejemplo en "/usr/local/ronin".
[color=#0066ff]Requisitos[/color]
Para compilar
libronin se necesitan los siguientes componentes:
* GNU Make
* GCC - configurado como cross-compiler para
sh-elf , lo que llamaríamos la "Toolchain". Si tenéis KOS no os hará falta hacer uno nuevo :) . Para este tuto uso un
GCC 4.7.0.
* Binutils - configurado como cross-compiler para
sh-elf . Lo mismo, si tenéis KOS lo reaprovechamos.
* Newlib - compilado para
sh-elf.
[color=#ff0000]ATENCIÓN[/color]: aquí
NO nos servirá el de KOS!! El de KOS está parcheado y no será válido, así que tendremos que compilar un newlib estándar (más adelante os lo explico!).
El pack de libronin lleva, además de la librería en sí, la zlib y la libmad (MP3), siendo esta segunda opcional de compilar.
[.....]
¿Y ya está? Hmmm no, me reservo lo mejor para el final!! ^^ . Nuestro amigo Marcus le gusta usar
PIKE: es un lenguaje de programación dinámico con una sintaxi similar al Java y C. Así pues...
* Pike - la versión 7.8.X será más que suficiente.
¿Queda claro? Supongo que sí, así que... continuemos!!
[color=#0066ff]PIKE[/color]
Es cierto que se puede compilar libronin sin PIKE pero, luego hay varias tools y otros programas que lo usan, y además no es muy complicado! Aquí se dividen dos grupos:
LINUX (Ubuntu)
sudo apt-get install pike7.8-core
Y ya se pueden ir a jugar al parque! :-P . Averigua dónde se instaló el paquete (suele ser en /usr/local/bin), con un whereis debería ser suficiente.
MAC OS X
Y se unan a la fiesta con los Unixeros! :-P
WINDOWS (Cygwin/MinGW)
Lo primero, olviden de intentar compilar PIKE en Cygwin: simplemente no funciona. Haremos algo MUCHO más simple! :D
- Descarguen la versión Windows binaria de aquí:
http://pike.lysator.liu.se/
- Instalen el .msi, opciones por defecto.
- Ahora el
truco del almendruco: para que Cygwin pueda llamar a "pike", deben añadirlo en el PATH de Cygwin. Para hacerlo temporalmente, abran la ventana de Cygwin y ejecuten (no se olviden de las comillas):
export PATH=${PATH}:"/cygdrive/c/Program Files (x86)/Pike/bin"
Ahora ya pueden llamar a pike y se ejecutará correctamente! Recuerden, cada vez que abran una ventana de Cygwin, tienen que poner el comando (o lo guardan en su profile).
[color=#0066ff]Configurando Paths[/color]
Hemos de añadir a nuestros PATHS la ruta de dónde se encuentra nuestro compilador
sh-elf-gcc y
arm-elf / arm-eabi !! La ruta dependerá de cada instalación de KOS, pero por defecto suele estar aquí:
export PATH=${PATH}:"/opt/toolchains/dc/sh-elf/bin/":"/opt/toolchains/dc/arm-eabi/bin"
MUY IMPORTANTE: NUNCA CARGAR EL ENTORNO KOS!! (el environ.sh). Con esto le decimos a la libronin y al newlib dónde encontrar nuestros compiladores :)
Tip: Pueden añadir las líneas export en .bashrc, así cada vez que abran Cygwin ya lo recordará!
[color=#0066ff]Paso 1: Nueva newlib[/color]
Una vez seteado nuestro path, lo primero es compilar una nueva Newlib. Por fortuna, no hay que aplicarle ningún parche especial, y puede residir junto a la newlib del KOS :)
a) Descargar de aquí:
ftp://sourceware.org/pub/newlib/
Si tienen un GCC 3.X, elijan una versión conservadora (1.12.0).
Si usan ya GCC 4.X, vayan a por la última (2.1.0): versiones anteriores les fallará la compilación.
b) Descompriman en una carpeta de su home, y entren dentro de la carpeta newlib.
c)
./configure --target=sh-elf
make
Pueden usar un --prefix y luego un make install, para instalar la librería en otro directorio (más limpio jeje). Tardará un rato, así que tomen un sorbo o coman una manzana ;D
[color=#0066ff]Paso 2: Preparando Makefile de libronin[/color]
Bien!! Ya estamos muy cerca :D . Ahora, vayan a la carpeta de la libronin y abran el Makefile: debemos de hacer algunas modificaciones :)
1) Si usan GCC > 4.7.X , o en otras palabras, tienen"arm-eabi" en vez de "arm-elf", deben substituir todas las referencias de "arm-elf" a "arm-eabi".
2) Las variables NETSERIAL y NETCD: si usan un BBA, pongan a 1 NETSERIAL (en el siguiente post, más info).
3) TYPE: Por defecto compila en ELF (filosofía libronin, más info en el otro post). Lo dejamos tal cual.
4) LINK: Aquí debemos de añadir la ruta de nuestra preciosa "newlib" , para que la use en vez de la del KOS! Un ejemplo:
LINK=$(CPUFLAGS) -nostartfiles -nostdlib $(INCLUDES) -o $@ -Llib -lz -lronin -lgcc -L/home/indi/newlib-2.1.0/sh-elf/newlib -lc -lgcc
Nota: En Makefiles de otros proyectos, lo tendréis que tener en cuenta!
5) DISTHEADERS: Por defecto, libronin compila con un fichero llamado "notlibc.h", que es como un fichero "basura" por si no tenemos una libc. Da más problemas, y como ya hemos compilado una, lo tenemos que quitar. Así pues, borrad "notlibc.h"
6) OBJECTS += notlibc.o : Lo mismo, comentad esta línea (os habéis dado cuenta que está separada? jejeje).
7) EXAMPLES: Los examples están mal, los correctos son estos:
EXAMPLES = examples/ex_serial.$(TYPE) \
examples/ex_video.$(TYPE) \
examples/ex_vmsfscheck.$(TYPE) \
examples/ex_gtext.$(TYPE) \
examples/ex_showpvr.$(TYPE) \
examples/ex_malloc.$(TYPE) \
examples/ex_videomodes.$(TYPE) \
examples/ex_clouds.$(TYPE) \
examples/ex_control.$(TYPE) \
8) ARMFLAGS: Para entornos GCC 4.X, debemos de añadir este flag:
-mno-thumb-interwork
9) arm_startup.o: En este parte debemos de cambiar -marm7 por -mcpu=arm7, quedando así (yo uso arm-eabi):
arm_startup.o:
arm-eabi-as -mcpu=arm7 arm_startup.s -o $@ $<
[color=#0066ff]Paso 3: Revisando los PIKE[/color]
Finalmente, en la carpeta /tools, tenéis 3 scripts PIKE. Debéis abrirlos y ajustar la ruta de ejecución (si es necesario), para encode_armcode.pike y ipupload.pike
En Cygwin, por ejemplo sería:
[color=#0066ff]Paso 4: COMPILAR!!![/color]
Por fin dreamers!!! Tenéis cargado los PATHS de PIKE y las rutas del sh-elf? Habéis editado el Makefile tal y cómo os comento? Lo que queda es pan comido ahora!!
Entrad en la carpeta de la libronin, y ejecutad:
>> make clean
>> make all
Es MUY IMPORTANTE hacer el
make con el ALL, ya que de esta forma nos compilará 2 libs, la que usa el puerto serial y la que no!
Si habéis tenido éxito, os aparecerá dentro de la carpeta
libs los siguientes ficheros:
* crt0.o
* libronin.a (la lib de DEBUG)
* libronin-noserial.a (la lib de RELEASE)
* libz.a (es un symlink a la librería que está en /zlib)
También os recomiendo compilar los ejemplos, así podréis detectar si tenéis mal vuestra newlib, o cualquier cosa. Si os va bien, os saldrán ficheros ELF (que no son elfos!) jajajajajaaja.
[color=#0066ff]Paso 5 (Opcional): MadMP3[/color]
Compilar esta librería es un juego de niños :) .
[color=#ff0000]AVISO[/color]: La versión del repositorio es antigua, la 0.12.5b. SCUMMVM necesita la 0.15.1b para compilar!!
Para GCC > 4.7.X Abrid el Makefile de dentro de libmad y haced estos dos cambios:
- Reemplazar los "arm-elf..." por "arm-eabi..." (hay 3)
- Añadir al ARMFLAGS: -mno-thumb-interwork
Luego ejecutad make. Copiáis
libmad.a en libs, y
mad.h en include.
Apunte: El Makefile original compila con arm-eabi, y tenemos nuestras dudas ya que los binarios del propio Marcus son con sh-elf. Si no os funciona... recompilad con sh-elf!!
[color=#0066ff]RESUMIENDO[/color] En esta entrega hemos conseguido compilar la libronin básica (sin libmad) en un entorno Unix / Windows, a partir de nuestras toolchains existentes, y listo para entrar a la acción!!!
En el siguiente post, os explicaré cómo funciona la libronin, y lo más importante, cómo ejecutar nuestros programas :D
Considérenlo un pre-regalo de la RetroMadrid 2014 jejeje ;) Un gran saludote!!
Info interesante:
http://dcemulation.org/phpBB/viewtopi...;p=1011157