Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

make y makefile

MAKE

Para manejar varias librerias y varios .c, .h y compilarlo
Herramienta para usar con los archivos en .c, .h.

Con make puedes crear unos objetivos y dependencias y las acciones que tengas que hacer para resolver estos objetivos y dependencas.

¿como se lo indicamos? Con el archivo makefile, que tiene que estar en el directorio donde se ejecuta make y será donde esta nuestro programa fuente. Indicaremos en makefile, como se va a compilar la librería y el programa.
Tendremos un makefile, para cada proyecto de programa.

Nos vamos al geany, y creamos un fichero nuevo y lo makefile (sin extensión).

Empezamos poniendo objetivos:
  1. “all:” “todo”, es el que se hace por defecto cuando llamas a make.
Cada objetivo tiene un nombre y dos puntos, y tendra una serie de dependencias, que tendra ficheros o objetivos.
Si la dependencia, son ficheros, solamente comprueba la fecha y hora de esos ficheros. Si han cambiado desde que la utltima vez que se ha ejecutado el make, sabe que tiene que hacer ese objetivo
Si la dependiecia es un objetivo, sabe que tiene que resolver el objetivo indicado, antes que el objetivo actual.

Empleo: para crear el pru_esta, depende de crear la librería y de si ha cambio el pru.c.

Tendre que crear un objetivo para comprobar la librería. El pru.c dependera del programador si lo ha cambiado o no.

all: dependencias
<TAB>acciones

Vamos a realizar el makefile
all: //va a crear las librerias estaticas y dinamicas y programas pru_esta y pru_dina

all: lidmini.a libmini.so pru.c

//si estos 3 archivos estan, make debe de hacer: el pru_esta y el pru_dina
all: libmini.a libmini.so pru.c
<tab>gcc -Wall -I. -L. -o pru_esta pru.c -static -lmini
<tab>gcc -Wall -I. -L. -o pru_dina pru.c -lmin // lo coje el dinamico por defecto

libmini.a: mini.c //objetivo para crear el lidmini.a
<tab>gcc -Wall -I. -L. -o mini.o mini.c // creamos el mini.o
<tab>ar -rv libmini.a mini.o // con mini.o creamos libmini.a

libmini.so: mini.c //depende de mini.c
<tab>gcc -Wall -I. -L. -c -o mini.o mini.c //creamos mini.o
<tab>ld -o libmini.so mini.o -shared //creamos libmini.so

GFLAGS: Para no tener que escribir cosas que se repiten, utilizamos una variable llmada CFLAGS donde meteremos esa secuencia que se repite y añadiremos

-o3: este argumento nos va a optimizar el rendimiento del programa.

Definios al prinicio del fichero makefile:
CFLAGS=-Wall -I. -L. -c -o3
y la definiremos al principio del makefile. Cuando lo utilicemos pondriamos $(CFLAGS) en el lugar la secuencia repetida.

Podemos incluir un objetivo que se llame “clean”: que deshaga todo lo que ha hecho make. Lo pondremos al final del makefile para que sea mas entendible.

clean
rm pru_esta pru_dina libmini.a libmini.so mini.o // borra todo

Otra manera mas completa seria hacer un objetivo por cada fichero
all: lib programa

lib: libmini.a libmini.so

programa: pru_esta pru_dina

pru_esta: libmini.a pru.c
gcc $(CFLAGS) -o pru_esta pru.c -static -lmini

pru_esta: libmini.so pru.c
gcc $(CFLAGS) -o pru_dina pru.c -lmini

libmini.a: mini.c
gcc $(CFLAGS) -c -o mini.o mini.c
ar -rv libmini.a mini.o

libmini.so: mini.c
gcc $(CFLAGS) -c -o mini.o mini.c
ld -o libmini.so mini.o -shared

clear:
rm pru.esta pru_dina libmini.a libmini.so mini.o

install: all // depende de que todo haya salido bien
@test -d “rm $(HOME)/lib” || mkdir $(HOME)/lib
@test -d “rm $(HOME)/bin” || mkdir $(HOME)/bin
@test -d “rm $(HOME)/include” || mkdir $(HOME)/include //compruebo que el directorio existe y si no existe lo vamos creando de uno en uno

cp libmini.a $(HOME)/lib/libmini.a
cp libmini.so $(HOME)/lib/libmini.so
cp pru_dina $(HOME)/lib/pru_dina
cp pru_esta $(HOME)/lib/pru_esta
cp mini.h $(HOME)/include/mini.h

uninstall:
rm $(HOME)/lib/libmini.a
rm $(HOME)/lib/libmini.so
rm $(HOME)/lib/pru_dina
rm $(HOME)/lib/pru_esa
rm $(HOME)/include/mini.h
rmdir $(HOME)/bin $/HOME)/lib $(HOME)/include

Nota:
Para poner comentario en los archivos makefile, se usa una linea que empiece con el simbolo #
# comentario

Todos los comandos del sistema se pueden ejecutar en el makefile.
Si pones @ delante de una linea, la hace pero no te la enseña. Si no la pones te enseña la linea.

Podemos usar @echo “hola”, nos mostrara “hola”, si ponemos echo “hola”, ponemos echo “hola”

No hay comentarios:

Publicar un comentario