Herramientas de construcción ( Build )

27
© 2004-2007 Manuel Collado Make-1 Herramientas de construcción (Build) Utilidad ‘make’ y similares

description

Herramientas de construcción ( Build ). Utilidad ‘make’ y similares. Contenido. Objetivo y funciones Proceso de compilación y montaje Dependencias y regeneración selectiva Makefile Aplicaciones Generación automática de dependencias Limitaciones de ‘make’ - PowerPoint PPT Presentation

Transcript of Herramientas de construcción ( Build )

Page 1: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-1

Herramientas de construcción (Build)

Utilidad ‘make’ y similares

Page 2: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-2

Contenido

Objetivo y funciones Proceso de compilación y montaje Dependencias y regeneración selectiva Makefile Aplicaciones Generación automática de dependencias Limitaciones de ‘make’ Otras herramientas de construcción

Page 3: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-3

Objetivo y funciones

Objetivo: Generar o actualizar automáticamente ficheros

dependientes de otros, de forma selectiva Modo de operación:

Compara la fecha de actualización de cada fichero con la de los que depende, y si está anticuado lo regenera

Aplicación típica: Compilación y montaje de programas

Page 4: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-4

gcc -c alfa.c -o alfa.o

alfa.c alfa.o

beta.c beta.o

gcc -c beta.c -o beta.o

gcc -o prog alfa.o beta.o

prog

Compilación y montaje

Inicialmente hay que compilar todo

Page 5: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-5

Recompilación selectiva

gcc -c alfa.c -o alfa.o

alfa.c alfa.o

beta.c beta.o gcc -o prog alfa.o beta.o

prog

* = modificado

*

**

Posteriormente sólo se recompila lo que cambia

Page 6: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-6

Recompilación selectiva

alfa.c alfa.o

beta.c beta.o

gcc -c beta.c -o beta.o

gcc -o prog alfa.o beta.o

prog

*

* = modificado

*

*

Posteriormente sólo se recompila lo que cambia

Page 7: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-7

Comparación de fechas

alfa.c alfa.o

beta.c beta.o

gcc -c beta.c -o beta.o

gcc -o prog alfa.o beta.o

prog

12.30 12.01

12.0011.15

12.02

12.31

12.32

Proceso automático, comparando fechas

Page 8: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-8

Dependencias múltiples

ajustar

parrafo

palabra

linea

Programa modular, jerarquizado

Page 9: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-9

Dependencias entre ficheros

Dependencias múltiples

ajustar.cpp

parrafo.h

parrafo.cpp

linea.h

linea.cpp

palabra.h

palabra.cpp

ajustar.o

parrafo.o

linea.o

palabra.o

ajustar

Page 10: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-10

Dependencias múltiples

ajustar.cpp

parrafo.h

parrafo.cpp

linea.h

linea.cpp (*)

palabra.h

palabra.cpp

ajustar.o

parrafo.o

linea.o (*)

palabra.o

ajustar (*)

Si cambia algo, se recompila lo que depende de él

Page 11: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-11

Dependencias múltiples

ajustar.cpp

parrafo.h

parrafo.cpp

linea.h (*)

linea.cpp

palabra.h

palabra.cpp

ajustar.o (*)

parrafo.o (*)

linea.o (*)

palabra.o

ajustar (*)

Si cambia algo, se recompila lo que depende de él

Page 12: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-12

Utilidad ‘make’

Automatiza el proceso de regeneración selectiva Detecta los ficheros no actualizados mediante la

comparación de fechas Necesita información de las dependencias entre

ficheros y las acciones para regenerarlos Esta información se suministra en un fichero

denominado genéricamente ‘makefile’, usando una notación específica, basada en reglas

Cada regla contiene las dependencias de un fichero respecto a los demás, y las acciones para regenerarlo

Page 13: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-13

‘makefile’

Regla = dependencias + acciones

objetivo: dependencia dependencia ...

accion

accion

. . .

objetivo: dependencia ...

accion

. . .

Nota: el símbolo es el carácter de tabulación

Page 14: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-14

Ejemplo de ‘makefile’

ajustar: ajustar.o parrafo.o linea.o palabra.o

g++ -o ajustar ajustar.o parrafo.o linea.o \

palabra.o

palabra.o: palabra.cpp palabra.h

g++ -c palabra.cpp -o palabra.o

linea.o: linea.cpp linea.h palabra.h

g++ -c linea.cpp -o linea.o

. . .

Page 15: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-15

Cómo invocar ‘make’ Dando la orden:

make [ -f makefile ] [ opciones ] [ objetivos ]

Algunos parámetros: makefile – fichero de reglas (por defecto makefile) opción -k – continuar aunque haya errores objetivos – objetivos a actualizar (por defecto el de la primera

regla que haya en el fichero makefile)

