La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

1 Ejemplos de Makefiles Álvaro Navarro, Julián Nora, Luis M. Vaquero Octubre 2009 3º Informática de Sistemas Ampliación de Sistemas Operativos.

Presentaciones similares


Presentación del tema: "1 Ejemplos de Makefiles Álvaro Navarro, Julián Nora, Luis M. Vaquero Octubre 2009 3º Informática de Sistemas Ampliación de Sistemas Operativos."— Transcripción de la presentación:

1 1 Ejemplos de Makefiles Álvaro Navarro, Julián Nora, Luis M. Vaquero Octubre 2009 3º Informática de Sistemas Ampliación de Sistemas Operativos

2 2 ¿Qué es un makefile? Los Makefiles son ficheros empleados por un programa, make, para automatizar tareas A medida que los programas crecen en complejidad y tamaño, su construcción se vuelve más compleja: $ gcc -I./poker-eval/include -O3 -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -ffast-math -static ByteArray.c queue.c access.c message.c bot.c util.c read solution.c hand strength.c util game def.c hash.c translate solution.c make bucket game.c new poker.c sequence form.c tableau.c avl tree.c sequence form solution.c -L../game theory/poker-eval/lib -lpoker -lm -o psopti Los Makefiles evitan los errores que pueden surgir y facilitan que otros compilen un código cuyas particularidades desconocen.

3 3 Creación de makefiles El fichero debe llamarse siempre Makefile’ o ’makefile’ o si se quiere otro nombre hay que emplear ’make -f filename’ En el makefile habrá una serie de reglas con el siguiente formato: target... : pre-requisitos... comando... Cada regla especifica los pre-requisitos necesarios para ejecutar los comandos IMPORTANTE: las líneas de comandos comienzan por un carácter de tabulador Recordad que los pre-requisitos pueden ser a su vez otros targets Make admite comentarios precedidos de “#” Con “\” se puede continuar una línea del make en la siguiente, mejorando la legibilidad

4 4 Uso de makefiles make hacen que se compruebe si los pre-requisitos están actualizados. Si éstos son más recientes que el target, entonces se ejecutan los comandos. make sin target hace que se busque el primer target del fichero. Los fallos típicos con make tienen que ver con: que haya un pre-requisito que no encuentra ni sabe cómo crear que alguno de los comandos del target devuelva un error

5 5 Definición de Variables En makefiles, las variables evitan errores por tener un mismo elemento duplicado en varias ubicaciones. OBJ = hola.o # declaración de variable OBJ $(OBJ) # uso de la variable Algunas variables típicamente empleadas: CC – nombre del compilador C que se está usando CFLAGS – opciones que se pasan al compilador LIBS – librerías que se están enlazando DEFS - defines (como -DMEMWATCH -DMW STDIO)‏

6 6 Queremos construir un programa, hola.c #include “stdio.h” #include ”memwatch.h” int main(){ printf("Hola mundo"); return 0 } Se compilaría con: gcc -Wall -ansi -DMEMWATCH -DMW STDIO hola.c -o hola CC = gcc DEFS = -DMEMWATCH -DMW STDIO CFLAGS = -Wall -ansi $(DEFS)‏ OBJECTS = hola.c memwatch.o hola: $(OBJECTS)‏ $(CC) $(CFLAGS) $(OBJECTS) -o hola Ejemplo 1

7 7 foo: foo.o helper.o gcc -Wall foo.o helper.o -o foo bar: bar.o helper.o gcc -Wall bar.o helper.o -o bar bar.o: bar.c gcc bar.c -c -o bar foo.o: foo.c foo.h gcc -ansi -Wall -c foo.c -o foo.o Ejemplo 2 CC= gcc LD= gcc CC_FLAGS = -ansi -Wall -c LD_FLAGS = -Wall all: foo bar foo: foo.o helper.o $(LD) $(LD_FLAGS) foo.o helper.o -o foo bar: bar.o helper.o $(LD) $(LD_FLAGS) bar.o helper.o -o bar bar.o: bar.c $(CC) $(CC_FLAGS) bar.c foo.o: foo.c foo.h $(CC) $(CC_FLAGS) foo.c clean: rm -f *.o foo bar

8 8 gcc main.c hello.c factorial.c -o hello En un makefile sería: all: gcc main.c hello.c factorial.c -o hello Añadiendo dependencias, quedaría: all: hello hello: main.o factorial.o hello.o gcc main.o factorial.o hello.o -o hello main.o: main.c gcc -c main.c factorial.o: factorial.c gcc -c factorial.c hello.o: hello.c gcc -c hello.c clean: rm -rf *o hello Ejemplo 3

9 9 Empleando variables: CC=gcc CFLAGS=-c -Wall all: hello hello: main.o factorial.o hello.o $(CC) main.o factorial.o hello.o -o hello main.o: main.c $(CC) $(CFLAGS) main.c factorial.o: factorial.c $(CC) $(CFLAGS) factorial.c hello.o: hello.c $(CC) $(CFLAGS) hello.c clean: rm -rf *o hello Ejemplo 4

10 10 Empleando variables: CC=gcc CFLAGS=-c -Wall LDFLAGS= SOURCES=main.c hello.c factorial.c OBJECTS=%.o EXECUTABLE=hello all: $(EXECUTABLE)‏ $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ %.o: $(SOURCES)‏ $(CC) $(CFLAGS) $^ -o $@ Ejemplo 5

11 11 Ejemplo 6 $@Es el objetivo de la regla en la que aparece. $^En la lista de requisitos de la regla en que aparece. $?Es la lista de requisitos más recientes que el objetivo. $<Es el primer requisito de la regla. Veamos como aplicarlos: CC=gcc CFLAGS=-Wall -g RM=rm hola: hola.o auxhola.o $(CC) -o $@ $^ hola.o: hola.c $(CC) $(CFLAGS) -c -o $@ $^ auxhola.o: auxhola.c $(CC) $(CFLAGS) -c -o $@ $^ clean: $(RM) *.o hola

12 12 CC=gcc CFLAGS=-I. DEPS = holafunc.h %.o: %.c $(DEPS)‏ $(CC) -c -o $@ $< $(CFLAGS)‏ holamake: holamake.o holafunc.o $(CC) -o holamake holamake.o holafunc.o $(CFLAGS)‏ Ejemplo 7


Descargar ppt "1 Ejemplos de Makefiles Álvaro Navarro, Julián Nora, Luis M. Vaquero Octubre 2009 3º Informática de Sistemas Ampliación de Sistemas Operativos."

Presentaciones similares


Anuncios Google