14 de Julio 2004

Optimizacion. 2 Parte

2)Parte 2.- Definicion de las reglas (...continuacion...)

Ahora haremos un alto, para que todavia sea mas preciso.
Como bien sabeis, teneis una variables de entorno disponibles para harbour y
que son de gran utilidad a la hora de generar las librerias y ejecutables de
harbour, y que son necesarias para saber que make debe de ejecutar dependiendo
del sistema que tengamos montado, como el compilador de C, etc...

Bien, dicho sistema tambien hara uso de dichas variables de entorno, o en su
defecto, podemos redefinirlas para que contengan el valor que queramos.

Como yo, supongo que muchos de vosotros tambien, tengo varios harbour para
distintos compiladores, entonces el usar el PATH, a veces es un engorro.
La solucion es tan sencilla como definir simplemente estas variables de
entorno:


Rules.make--------------------------------
#Para con Windows , añadido
HB_COMPILER = mingw32
HB_BIN_INSTALL = c:/hargw/harbour/bin
HB_INC_INSTALL = c:/hargw/harbour/include
HB_LIB_INSTALL = c:/hargw/harbour/lib

Al principio de la linea le informo , en este caso especial, que reescriba las
variables de entorno a estos valores, asi no tengo que modificar nada de .bat,
etc... del sistema en cuestion.

[ Umm.. un apunte que se me olvidaba...aqui solamente se van a usar
herramientas GNU, un dia de estos escribire porque. ]

Pasaremos por algo lo 'obvio' y que por deduccion es muy simple, y nos
pararemos en lo mas interesante.


#Opciones genericas del Make ( Generic make options )


ifeq ($(HB_COMPILER),mingw32)
CFLAGS += -Wall `pkg-config --cflags gtk+-2.0` -mms-bitfields -mwindows -I.
else
CFLAGS += -Wall -I.
endif
GT_LIBS=-lgtcgi

Aqui teneis una caracteristica ifeq(), significa que si en la variable
HB_COMPILER esta la cadena mingw32 , CFLAGS sera igual a un valor o a otro.


[ Nota: Dentro de las herramientas GNU que ha sido portadas a otras
plataformas como Windows, donde dice pkg-config, solamente funcionara si
habeis instalado y haceis correr el CygWin y estais en ese entorno.
Ahora bien, si haceis uso simplemente del compilador gcc, mingw32, desde
una consola comun de Windows, dicha cadena debe ser montada como:
$(shell pkg-config --cflags gtk+-2.0) ]

Bien, despues podemos definir el driver GT a usar de harbour, simplemente
donde pone la linea GT_LIBS, podeis definir el driver que querais.


[Nota: Aqui explicare haciendo uso de dos sistemas a la vez ya sea a traves
de Windows o de GNU/Linux]

Las macros que nos interesan, por ser programadores de Harbour, las explicare,
aunque generalmente ESO NO LO TOCAREIS!!

LIBFILES_ += Aqui definiremos las librerias propia de Harbour.
Esto no deberias de tocarlo, excepto si le dan por añadir alguna libreria
que no la tengas definida, definela aqui.

LIBFILES_+=Libreria del sistema que nos hagan falta, por ejemplo
para GNU/Linux debemos de linkar la -lgpm, para soporte del mouse en consola.

Si os fijais muy bien, vereis que hay un += y no un = a secas, eso es muy
importante para no machacar lo que previamente habia definido, asi que
tenerlo en cuenta.

Ahora veremos unas macros que las usaremos en otros makefiles y que finalmente
seran vistas desde aqui, para que veas que son y de donde vienen.


LIBDIR_ = $(LIBDIR) -L$(HB_LIB_INSTALL)
LIBS_= $(LIBS) $(LIBFILES_)

&(LIBDIR) es una macro declarada en el makefile de los directorios, y que nos
permite usarla EXCLUSIVAMENTE en ese makefile para permitir buscar librerias
en otra ruta distinta a la que tenemos originalmente a partir de
HB_LIB_INSTALL.

&(LIBS) es una macro que se compartara exactamente IGUAL a LIBDIR, pero en
este caso sera para librerias en concreto.

No busqueis en Rules.make, que no estan aqui ;-), si no que vienen impuestas
a traves de otros makefiles si estuvisen declaradas.

Despues viene el determinar el tipo de codigo que queremos procesar, y se
lo indicaremos a traves de la macro SOURCE_TYPE en nuestro makefile,
y por defecto cogera prg si no la hemos definido.


NOTA:
Donde pone strip, es una tool de GNU, por lo tanto, debes de tener las
GNU tools instaladas, sino no te funcionara, sirve para quitar simbolos
de debugger a los ficheros objetos
Te lo explico para que no pierdas el tiempo buscando... que parecemos ya a
google con tanto buscar ;-)

Despues vienen por lo que se conoce como reglas implicitas , como por ejemplo,
esta, que la comentare por ser un tanto especial.


%$(EXETYPE):%.o
$(CC) -o$@ $< $(LIBDIR_) $(LIBS_)

Para los que no saben o saben un poco, como yo, del uso del Make, una regla
implicita, es aquella por la cual utiliza los sufijos
(extensiones de los archivos) para determinar que comandos debe ejecutar.


[ Nota: Antes unas nociones basicas sobre variables automaticas.
$<. El nombre del primer prerequisito.
$@. El nombre del archivo del objetivo de la regla. ]

Como nuestro ejecutable va ser posible crearlo tanto en Windows como en
GNU/Linux, el EXETYPE puede ser o .EXE o simplemente nada, pues ya debeis
saber que en GNU/Linux no existe el concepto de extension de archivo, si no
si se puede o no se puede ejecutar.

Como veis , es una mera introduccion al fichero Rules.make, cuyo objetivo
no es explicar cada uno de los comandos, si no un poco su funciomaniento,
para mas adelante ver la importancia de este fichero en las siguientes
definiciones de los Makefiles que nos quedan por ver.


..continuara....

Me gustaria saber vuestra opinion al respecto sobre este tema,
¿ te parece interesante o por el contrario te estas aburriendo...ohhh ?


En la siguiente entrega...
Veremos la practica de todo este pollo,
y la importancia de Rules.make, que ya digo esto practicamente ni lo
tendreis que tocar, y como desde una simple instruccion podemos
compilar, generar librerias y generar la aplicacion en un instante...

Escrito por Rafa Carmona a las 14 de Julio 2004 a las 10:40 AM
Comentarios

Muy bueno Rafa. E interesante. El tener un solo make para todas las plataformas y sencillo de utilizar (una vez bien definida las reglas que amablemente estas definiendo ;-)) )
Espero el proximo capitulo con impaciencia ;-)

Saludos y gracias

Escrito por Rafa R.Gaona a las 15 de Julio 2004 a las 09:55 AM
Escribir un comentario









¿Recordar informacion personal?