PDA

Ver la versión completa : Tutorial: SDL - Semi-Ameba MAKEFILE HowTo



D_Skywalk
16/09/2005, 10:04
Bien lo primero que os preguntareis seguramente es:

¿Para que sirve un Makefile?

Un Makefile contiene todos los pasos para generar (compilar) nuestro programa. Un programa se compone basicamente de librerias (que son un conjunto de utilidades que facilitan nuestra labor), nuestros ficheros del programa y de como debe "montar" nuestros ficheros (optimizaciones).

Quiero preparar mi proyecto ¿que ficheros necesito para compilarlo?

Lo mejor que podemos hacer es tomar como base alguno de los ejemplos que tenemos en el directorio de GP32, por ejemplo: FONTS.

Lo primero sera crearnos un directorio para nuestro proyecto, que nosotros aqui llamaremos EJEMPLO. Luego de FONTS vamos a coger prestado: "Makefile.win32", "Makefile", "crt0x_gp32.s" y "arm-gp32bin.x".

Ya lo siguiente que necesitariamos seria que codearas un poco y lo guardaras con: "ejemplo.c" (o con el nombre que tu quieras).

¿que necesito conocer para compilar un programa sin problemas?

Bien una vez tenemos nuestro programa codeado y el directorio preparado, necesitamos configurar nuestros MAKEFILEs para que compilen nuestro programa; ya sea para GP32 o para testearlo en Windows.

Tenemos: "Makefile" que son las ordenes/instrucciones necesarias para GP32 y "Makefile.win32" que seria para generar la version de Win32 (windows).

¿Como creo mi Makefile propio?

Bien para compilar cualquier programa basico solo necesitas modificar 2 secciones de cualquiera de estos dos MAKEFILEs:

Para el Makefile.Win32:

TARGET = fonts.exe

[...]

.CFILES = fonts.c

En CFILES debeis poner todos los ficheros que componen vuestro programa, en el nuestro seria solo "ejemplo.c" y en TARGET sera el nombre final que tendra el programa.

Quedando algo como:

TARGET = ejemplo.exe

[...]

.CFILES = ejemplo.c

Para GP32 tenemos alguna distincion pero que es practicamente igual, solo que quizas esta menos comodo...

Para el Makefile (GP32):


MAPFILE = fonts.map
TARGET_ELF = fonts.elf
TARGET_BIN = fonts.gxb
TARGET_FXE = fonts.fxe

[...]

.CFILES = fonts.c

De aqui tenemos que cambiar el nombre de todos los TARGETs de arriba, substituyendo "font" por nuestro nombre, nosotros como de costumbre seguiremos con "ejemplo", lo demas es como siempre en CFILES poneis todos los ".c" que componen vuestro programa :)

¿Como compilo para GP32 o para Win32?

Se compila para GP32, usando "make" y "make clean" para limpiar/borrar todo.
Se compila para Win32, usando "make -f Makefile.Win32" y "make -f Makefile.Win32 clean", para limpiar/borrar todo.

TODO: Como usar librerias?

Un Saludo y espero que os resuelva algunas dudas, y podais empezar un proyecto básico.

newage
16/09/2005, 10:25
¿Que te parece mi makefile básico? :D

# Base Makefile by newage

# Para compilar poner la direccion propia del devKit de arm
DEVKITARM = ...
# Directorios de librerias estaticas ---------------------
DIRKKC = ./kkcore/
# Directorio de archivos objeto ---------------------------
OBJDIR = ./.obj/
OBJDIRKKC = $(DIRKKC).obj/

# Herramientas --------------------------------------------
ARM_ASM = $(DEVKITARM)bin/arm-elf-as
#----------------------------------------------------------
ARM_CC = $(DEVKITARM)bin/arm-elf-gcc
ARM_CPP = $(DEVKITARM)bin/arm-elf-g++
ARM_LD = $(DEVKITARM)bin/arm-elf-ld # No es necesario
ARM_AR = $(DEVKITARM)bin/arm-elf-ar
#----------------------------------------------------------
CC = gcc
CPP = g++
LD = ld # El gcc ya nos ahorra el trabajo de llamar a ld
AR = ar
#----------------------------------------------------------
EXTRA_CC = -ansi -Wall `sdl-config --cflags` \
-I"$(DIRKKC)include" -DPC -g #gdb
EXTRA_CPP = -ansi -Wall `sdl-config --cflags` \

