https://www.segasaturno.com/portal/viewtopic.php?f=33&t=7702&p=78370#p78370
-----------------------------------
Indiket
20 May 2014, 10:55 PM

[Tutorial 5J] Compilación de la librería libyaul
-----------------------------------
[color=#F20000][b]ACTUALIZADO A MARZO DE 2016!![/b][/color]

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!! 

[align=center][img src="http://www.segasaturno.com/portal/files/images/2584/inkfill1.png" width=628 /][/align]
[b][color=red]Aviso[/color][/b]: Tutorial de dificultad alta / hardcore de carácter bastante técnico!
He realizado la compilación usando [b]Mac Os X (10.11) y Homebrew[/b], así que en entornos Unix o Cygwin... YMMV

[b][color=#4E99FF]¿Host, target, tool-chain, cross-compiler, libyaul? Ayuda!![/color][/b]

Así que quieres hacer juegos para la Sega Saturn eh? Estupendo, aquí la lección 101:

- [b]Host[/b]: Máquina en la que programaremos (un PC, Mac).
- [b]Target[/b]: La máquina dónde queremos que se ejecuten nuestro programa (la Saturn)
- [b]Cross-compile[/b]: 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.
- [b]Tool-chain[/b]: La toolchain es el conjunto de herramientas para hacer la cross-compile. Incluye los compiladores, linkadores, ensambladores... 
- [b]Libyaul[/b]: (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 :)


[b][color=#4E99FF]Requisitos previos[/color][/b]

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):

- [b]wget[/b]: para descargar los paquetes GCC.
- [b]gpg[/b]: se usa para comparar la integridad de los paquetes descargados.
- [b]make[/b]: herramienta base para compilar cosas.
- [b]md5sum[/b]: otra herramienta de comparación de hashes.
- [b]patch[/b]: herramienta para aplicar parches especificos.
- [b]gcc / g++[/b]: el compilador básico para que compilemos cosas. [color=#FF0000]IMPORTANTE:[/color] Usad la versión 4 (4.7, 4.8...) pero NO os funcionará con la 5!
- [b]git[/b]: para obtener los fuentes de libyaul
- [b]genisoimage / mkisofs[/b]: para crear imágenes ISO
- [b]awk[/b]: util de scripting.
- [b]makeinfo[/b]: 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):
[code linenumbers=false]
wget, gnupg, coreutils, cdrtools
[/code]


[b][color=#4E99FF]Preparando la compilación[/color][/b]

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:
[code linenumbers=false]
cd ~
mkdir saturn
cd saturn
git clone https://github.com/ijacquez/libyaul.git libyaul
cd libyaul
git submodule init
git submodule update -f
[/code]

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 ;)

[code linenumbers=false]
cd tools/build-scripts
cp -v config{.in,}
[/code]

Ahora habrá que editar varios ficheros de la siguiente manera:

[b]config[/b]

* 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
[color=red]Sólo para Mac Os X![/color]: 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)


[b]build-compiler[/b]

[color=red]Sólo para Mac Os X![/color] 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!).
[code linenumbers=false]
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
[/code]

[b]sh-elf/scripts/build
m68k/scripts/build[/b]

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):

[code linenumbers=false]
message "Configuring Binutils"
    CFLAGS="-Wno-error=deprecated-declarations" LDFLAGS="" ../"${BINUTILS_SRC_DIR}"/configure \
[/code]


[b][color=#4E99FF]¿Compilo ya?[/color][/b]

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 [b]instaladas también[/b] las siguientes librerías!!

[b]- GMP 5.1.2
- MPFR 3.1.2
- MPC 1.0.1[/b]

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!

[color=red]Sólo para Mac Os X![/color]:
En Macports se hace así (importante el orden en que se instalan: libmpc depende de las dos anteriores):
[code linenumbers=false]
sudo port install gmp +universal
sudo port install mpfr +universal
sudo port install libmpc +universal
[/code]

Con Homebrew:
[code linenumbers=false]
brew install gmp
brew install mpfr
brew install libmpc
[/code]

Luego, tendréis que decirle a los [b]dos scripts anteriores[/b] 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):
[code linenumbers=false]
--with-gmp="/opt/local" \
--with-mpfr="/opt/local" \
--with-mpc="/opt/local" \
[/code]

