Makefile: Contenidopedmume/asignaturas/2005/LAO/ficheros/Makefile… · make se utiliza desarrollo...
Transcript of Makefile: Contenidopedmume/asignaturas/2005/LAO/ficheros/Makefile… · make se utiliza desarrollo...
Makefile: Contenido
● Introducción
● El concepto general
● Dependencias
● Estructura del Makefile y reglas
1
● Variables
● Condiciones
● Reglas implícitas
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Introducción: MAKE
● make se utiliza desarrollo proyectos con gran número archivos interdependientes.
● Utiliza reglas definidas en un archivo llamado makefile o Makefile.
● Con reglas puede construir el archivo destino
2
● Con reglas puede construir el archivo destino especificado por el usuario, a partir cierto número archivos fuentes.
$> make –h Ayuda sobre make
$> make –n Comandos ejecutaría make
$> make –f archivo Reglas en fichero archivo y no en makefile o Makefile
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Introducción: MAKE
● La herramienta make da soporte al desarrollo de programas
● Típicamente, sólo se cambia una pequeña cantidad de datos cuando se llama al compilador
● La herramienta make tiene en cuenta qué
3
● La herramienta make tiene en cuenta qué porciones del programa entero se han cambiado
● Make sólo compila esas partes
● Make tiene un potente grafo de dependencias que se deriva de reglas
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
El concepto general
.c
.h.s .o a.out
Compiler
Assembler Linker Executable program
Compiler
4
.c
.h.s .o a.out
Compiler
Assembler Linker Executable program
.c.s .o
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Separación
.c
.h.s .o a.out
Compiler
Assembler Linker Executable program
.c.s .o
Primero
Segundo
5
● Se necesitan dependencias― “.h” hace falta tanto para el primer como para el segundo
fichero.c
.c
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Dependencias en el fichero MAKEFILE
project
gcc –c data.c
gcc –c io.c
gcc –c main.c
gcc –o project data.o main.o io.o
6
.o .o .o
.c .h .c .h .c
Main.cData.c IO.cData.h IO.h
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Dependencias en el fichero MAKEFILE
project
## First example of a Makefile#
project: data.o main.o io.o gcc data.o main.o io.o –o project
data.o: data.c data.hgcc –c data.c
main.o: data.h io.h main.ccc –c main.c
7
.o .o .o
.c .h .c .h .c
Main.cData.c IO.cData.h IO.h
io.o: io.h io.cgcc –c io.c
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Dependencia: Edición de data.c
.o .o .o
project
project: data.o main.o io.o gcc data.o main.o io.o –o project
data.o: data.c data.hgcc –c data.c
main.o: data.h io.h main.ccc –c main.c
io.o: io.h io.cgcc –c io.c
8
.c .h .c .h .c
Main.cData.c IO.cData.h IO.h
Edit
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Reglas
Target(s) Separador (:) Dependencias
main.o : main.c define.h$(cc) –c main.c
9
Comandos(s) Shell
$(cc) –c main.c
Símbolo tabulador
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Ejemplo
10Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Ejemplo# Makefile para la aplicación de cálculo del tiempo viaje
travel_time: travel_time.ogcc -o travel_time travel_time.o
create_table: create_table.ogcc -o create_table create_table.o
dist_table.dat: cities.txt
11
dist_table.dat: cities.txtcreate_table cities.txt
travel_time.o: travel_time.c scr_io.h finput.hgcc -c travel_time.c
create_table.o: create_table.c scr_io.h finput.h foutput.hgcc -c create_table.c
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Destinos simbólicos
> make create_table> make travel_time> make dist_table.dat
Utilizando makefile, podemos crear nuestra aplicación mediante las siguientes llamadas a make:
12
> make dist_table.dat
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Destinos simbólicosPodemos crear un destino simbólico para construir toda la aplicación con una sola llamada a make.
all: travel_time create_table dist_table.dat
travel_time: travel_time.ogcc -o travel_time travel_time.o
create_table: create_table.ogcc -o create_table create_table.o
13
gcc -o create_table create_table.o
dist_table.dat: cities.txtcreate_table cities.txt
travel_time.o: travel_time.c scr_io.h finput.hgcc -c travel_time.c
create_table.o: create_table.c scr_io.h finput.h foutput.hgcc -c create_table.c
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros
Permiten reducir el tamaño del Makefile.
Se inicializan mediante NOMBRE=VALOR.
Se accede a su valor mediante $(NOMBRE)
Se suelen escribir, por convención en mayúsculas.
14
Se suelen escribir, por convención en mayúsculas.
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros
DATA = dist_table.datall: travel_time create_table $(DATA)
travel_time: travel_time.ogcc -o travel_time travel_time.o
create_table: create_table.ogcc -o create_table create_table.o
15
gcc -o create_table create_table.otravel_time.o: travel_time.c scr_io.h finput.h
gcc -c travel_time.ccreate_table.o: create_table.c scr_io.h finput.h foutput.h
gcc -c create_table.c
$(DATA): cities.txtcreate_table cities.txt
clean:rm *.o
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
MacrosPROG1 = travel_timePROG2 = create_table
all: $(PROG1) $(PROG2) $(DATA)
$(PROG1): $(PROG1).ogcc -o $(PROG1) $(PROG1).o
$(PROG2): $(PROG2).ogcc -o $(PROG2) $(PROG2).o
16
gcc -o $(PROG2) $(PROG2).o$(PROG1).o: $(PROG1).c scr_io.h finput.h
gcc -c $(PROG1).c$(PROG2).o: $(PROG2).c scr_io.h finput.h foutput.h
gcc -c $(PROG2).c$(DATA): cities.txt
$(PROG2) cities.txt
clean:rm *.o
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros - Sustitución
PROG1 = travel_time.cPROG2 = create_table.c
all: $(PROG1:.c= ) $(PROG2:.c= ) dist_table.dat
$(PROG1:.c= ): $(PROG1:.c=.o)gcc -o $(PROG1:.c= ) $(PROG1:.c=.o )
$(PROG2:.c= ): $(PROG2:.c=.o)
17
gcc $(PROG2:.c= ) $(PROG2:.c=.o )
$(PROG1:.c=.o): $(PROG1) scr_io.h finput.hgcc -c $(PROG1)
$(PROG2:.c=.o): $(PROG2) scr_io.h finput.h foutput.hgcc -c $(PROG2)
dist_table.dat: cities.txt$(PROG2:.c= ) cities.txt
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros predefinidas
● $(CC)― Devuelve el nombre del compilador de C.
● $(CFLAGS)― Opciones del compilador de C
● $@― Nombre del destino de la regla actual.
● $?lista con los archivos más nuevos que el destino, en la lista de
18
― lista con los archivos más nuevos que el destino, en la lista de dependencias de la regla actual
● $<― archivo en la lista de dependencias compuesta de un solo archivo en la
regla actual, que es el primero de ellos
● $^― lista con todos los archivos en la lista de dependencias de la regla actual
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros predefinidas
$^=main.c defs1.h lib/lib1.h lib/lib2.h$@=main.o
./main.o : main.c defs1.h lib/lib1.h lib/lib2.h
19
$<=main.c $?=const.h
./main.o : main.c defs1.h lib/lib1.h lib/lib2.h
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros PredefinidasPROG1 = travel_timePROG2 = create_tableINCLUDE1 = scr_io.h finput.hINCLUDE2 = foutput.hDATA = dist_table.datCITIES = cities.txt
all: $(PROG1) $(PROG2) $(DATA)
$(PROG1): $(PROG1).o
20
$(PROG1): $(PROG1).o$(CC) -o $@ $^
$(PROG2): $(PROG2).o$(CC) -o $@ $^
$(PROG1).o: $(PROG1).c $(INCLUDE1)$(CC) -c $(PROG1).c
$(PROG2).o: $(PROG2).c $(INCLUDE1) $(INCLUDE2)$(CC) -c $(PROG2).c
$(DATA): $(CITIES)$(PROG2) $^
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Reglas implícitas● Muchas reglas en makefile muy similares
● Se utilizan para construir destinos sin incluir una regla específica para ellos.
● Funcionamiento:
Si no se define regla específica para destino, se utliiza una regla implícita (primero usuario o sino predefinidas)
21
Cuando no indicamos regla explícita para construir .o, make intenta construirlo a partir archivo mismo nombre .c
$(CC) –c $(CPFLAGS) $(CFLAGS)
Cuando no indicamos regla explícita para construir ejecutable, make intenta construirlo a partir archivo mismo nombre .o
$(CC) $(LDFFLAGS) $(LOADLIBS)
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Condiciones
main.o : main.c defs.h
CC=gccLIB=-lgnu
Condición
ifeq ($(cc),gcc)
TRUE$(cc) –o main.c $(LIB)
22
End
endif
else
TRUE$(cc) –o main.c $(LIB)
FALSE $(cc) –o main.c $(LIB)
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Generación del grafo de dependencias
● Un target en el Makefile es un fichero que usualmente es― creado o
― actualizado
target : ficheros fuente(s)command (debe estar precedido por un tabulador)
23
― actualizado
cuando cualquiera de sus ficheros dependencia (ficheros fuente) se modifiquen
El(los) comando(s)s dado(s) en la(s) línea(s) siguiente(s) (que deben estar precedidas de un carácter tabulador) se ejecutan para crear o actualizar el fichero target
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Estructura de un Makefile
main.o : main.c define.h
CC = /usr/bin/gccOBJECTS = main.o library.oDeclaración de variables
program : main.o library.o$(CC) –c main.o library.o
Reglas explícitas
library.o : library.cReglas implícitas
24
main.o : main.c define.h$(CC) –c main.cecho "main.o compiling"
clean :
rm –rf $(OBJECTS ).PHONY : cleanTargets Built-in Especiales
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Llamada al Makefile
● Crea un makefile en tu directorio― El nombre puede ser: "Makefile " o "makefile "
― Puedes llamarlo con: "make"
― Si el nombre es diferente: make –f your_makefile_name
25Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Ejemplo
● Llamada a make (del primer ejemplo)varpa:~/Test/Makefile_Dir> make
gcc -c data.c
cc -c main.c
gcc -c io.c
gcc data.o main.o io.o -o project
varpa:~/Test/Makefile_Dir>
26
varpa:~/Test/Makefile_Dir>
● make comprueba primero los ficheros fuente e intenta crear o actualizar los ficheros objeto
● Por lo tanto data.o, main.o y io.o se crean antes que el fichero target project
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Targets predefinidos
● .PHONY : cleandeclara que "clean" no es un fichero
● .DEFAULTlos comandos en DEFAULT se ejecutarán para todos los targets si no tienen sus propias reglas y
27
todos los targets si no tienen sus propias reglas y si no están definidos como targets
● .SILENTSi se especifican prerrequisitos para .SILENT, entonces make no imprimirá los comandos para rehacer esos ficheros concretos antes de ejecutarlos
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Sustitución de variables
<var2> := $(<var1>:<pattern>=<replace>)
Ex. sources := a.c b.c c.cobjects := $(sources:.c=.o) objects = a.o b.o c.o
28Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Macros para reducir Makefiles
OBJECTS = data.o main.o io.o
project1: $( OBJECTS) cc $( OBJECTS) -o project1
data.o: data.c data.h cc - c data.c
29
cc - c data.c
main.o: data.h io.h main.c cc -c main.c
io.o: io.h io.c cc -c io.c
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Reglas implícitas
file.suffix1 : file.suffix2
file.o : file.c $(CC) –c $(CPPFLAGS) $(CFLAGS)
file.o : file.cc $(CXX) –c $(CPPFLAGS) $(CXXFLAGS)
Regla Comando
30
file.o : file.cc $(CXX) –c $(CPPFLAGS) $(CXXFLAGS)
file.o : file.p $(PC) –c $(PFLAGS)
file : file.o $(CC) $(LDFLAGS) file.o $(LOADLIBES)
file.dvi : file.tex $(TEX)
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M
Más reducciones de Makefile
OBJECTS = data.o main.o io.o
CC=/usr/bin/gcc
project: $(OBJECTS)
$( CC) $(OBJECTS) -o project
data.o: data.h
main.o: data.h io.h
io.o: io.h
# Former Makefile
OBJECTS = data.o main.o io.o
project1: $(OBJECTS)
cc $(OBJECTS) -o project1
data.o: data.c data.h
cc -c data.c
main.o: data.h io.h main.c
cc -c main.c
io.o: io.h io.c
31
● Salidavarpa:~/Test/Makefile_Dir> make/usr/bin/gcc -c -o data.o data.c/usr/bin/gcc -c -o main.o main.c/usr/bin/gcc -c -o io.o io.c/usr/bin/gcc data.o main.o io.o -o project1 varpa:~/Test/Makefile_Dir>
io.o: io.h cc -c io.c
Makefile Laboratorio de Arquitectura de Ordenadores @ Departamento de Ingeniería Telemática, UC3M