makefile: contenidopedmume/asignaturas/2005/lao/ficheros/makefile… · make se utiliza desarrollo...

31
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

Upload: others

Post on 01-May-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

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