PDA

Ver la versión completa : Instalar app creada por mi en linux (ubuntu) no encuentra los graficos



Aiken
25/05/2008, 15:11
Hola chicos,

Lo primero es que esto no es de GP2X, pero no encuentro un subforo mas apropiado, si algun
moderador considera que debe moverse que me de un toque o lo que sea ;)

Estoy haciendo mi propia aplicacion/juego para el trabajo fin de carrera, la tengo casi terminada, ahora estoy en la fase de empaquetado.

Habia pensado hacer un paquete debian-ubuntu, eso lo tengo mas o menos controlado pero tengo un problema.

Alguien tiene alguna experiencia de en donde esta "recomendado" instalar en debian/ubuntu cada cosa? binario, datos, graficos.

Por los ejemplos que he visto por ahi:
- /usr/games/mijuego (el binario)
- /usr/share/games/mijuego/*.png (los graficos, datos, configs, etc)

Ahora el tema es que mi binario esta "acostumbrado" a coger los graficos "de su propio directorio".

Que me recomendais para que la version de desarrollo tire "de los graficos de su propio directorio" y la version "instalada" tire de /usr/share/games/mijuego/*.png? Habia pensado algo que he visto por ahi que compila con una opcion tipo "--prefix=/usr/share/games" sabeis como funciona eso del prefix y si es la mejor opcion?

Aiken

Puck2099
25/05/2008, 15:17
Yo pondría los gráficos en el propio directorio de tu juego, el /usr/share a mi me parece que está para cosas compartidas por varias aplicaciones (como los gráficos de iconos que usan varios gestores de ventanas), así que no me complicaría y lo pondría con el juego.

juanvvc
25/05/2008, 15:23
Yo en cambio los pondría en /usr/share o /usr/lib porque todo el mundo los pone allí :D Una idea es utilizar defines en tiempo de compilación:

en tu código:



#ifdef DEVELOPMENT
char *datadir="./";
#else
char *datadir="/usr/shared/mijuego";
#endif


Y en un Makefile simple:



dev:
gcc patatá -DDEVELOPMENT mijuego.c patatí

final:
gcc patatá mijuego.c patatí


Si eres más ordenado y usas CFLAGS y esas cosas, compilas la versión de desarrollo con make dev="1" y al principio del Makefile escribirás:



ifdef dev
CFLAGS=-DDEVELOPMENT patatá
else
CFLAGS=patatá
endif

efegea
25/05/2008, 15:40
Yo lo que no entiendo es como hacer para que funcione con los archivos de datos en el sitio donde le de la gana a la distribución. No sé como se hace de forma "genérica"

Por ejemplo una distro usa /usr/share y otra usa /opt/mijuego y alguien quiere instalar el juego en /usr/local/share, aunque supongo que esto será cosa de las autotools y el --prefix

Aiken
25/05/2008, 16:46
Yo en cambio los pondría en /usr/share o /usr/lib porque todo el mundo los pone allí :D Una idea es utilizar defines en tiempo de compilación:


si, tambien he visto algunos que lo ponene en /usr/lib/


Aiken

< - >


Por ejemplo una distro usa /usr/share y otra usa /opt/mijuego y alguien quiere instalar el juego en /usr/local/share, aunque supongo que esto ser&#225; cosa de las autotools y el --prefix

eso estaria guay, pero no se si eso existira lo has visto hacer en alguna aplicacion? yo lo del prefix lo he visto usar para diferentes distros pero yo creo que era porque era para compilarlo para una distro u otra, es decir que usan el --prefix de la misma forma que estamos diciendo nosotros lo del define, es decir para compilarlo de una manera u otra.

una vez compilado ya va fijo, o eso creo,

tambien puede ser que el prefix lo usen en el make install? y quizas lo que hacen es modifican algun archivo donde va la configuracion del binario o algo asi?

Aiken

juanvvc
25/05/2008, 17:45
El --prefix se da como argumento en el configure. As&#237; las autotools generar&#225;n autom&#225;ticamente el Makefile de la manera que te he puesto arriba. Las autotools es un foll&#243;n de narices que nunca he entendido, pero t&#250; ver&#225;s si quieres usarlas :D

Aiken
25/05/2008, 18:57
Al final he decidido que el valor del directorio se le pase como parametro al compilar, es decir que hay en el compilado, como parametro del gcc, algo como :



-DDATADIR=/usr/share/games/mijuego


eso si, menuda movida he tenido para poder "concatenar" ese valor con el nombre del png.

es decir yo queria algo tan facil como fopen(DATADIR+"/logo.png") o algo asi, pero no habia forma.

Por si le sirve a alguien, aqui os dejo como he encontrado por ahi para poder utilizar el valor del define como parte de un string concatenado.



#ifndef DATADIR
#define DATADIR "."
#endif
#define DEFSTRINGIFY(x) #x
#define DEFTOSTRING(x) DEFSTRINGIFY(x)

#define DATAFOLDER(x) DEFTOSTRING(DATADIR)"/"x


y luego en cualquier parte del codigo se puede usar:



IMG_Load(DATAFOLDER("gfx/migrafico.png"));


Lo mismo hay una forma mas sencilla de hacerlo sin hacerlo tan sofisticado pero
esta parece que funciona ;)

PD. Ah se me olvidaba, lo que hacen los defines es que usan "." (el directorio) si no se ha definido nada, o si se ha definido un DATADIR pues buscan las imagenes en el directorio definido.

fijaros que curiosa es esta linea


#define DEFTOSTRING(x) DEFSTRINGIFY(x)

que no hace nada, solo lo renombra, pero si no lo haces asi en "dos pasos" el preprocesador te manda a freir gargaras :D

Bueno, espero que le sirva a alguien :brindis:
Aiken

< - >

El --prefix se da como argumento en el configure. Así las autotools generarán automáticamente el Makefile de la manera que te he puesto arriba. Las autotools es un follón de narices que nunca he entendido, pero tú verás si quieres usarlas :D

ya, estoy usando las autotools porque uso una plantilla de proyecto del KDevelop, y usa automaticamente las autotools, pero he tenido mas de un problema luego cuando he querido modificar algo "a mano", porque no sabia modificarlo en las autotools y a mano me hacia conflicto con las autotool :)

PD. Son como todo lo automatico, mas comodo mientras funciona, pero luego como no funcione arreglarlo o modificarlo te da por el ojete :D

Aiken

juanvvc
25/05/2008, 19:05
es decir yo queria algo tan facil como fopen(DATADIR+"/logo.png") o algo asi, pero no habia forma.

Qu&#237;tale el signo de suma: fopen(DATADIR "/logo.png") :)

Su usas esta soluci&#243;n no te olvides de poner la cadena entre comillas. En la shell tienes que escaparlas:
-DDATADIR=\"/usr/share/games/mijuego\"

En un Makefile no hace falta escaparlas (creo recordar)

Aiken
25/05/2008, 19:17
Quítale el signo de suma: fopen(DATADIR "/logo.png") :)


eso fue lo segundo que pense, pero las comillas (que no tenia DATADIR) me daban por saco. Como buen español, en lugar de ponerle las comillas a DATADIR, lo que hice fue buscar una forma de usar ese valor directamente que no me parecia que fuera que estaba pidiendo algo tan fuera de lo habitual no? :D y al final acabe con eso que os he puesto arriba.

la verdad es que no se que es peor, si esas 3-4 lineas de defines o escapar las comillas, supongo que lo segundo es mejor, pero ya que lo tengo hecho y queda "sofisticado" lo voy a dejar asi :D

Por cierto, hasta hoy no habia descubierto esa "concatenacion" de C/C++ digo la de fopen(DATADIR "/logo.png"), es un poco extraña no? de donde viene de C# o C++? o es el preprocesador?

Aiken

juanvvc
25/05/2008, 19:49
La concatenaci&#243;n es de C, y es la forma de concatenar cadenas largas est&#225;ticas:



mensaje=
"hola mundo\n"
"azul y verde"; // correcto
mensaje="hola" "mundo"; // correcto
mensaje1="hola"; mensaje2="mundo"; mensaje=mensaje1 mensje2; //incorrecto