![]() | |||
PORTING GUIDEIntroductiónEsta guía es sobre la transferencia del software que viene con guionees configure o make a AROS. Esto es verdad para la mayoría del software de fuente abierta del mundo Linux. Se basa en un documento escrito por Johan Samuellson para el AmigaOS4. ¿Qué transferir?
Conseguir el SDK recienteLa manera más fácil de transferir para AROS es desde una caja Linux, porque en general tiene todas las herramientas necesarias. Mira en la Guía de Desarrollo para la información sobre la instalación del SDK. Los fundamentosLo primero que debes hacer es revisar cómo compilar tu proyecto. Si hay un archivo llamado configure en el directorio raíz del archive, eso significa que tendrás que configurarlo para tu plataforma. Mira en la descripción del siguiente capítulo sobre cómo hacer eso. Luego de que el proyecto esté apropiadamente configurado es el momento de hacer rodar al compilador. Empieza a compilar tu proyecto tipeando make. Empero, si no hay un archivo llamado configure, busca uno llamado Makefile. Edítalo para que se ajuste con AROS y compila el proyecto con make. Si todo está compilado y enlazado ya estás listo para probar tu puerto. Un problema muy común es que no encuentre sus archivos de datos, y se cuelgue. Corrige las rutas como se describe en el capítulo corregir-las-rutas, y ejecuta de nuevo. Luego quita la información de depuración de los binarios para hacerlos más pequeños. ¡Listo! Ya tienes el puerto. ¡Ahora cárgalo en http://archives.aros-exec.org y en http://www.aminet.net! Cómo configurarEn Linux, los paquetes que tienen un guión configure por lo general se instalan con tres pasos: ./configure make sudo make install Lo que hace que la configuración de AROS sea más difícil que, por ej. para AmigaOS4 es el hecho que estamos usando un compilador cruzado. Tipea ./configure --help para ver las opciones que están disponibles. Si falla la configuración podemos intentar deshabilitar algunas características. Un ejemplo simple./configure CC=i386-aros-gcc \ --build=local --host=i686-aros --disable-nls --without-x --without-pic --disable-shared Sugerencia Tiene sentido escribir un comando de configure en un archivo de texto. De esta manera podemos fácilmente ejecutarlo de nuevo escribiendo sh build.sh. Pero antes que ejecutemos de nuevo al guión tenemos que hacer rm -f config.cache para volver al estado inicial el proceso de configuración. Aquí está la explicación de las opciones que usamos arriba:
Advertencia No hagas sudo make install porque esto instalará tu aplicación en alguna ruta de Linux como /usr/local. Ejemplo de SDL (instalación manual)El siguiente ejemplo es para Ltris, pero debería ser similar para las otras aplicaciones SDL: ./configure CC=i386-aros-gcc LDFLAGS="-nix" \ --prefix=/PROGDIR \ --build=local --host=i686-aros \ --disable-nls --without-x --without-pic --disable-shared \ --with-sdl-prefix=/usr/local/aros-sdk/i386-aros
Después de una ejecución exitosa del guión configure y de make tenemos que copiar el binario de ltris y los archivos de datos de modo que el binario encuentre a éstos:
ltris
ltris (binary)
share
ltris
gfx
sounds
Ejemplo de SDL (instalación semiautomática)Podemos usar casi las mismas opciones de arriba: ./configure CC=i386-aros-gcc LDFLAGS="-nix" \ --prefix=/PROGDIR --bindir=/PROGDIR \ --build=local --host=i686-aros \ --disable-nls --without-x --without-pic --disable-shared \ --with-sdl-prefix=/usr/local/aros-sdk/i386-aros
No olvides la opción --prefix o sino instalará los archivos de AROS en alguna de las rutas de Linux. Ahora puedes recompilar tu proyecto (make distclean, ejecuta el guión configure, make). Ahora podremos invocar sudo make install. Pero es mejor dar primero los siguientes pasos:
Esto tiene la ventaja que podemos acceder a /PROGDIR sin los derechos de root. Ahora finalmente podemos hacer make install, que instalará el juego en /PROGDIR. Como éste no es un buen lugar tenemos que copiarlo a un lugar en donde AROS pueda alcanzarlo (por ej. cp -r /PROGDIR ~/AROS/games/ltris). Recuerda hacer rm -rf /PROGDIR/* antes de compilar otro proyecto. Errores comunes que pueden ocurrir cuando configuresObtengo errores como target or host i686-aros isn't available.
Lo mismo sucede cuando configure está buscando SDL_ttf, y ahora sabes por qué. Necesitamos especificar algunas bibliotecas más en las que depende SDL_ttf. Necsita -lfreetype y -lz. Dejaré el resto para tí como un ejercicio. Si has agregado las dependencias necesarias al guión configure, y todavía no funciona puede deberse a archivos faltantes en el SDK. Por ej. no están incluidas las bibliotecas SDL. This is not recommended, but if there is no other way... Si todavía no funciona, y está seguro que tienes la biblioteca instalada, prueba con quitar toda la sección donde revisa la biblioteca que falla en el archivo configure. Ahora deberías estar listo para build tu proyecto. Cuando transfieras apps de unix siempre tipea make. Crear un makefile a manoEste makefile se podría usar is el build system es un mess y quieres simplificarlo un poco, alterarlo para que se ajuste a tus necesidades. Lo usual es que solamente necesites modificar un makefile existente, cambia el nombre del compilador de C (de otro modo crearía binarios para Linux) y agrega algunas bibliotecas de enlazado. Aquí está la explicación de lo que significan las banderas.
CC = i386-aros-gcc
RM = rm
STRIP = i386-aros-strip --strip-unneeded --remove-section .comment
CFLAGS = -Wall -O2
LDFLAGS = -nix -lsmpeg -lSDL_gfx -lSDL_net -lSDL_image -lpng -ljpeg -lz -lSDL_mixer \
-lvorbisfile -lvorbis -logg -lSDL_ttf -lfreetype -lz -lsdl -lauto -lpthread -lm
OBJS = a.o b.o c.o
OUTPUT = test.exe
all: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(OUTPUT)
main.o: main.cpp main.h
$(CC) $(CFLAGS) -c main.cpp
strip:
$(STRIP) $(OUTPUT)
clean:
$(RM) -f $(OBJS) $(OUTPUT)
Recuerda que tienes que usar caracteres tabulador antes del comando. Usar el build systemEl build system contiene algunos guiones para configurar los paquetes. La gran ventaja de usar el build system es que puedes transferir fácilmente a diferentes sabores de AROS.
Mira en el archivo $(TOP/config/make.tmpl para una explicación de los argumentos. En $(TOP)/contrib/gnu ahora puedes hallar muchos paquetes GNU. MiscConvertir las rutas unix a rutas AROS¿Cómo convierto las rutas Unix en rutas AROS? Intercambia getenv("HOME") por "/PROGDIR/" Ejemplos:
old: strcpy(path, getenv("HOME"));
new: strcpy(path, "/PROGDIR/");
old: strcpy(home,getenv("HOME"));
new: strcpy(home,"/PROGDIR/");
old: sprintf(rc_dir, "%s/.gngeo/romrc.d", getenv("HOME"));
new: sprintf(rc_dir, "%sgngeo/romrc.d", "/PROGDIR/");
Fíjate que quité "/." en el último ejemplo. Las rutas a los directorios de los datos a menudo se establecen durante el proceso de configure haciendo -DDATADIR=. Si éste es el caso establece a -DDATADIR=/PROGDIR/. También es común que el directorio de los datos se establezca en los makefiles. Ubica DATADIR= y cámbialo a DDATADIR=/PROGDIR/ DefinesLos defines se establecen en general en config.h, si algo está mal configurado, puedes cambiarlo ahí usando #define y #undef. Un ejemplo de define que considera todos los sabores de AmigaOS:
#ifdef __AMIGA__
blah blah blah
#else
blah blah blah
#endif
Un ejemplo de define que sólo considera a AROS:
#ifdef __AROS__
blah blah blah
#else
blah blah blah
#endif
Un ejemplo de define que considera a BeOS y a AROS: #if !defined(__BEOS__) && !defined(__AROS__) Un ejemplo más complejo:
#ifdef GP2X
char *gngeo_dir="save/";
#elif defined __AROS__
char *gngeo_dir="/PROGDIR/save/";
#else
char *gngeo_dir=get_gngeo_dir();
#endif
Algunos paquetes de fuente abierta ya han adoptado a los sistemas operativos de la familia Amiga. Si encuentras algo como #ifdef __AMIGA en el fuente puedes probar agregar el define a las opciones de configuración (por ej. CFLAGS="-nix -D__AMIGA__"). Entender los mensajes de error
Errores comuneswarning: incompatible implicit declaration of built-in function 'exit'; warning: incompatible implicit declaration of built-in function 'abort': solución: #include <stdlib.h> warning: implicit declaration of function 'strlen'; warning: incompatible implicit declaration of built-in function 'strlen': solución: #include <string.h> warning: implicit declaration of function 'memcpy'; warning: incompatible implicit declaration of built-in function 'memcpy': solución: #include <string.h> error: memory.h: No such file or directory: solución: #include <string.h> error: malloc.h: No such file or directory: solución: #include <stdlib.h> warning: incompatible implicit declaration of built-in function 'printf': solución: #include <stdio.h> warning: implicit declaration of function 'MyRemove': solución: #define MyRemove Remove Consejos y trucos¿Cómo hago una búsqueda de cadenas de texto usando GREP? grep -R "I am looking for this" * ¿Cómo hago un archivo DIFF con mis cambios? diff originalfile.c mychangedfile.c >./originalfile.patch
¿Cómo dirigo las advertencias y errores de GCC a un archivo de texto? make 2>warnings.txt |
Copyright © 1995-2008, The AROS Development Team. All rights reserved. Amiga® is a trademark of Amiga Inc. All other trademarks belong to their respective owners. |