Amigos, lo prometido es deuda!! Lo que van a leer en las siguientes líneas es un buen tostón (jajaja) para adentrarse en el apasionante mundo de la scene Saturnera!!
Aviso: Tutorial de dificultad alta / hardcore de carácter bastante técnico!
He realizado la compilación usando Mac Os X (10.11) y Homebrew, así que en entornos Unix o Cygwin... YMMV
¿Host, target, tool-chain, cross-compiler, libyaul? Ayuda!!
Así que quieres hacer juegos para la Sega Saturn eh? Estupendo, aquí la lección 101:
- Host: Máquina en la que programaremos (un PC, Mac).
- Target: La máquina dónde queremos que se ejecuten nuestro programa (la Saturn)
- Cross-compile: Necesitamos algo que traduzca nuestro código del host , a código binario en el target. Ese proceso es lo que se llama compilación cruzada: una máquina genera código para otra.
- Tool-chain: La toolchain es el conjunto de herramientas para hacer la cross-compile. Incluye los compiladores, linkadores, ensambladores...
- Libyaul: (Yet Another Useless Library) es un estupendo development kit open-source para SEGA Saturn que ofrece un conjunto de rutinas de bajo-nivel para que hagamos programas a alto-nivel (toma ya!).
¿Y para qué todo ese rollo? Fácil! Antes de usar la libyaul, debemos de tener nuestra Tool-chain compilada (es decir, el entorno básico de programación!). Así que la primera parte del tutorial se basará en compilar nuestra propia Tool-chain :)
Requisitos previos
Para poder compilar la Toolchain necesitaremos tener las siguientes herramientas (si no lo sabéis, escribid el comando en un terminal para ver si la tenéis instalada):
- wget: para descargar los paquetes GCC.
- gpg: se usa para comparar la integridad de los paquetes descargados.
- make: herramienta base para compilar cosas.
- md5sum: otra herramienta de comparación de hashes.
- patch: herramienta para aplicar parches especificos.
- gcc / g++: el compilador básico para que compilemos cosas. IMPORTANTE: Usad la versión 4 (4.7, 4.8...) pero NO os funcionará con la 5!
- git: para obtener los fuentes de libyaul
- genisoimage / mkisofs: para crear imágenes ISO
- awk: util de scripting.
- makeinfo: de serie en OSX, en ubuntu es el package "texinfo"
* Para Cygwin, todos ellos los encontraréis en los packages (menos CMAKE). El CMAKE lo podéis instalar en Windows y luego añadirlo en vuestro PATH para que Cygwin lo pueda llamar.
* En UNIX con apt-get se deberían encontrar todos sin problemas.
* Para los fans del OSX, podéis usar Macports o Homebrew para los siguientes paquetes (en Mac no tenemos md5sum pero sí md5, como veremos más adelante):
wget, gnupg, coreutils, cdrtools
Preparando la compilación
La URL de la libyaul es la siguiente: https://github.com/ijacquez/libyaul
Primero la descargaremos una copia en nuestro ordenador. Por ejemplo, yo la tengo dentro de mi HOME:
cd ~
mkdir saturn
cd saturn
git clone https://github.com/ijacquez/libyaul.git libyaul
cd libyaul
git submodule init
git submodule update -f
mkdir saturn
cd saturn
git clone https://github.com/ijacquez/libyaul.git libyaul
cd libyaul
git submodule init
git submodule update -f
Si miráis dentro, veréis varias carpetas, pero la que nos interesa ahora es la de tools/build-scripts. Esa carpeta contine varios scripts para que compilemos la tool-chain, así que entrad dentro de ella. El siguiente comando os creará un fichero de configuración ;)
cd tools/build-scripts
cp -v config{.in,}
cp -v config{.in,}
Ahora habrá que editar varios ficheros de la siguiente manera:
config
* BUILD_INSTALL_DIR: Aquí debéis poner la ruta dónde queréis tener vuestra toolchain.
Ej: /Users/ryo/saturn/tool-chains
# Tools for host
Sólo para Mac Os X!: Descomentad "md5" y comentad "md5sum"
* OPTION_DOWNLOAD_TARBALLS="yes" (descarga los paquetes él solito)
* OPTION_ENABLE_GDB="no" (no queremos el debugger GDB... lo dejamos para otro día xD)
build-compiler
Sólo para Mac Os X! Bien, como hemos cambiado la herramienta md5sum por md5, también debemos de cambiar el script que se usa para recoger el HASH de los ficheros. Por suerte, es un cambio menor!
Hacía la línea 380, debéis de cambiar la línea que define a calculated_md5 (sólo cambiad para el caso de md5, que es el que usará el script!).
case "${MD5}" in
"md5")
calculated_md5=`"${MD5}" -r "${NEWLIB}" | awk '{print $1;}'`
;;
"md5sum")
calculated_md5=`"${MD5}" "${NEWLIB}" | sed -r -n 's/^([a-f0-9][a-f0-9]*)\s+.*?$/\1/pg'`
;;
esac
"md5")
calculated_md5=`"${MD5}" -r "${NEWLIB}" | awk '{print $1;}'`
;;
"md5sum")
calculated_md5=`"${MD5}" "${NEWLIB}" | sed -r -n 's/^([a-f0-9][a-f0-9]*)\s+.*?$/\1/pg'`
;;
esac
sh-elf/scripts/build
m68k/scripts/build
Si queremos evitar un error del tipo "error: 'sbrk' is deprecated"
http://stackoverflow.com/questions/20426213/error-building-ellcc
asegurémonos que el CFLAGS esté así (en los 2 ficheros):
message "Configuring Binutils"
CFLAGS="-Wno-error=deprecated-declarations" LDFLAGS="" ../"${BINUTILS_SRC_DIR}"/configure \
CFLAGS="-Wno-error=deprecated-declarations" LDFLAGS="" ../"${BINUTILS_SRC_DIR}"/configure \
¿Compilo ya?
Eeerh... no! jajajajaja.
Veréis, hay un pequeño detalle que no os he contado. Este script nos compilará un GCC para el SH y el M68K (los dos procesadores de la Saturn), pero lamentablemente no es tan listo, y os pedirá las dependencias de GCC!!!
Así pues, necesitaréis tener instaladas también las siguientes librerías!!
- GMP 5.1.2
- MPFR 3.1.2
- MPC 1.0.1
Seguramente las podáis obtener de vuestros paquetes (acordaros de elegir las versiones "dev", si hay más de una!). Ni las intentéis compilar, de verdad!
Sólo para Mac Os X!:
En Macports se hace así (importante el orden en que se instalan: libmpc depende de las dos anteriores):
sudo port install gmp +universal
sudo port install mpfr +universal
sudo port install libmpc +universal
sudo port install mpfr +universal
sudo port install libmpc +universal
Con Homebrew:
brew install gmp
brew install mpfr
brew install libmpc
brew install mpfr
brew install libmpc
Luego, tendréis que decirle a los dos scripts anteriores cuál es la ruta de las librerías recién instaladas. Añadid al LDFLAGS_FOR_TARGET lo siguiente (/opt/local para Macports, /usr/local para Homebrew):
--with-gmp="/opt/local" \
--with-mpfr="/opt/local" \
--with-mpc="/opt/local" \
--with-mpfr="/opt/local" \
--with-mpc="/opt/local" \
¡Por dios, dime que puedo compilar ya!
Pues claro que sí, campeón!! Si has llegado hasta aquí es que te lo mereces jajaja.
Ingresa a la carpeta /tools/build-scripts y ejecuta: >> ./buid-compiler
El script funciona de la siguiente manera:
- va trabajando sobre la carpeta temporal que le habéis definido en el config.
- a cada paso completado, irá creando un fichero "vacío", como si fueran checkpoints. Por ejemplo: downloaded-tarballs , checked-integrity...
- si os fallara la compilación, gracias a esos ficheros, al volver a ejecutarlo no empezará desde 0. Y si queréis que repita un paso, simplemente borrad ese fichero vacío!
¡¡Aleluya!! ¡Terminó y no tengo errores!
Eres un fenómeno :mrgreen: . Lo primero es añadir tu nuevo compilador en tu PATH de la consola.
echo $PATH;
export PATH="/Users/ryo/saturn/tool-chains/sh-elf/bin:/Users/ryo/saturn/tool-chains/m68k-elf/bin:${PATH}"
export PATH="/Users/ryo/saturn/tool-chains/sh-elf/bin:/Users/ryo/saturn/tool-chains/m68k-elf/bin:${PATH}"
Eso lo añadirá al PATH, pero sólo en la sesión actual. Si no quieres escribir esto cada vez, lo puedes poner en tu .profile.
Seguimos con la libyaul
La libyaul se compone de diferentes módulos: release (la lib propiamente dicha), tools (herramientas necesarias para compilar) y examples (makefile para generar los ejemplos). Es MUY importante seguir bien los siguientes pasos, cracks!!
Ahora os iré comentando diferentes aspectos a arreglar antes de hacer la compilación final...
Generar y cargar el entorno
Libyaul usa un fichero de entorno, en que se define las rutas que usará la librería. Hay que crear y editar este fichero:
cp -v yaul.env{.in,}
INSTALL_ROOT: Aquí pondremos la ruta dónde hemos instalado nuestra toolchain (concretamente, el directorio sh-elf).
Ejemplo: /Users/ryo/saturn/tool-chains/sh-elf
BUILD_ROOT: Aquí pondremos la ruta dónde tenemos la librería libyaul.
Ejemplo: /Users/ryo/saturn/libyaul
Una vez definidos, cada vez que usemos la consola, debemos de cargar este entorno con el comando (y lo haremos ahora mismo):
source yaul.env
/tools/Makefile
Para evitaros problemas de cabeza, es mejor quitar la tool "ssload" (necesitaréis pkg-ino y libftdi, entre otros xD).
/tools/make-iso/make-iso
Si sois viejunos como yo, y usáis mkisofs en vez del nuevo genisoimage, cambiadle el comando "genisoimage" por "mkisofs" dentro del script.
/tools/bin2c/Makefile
/tools/genromfs/Makefile
Quitad la línea del strip (borradla, no es correcta en el entorno Mac):
COMPILAR LA MALDITA LIBRERÍA Y SUS HERRAMIENTAS xDDD
cd ~
cd saturn/libyaul
make release
make install-release
make tools
make install-tools
cd saturn/libyaul
make release
make install-release
make tools
make install-tools
Tools os compilará: bin2c, bin2o, genromfs y make-iso.
¡Quiero ver ejemplos!
Bueno, casi casi estamos!!! Todavía hay algunos pequeños bugs que libyaul no los ha arreglado, así que os indico qué más ficheros debéis de tocar!! :D :D :D
tool-chains/sh-elf/share/yaul/pre.common.mk
Debéis de arreglar el path a la libfixmath y libyaul con estas líneas:
-I$(BUILD_ROOT)/libfixmath \
-I$(BUILD_ROOT)/libyaul \
-I$(BUILD_ROOT)/libyaul \
tool-chains/sh-elf/share/yaul/post.common.mk
Eliminad el comentario dentro del comando awk (es decir, borrad esta línea):
Para compilar los ejemplos, es tan fácil como ir a la carpeta raíz de libyaul y ejecutar:
make examples
NOTA: Si os falla algún ejemplo (como el dark-blue, u otros), lo mejor es que los comentéis en el fichero "examples/Makefile" (a fecha de hoy, no todos compilan correctamente).
Oh magia!! Si todo ha ido bien, tendrás un nuevo fichero binario en cada carpeta de ejemplo. Acabas de crear un fichero que ya lo puede ejecutar una Sega Saturn!! Además, también verás un IP.BIN autogenerado (maravilla!) y el fichero ISO que lo podéis ejecutar :putoamo:
Conclusiones
Aquí termina este TOSTÓN de tutorial... lo reconozco!! Personalmente, le veo bastante potencial a la librería, así que os animo a que la probéis! Espero vuestro comentarios, dudas, problemas con impaciencia!! :oops:
Un gran saludo sceners!!! ;)