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:
- “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