Ejemplo: make (sin parámetros) Usa el fichero makefile y actualiza el primer objetivo

Page 16: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-16

Variables y reglas implícitas Variables – toman valores de texto

Asignación: variable = valor Uso: … $(variable) …

Reglas implícitas – plantillas genéricas Dependencias – usando patrones

%.ext1: %.ext2 Acciones – usando ‘macros’

$@ - objetivo $< - primera dependencia $? - dependencias modificadas $^ - dependencias (todas) $* - lo que se ajusta al patrón %

Las reglas se invocan con una línea de dependencias que se ajuste al patrón de dependencias

Page 17: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-17

Variables y reglas implícitas

OBJS = ajustar.o parrafo.o linea.o palabra.o

ajustar: $(OBJS)

g++ -o ajustar $(OBJS)

%.o : %.cpp

g++ -c $< -o $@

palabra.o: palabra.cpp palabra.h

linea.o: linea.cpp linea.h palabra.h

. . .

Page 18: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-18

Otras aplicaciones

Cualquier situación en que unos ficheros se actualizan a partir de otros que cambian Hacer copias de backup Generar formatos finales de documentos Actualizar contenido de sitios web Ejecutar pruebas de programas Regenerar instalaciones de software Borrar ficheros anticuados … etc. …

Page 19: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-19

Ejemplo

‘Backup’/’Mirror’ incremental

directorio copia fichero1 fichero1 fichero2 fichero2 fichero3 fichero3

● Situación inicial

Page 20: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-20

Ejemplo

‘Backup’/’Mirror’ incremental

directorio copia fichero1 fichero1 fichero2 fichero2 fichero3 fichero3 . . . ficheroN

● Modificado fichero2, nuevo ficheroN

Page 21: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-21

Ejemplo

‘Backup’/’Mirror’ incremental

directorio copia fichero1 fichero1 fichero2 fichero2 fichero3 fichero3 . . . . . . ficheroN fichero N

● Sólo hay que copiar lo que cambia

Page 22: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-22

Ejemplo

‘Backup’ incremental (1)

BAK/fichero1: fichero1 copy fichero1 BAK

BAK/fichero2: fichero2 copy fichero2 BAK

. . .

● Rudimentario: hay que nombrar cada fichero

Page 23: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-23

Ejemplo

‘Backup’ incremental (2)

copia: *.c *.h

copy $? BAK

touch copia

● ‘touch’ cambia la fecha de actualización del fichero que se indique, poniendo la fecha de ese momento

● ‘copia’ es un fichero vacío, que sirve para tener la fecha del último ‘backup’

Page 24: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-24

Dependencias automáticas La preparación manual del makefile es laboriosa

Es fácil olvidarse de algunas dependencias

Se puede automatizar en parte Hay herramientas para analizar las dependencias Para ello se analizan las directivas #include

Utilidad makedepend Invoca el preprocesador y analiza los #include Añade las dependencias el final del makefile, precedidas de

la marca:

# DO NOT DELETE THIS LINE -- make depend depends on it. Esta marca permite regenerar (reescribir) las dependencias,

conservando el resto del makefile.

Page 25: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-25

Dependencias automáticas Compilador gcc/g++

Tiene una capacidad equivalente a ‘makedepend’ Se invoca como gcc –MM (o g++ -MM) Escribe las dependencias por la salida estándar

Ejemplo:g++ -MM *.cpp

> ajustar.o: ajustar.cpp palabra.h ...> linea.o: linea.cpp linea.h palabra.h> palabra.o: palabra.cpp palabra.h> parrafo.o: parrafo.cpp parrafo.h linea.h ...

Page 26: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-26

Desventajas de ‘make’ La preparación manual del makefile es laboriosa La reconstrucción no es segura

No se detectan cambios ‘hacia atrás’ Puede ser poco eficiente

Se reconstruye aunque no cambien objetivos intermedios

Reconstruye más de lo necesario tras ligeros cambios en cabeceras básicas

Ficheros makefile poco transportables Las acciones son específicas para cada plataforma:

‘shell’, compilador, etc.

Page 27: Herramientas de construcción ( Build )

© 2004-2007 Manuel Collado

Make-27

Otras herramientas de construcción

Hay muchas herramientas similares a ‘make’ Algunas muy similares Otras más elaboradas

Ejemplos A-a-p: sencilla de usar, basta la lista de fuentes Jam: sencilla de usar (como la anterior) Cook: usa una herramienta separada para las

dependencias (c_incl), notación tipo Lisp Ant: muy usado con Java, reglas con marcado XML SCons: reconstrucción más segura, basado en Python