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!!
Aviso: Tutorial de dificultad media / avanzada. Debes saber un poco sobre KOS, y al menos, tener una toolchain de Dreamcast funcional.
Libronin, ¿"ezo que eh"?
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 :)
¡Me gusta me gusta! ¿De dónde me lo bajo?
¡¡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".
Requisitos
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.
ATENCIÓN: 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!!
PIKE
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).
Configurando Paths
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á!
Paso 1: Nueva newlib
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
Paso 2: Preparando Makefile de libronin
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 $@ $<
Paso 3: Revisando los PIKE
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:
Paso 4: COMPILAR!!!
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.
Paso 5 (Opcional): MadMP3
Compilar esta librería es un juego de niños :) .
AVISO: 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!!
RESUMIENDO 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