-I"$(DIRKKC)include" -DPC -g #gdb
EXTRA_LD = -L"/usr/lib" -L"$(DIRKKC)" \
-lSDL -lSDL_image
#----------------------------------------------------------
EXTRA_CPP_N = -ansi -I"$(DIRKKC)include"
#----------------------------------------------------------
LD_STATIC = -lkkcore
EXTRA_AR = rcs
#-----------------------------------------------------------
VISOR = less
#-----------------------------------------------------------

default: all

#-----------------------------------------------------------

# Crea el directorio para los archivos objeto
$(OBJDIR):
mkdir $(OBJDIR)

$(OBJDIRKKC):
mkdir $(OBJDIRKKC)

#-----------------------------------------------------------

allarm: $(OBJDIR) $(OBJDIRKKC)
@# Aun no disponible

#----------------------------------------------------------------------

all: $(OBJDIR) $(OBJDIRKKC)
# Compilamos el codigo en CPP
@# ----------------------------------------------------------------
$(CPP) -c $(DIRKKC)tinyxml.cpp -o $(OBJDIRKKC)imagen.o $(EXTRA_CPP_N)
$(CPP) -c $(DIRKKC)tinyxmlparser.cpp -o $(OBJDIRKKC)imagen.o $(EXTRA_CPP_N)
$(CPP) -c $(DIRKKC)tinyxmlerror.cpp -o $(OBJDIRKKC)tinyxmlerror.o $(EXTRA_CPP_N)
$(CPP) -c $(DIRKKC)tinystr.cpp -o $(OBJDIRKKC)tinystr.o $(EXTRA_CPP_N)
@echo ! Compilado tinyxml
@echo
@# ----------------------------------------------------------------
$(CPP) -c $(DIRKKC)imagen.cpp -o $(OBJDIRKKC)imagen.o $(EXTRA_CPP)
$(CPP) -c $(DIRKKC)spripar.cpp -o $(OBJDIRKKC)spripar.o $(EXTRA_CPP)
$(CPP) -c $(DIRKKC)gamerunner.cpp -o $(OBJDIRKKC)gamerunner.o $(EXTRA_CPP)
@echo ! Compilada librería core de atlantis
@echo
@# ----------------------------------------------------------------
$(CPP) -c main.cpp -o $(OBJDIR)main.o $(EXTRA_CPP)
@echo ! Compilado atlantis
# Hacemos Link de todo
@echo
@echo ! Haciendo link de todos los objetos
$(AR) $(EXTRA_AR) $(DIRKKC)libkkcore.a $(OBJDIRKKC)*.o
$(CC) -o higo $(EXTRA_LD) $(OBJDIR)*.o $(LD_STATIC)
@echo
@echo ! Programa construido satisfactoriamente
@echo ! Pruebe: make gdb. Para depurar con insight

#----------------------------------------------------------------------

run: higo
# Ejecutamos el programa
@xterm -e ./higo

#----------------------------------------------------------

gdb: higo
# Ejecutamos el programa
@insight higo

#----------------------------------------------------------

clean:
rm $(OBJDIR)*.o
rm $(OBJDIRKKC)*.o

#----------------------------------------------------------

anibarro
16/09/2005, 10:47
¿Que te parece mi makefile básico? :D
Un poco cutre la parte de meter los nombres de los ficheros en todas las funciones en vez de definir un .CPPFILES o algo asi XDDD

newage
16/09/2005, 10:51
Un poco cutre la parte de meter los nombres de los ficheros en todas las funciones en vez de definir un .CPPFILES o algo asi XDDDhey!! yo soy un gran programador, rudimentario eso sí :D. Me gusta poner las cosas claras en el makefile, además así el make tiene menos tranajo que hacer para interpretarlo :D