[b][color=#4E99FF]¡Por dios, dime que puedo compilar ya![/color][/b]

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!


[b][color=#4E99FF]¡¡Aleluya!! ¡Terminó y no tengo errores![/color][/b]

Eres un fenómeno  :mrgreen: . Lo primero es añadir tu nuevo compilador en tu PATH de la consola.
[code linenumbers=false]
echo $PATH;
export PATH="/Users/ryo/saturn/tool-chains/sh-elf/bin:/Users/ryo/saturn/tool-chains/m68k-elf/bin:${PATH}"
[/code]
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.


[b][color=#4E99FF]Seguimos con la libyaul[/color][/b]

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...


[b][color=#4E99FF]Generar y cargar el entorno[/color][/b]

Libyaul usa un fichero de entorno, en que se define las rutas que usará la librería. Hay que crear y editar este fichero:

[code linenumbers=false]
cp -v yaul.env{.in,}
[/code]

[b]INSTALL_ROOT:[/b] Aquí pondremos la ruta dónde hemos instalado nuestra toolchain (concretamente, el directorio sh-elf).
Ejemplo: /Users/ryo/saturn/tool-chains/sh-elf

[b]BUILD_ROOT:[/b] 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):
[code linenumbers=false]
source yaul.env
[/code]

[b][color=#4E99FF]/tools/Makefile[/color][/b]

Para evitaros problemas de cabeza, es mejor quitar la tool "ssload" (necesitaréis pkg-ino y libftdi, entre otros xD).

[b][color=#4E99FF]/tools/make-iso/make-iso[/color][/b]

Si sois viejunos como yo, y usáis mkisofs en vez del nuevo genisoimage, cambiadle el comando "genisoimage" por "mkisofs" dentro del script.

[b][color=#4E99FF]/tools/bin2c/Makefile
/tools/genromfs/Makefile[/color][/b]

Quitad la línea del strip (borradla, no es correcta en el entorno Mac):

[strike]$(SILENT)$(STRIP) -s $@[/strike]


[b][color=#4E99FF]COMPILAR LA MALDITA LIBRERÍA Y SUS HERRAMIENTAS xDDD[/color][/b]

[code linenumbers=false]
cd ~
cd saturn/libyaul
make release
make install-release

make tools
make install-tools
[/code]

Tools os compilará: bin2c, bin2o, genromfs y make-iso.

[b][color=#4E99FF]¡Quiero ver ejemplos![/color][/b]

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

[b]tool-chains/sh-elf/share/yaul/pre.common.mk[/b]
Debéis de arreglar el path a la libfixmath y libyaul con estas líneas:

[code linenumbers=false]
-I$(BUILD_ROOT)/libfixmath \
-I$(BUILD_ROOT)/libyaul \
[/code]

[b]tool-chains/sh-elf/share/yaul/post.common.mk[/b]
Eliminad el comentario dentro del comando awk (es decir, borrad esta línea):

[strike]# TODO: Allow for titles to be greater than 16 characters \[/strike]

Para compilar los ejemplos, es tan fácil como ir a la carpeta raíz de libyaul y ejecutar:
[code linenumbers=false]
make examples
[/code]

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: 

[align=center] [img]http://www.segasaturno.com/portal/files/images/2584/inkfill2.png[/img][/align]

[align=center][img]http://www.segasaturno.com/portal/files/images/2584/inkfill3.png[/img] [/align]

[b][color=#4E99FF]Conclusiones[/color][/b]

Aquí termina este [b]TOSTÓN[/b] 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!!! ;)