Me voy a empezar a currar un puzle isométrico, por ahora me toca hacer una clase de sprites y control de xml para los niveles. Hasta que no tenga GP2X me tengo que conformar con hacerlo en Linux :D mi querido linux

D_Skywalk
16/09/2005, 11:20
Dios mio, con ese makefile me vas a asustar a la gente, con lo facil que es el que llevan los ejemplos de GP32 xD

Pues eso, que no me asustes a los chavales :p

Un Saludo ;)

^MiSaTo^
16/09/2005, 11:48
D_Skywalk, muchas gracias tío, como te lo curras!!!
A ver si me pongo a seguir con otro jueguillo que estoy haciendo, después de exámenes. Y este tuto me va a venir muy bien porque queria hacerme un makefile pero no sabia ni como ni na de na!
Un besazo!

Wonder Boy
16/09/2005, 12:10
Desde luego Sky hijo mío, yo no sé de donde sacas tiempo para hacer tutoriales tan tan trabajaos... Sobervio y muy práctico tío :-)

Un Saludo, cuanto tiempo sin charlar eh tio,
Venga cuídate y a disfrutar con los proyectos personales :-)

Gammenon
16/09/2005, 13:18
Newage, a ti te van los programas en C++ usando las SDL en la GP32? Yo he conseguido crear el fxe y se ejecuta, pero no me pinta nada :( Y no hago ni new ni nada, solo llamadas minimas a las SDL para pintar una imagen en pantalla (y si, he comprobado hasta la saciedad los paths de los ficheros de las imagenes y estan bien).

newage
16/09/2005, 13:29
Newage, a ti te van los programas en C++ usando las SDL en la GP32? Yo he conseguido crear el fxe y se ejecuta, pero no me pinta nada :( Y no hago ni new ni nada, solo llamadas minimas a las SDL para pintar una imagen en pantalla (y si, he comprobado hasta la saciedad los paths de los ficheros de las imagenes y estan bien).NO, yo no tengo la GP32 lo esoty haciendo en linux para luego pasarlo a la GP2X y he previsto el paso de CPP a C. Ya que las clsase son solo para empaquetar hi herencias ni nada complicado. Porque supongo que luego tocará pasrlo a C, pero es la costumbre

The Overcore
16/09/2005, 14:19
Estupenda la guia!!!!

gracias D_skywalk

Gammenon
16/09/2005, 14:33
*****, pues vaya v_v

D_Skywalk
16/09/2005, 15:40
*****, pues vaya v_v

Yo ahora mismo tengo el mismo problema que tu Gammenon, pero creo que es por el momento en el que hago flip, o de cuando hago el clearscreen... la verdad es que aun no se donde tengo la gamba ;)

Gracias a todos, la verdad que me pongo a hacerlos cuando no hay mucho que hacer en el curro, un saludo a esa misato-wapa y gracias a to2 ;D

Un Saludo

Gammenon
16/09/2005, 16:33
Cuando se me ejecuto el fxe en C++ y no me aparecio nada tambien pense eso. Pero probe el fillrect y funciona, por lo que a en mi caso no es el flip, creo yo.
A ver si alguien descubre como puñetas se puede hacer algo en C++, que usar C a palo seco se me hace muy duro a mi :shock:

Eskema
16/09/2005, 19:31
Tal vez sea una limitacion del port sdl a gp32, pq si lo haces para win o linux puedes usar c++ sin ningun problema

Gammenon
16/09/2005, 20:11
En efecto, en windows (no tengo linux, lo admito! XD) me va perfectamente, y no me gustaria usar C++ y hacer un jueguillo pensando para la GP2X y luego que no haya forma de que rule...
En fin, ya veremos, que no tengo nada de prisa :)

TRaFuGa
02/10/2005, 02:39
Yo tengo el mismo problema que the overcore con las SDL_static, pero con este tuto no me he enterao de na :S se que para mi proyecto debo cambiar el fonts.exe y el fonts.c por el nombre de mis archivos, pero lo ke yo intento es compilar el FONTS para win, y me da error con las SDL_static y no se ke hacer, alguien me ayuda^???