-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
112 lines (86 loc) · 3.35 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# --------------------------------------------------------------------
# Makefile de tarea .
# Laboratorio de Programación 3.
# InCo-FIng-UDELAR
# Define un conjunto de reglas.
# Cada regla tiene un objetivo, dependencias y comandos.
#objetivo: dependencia1 dependencia2...
# comando1
# comando2
# comando3
# (antes de cada comando hay un tabulador, no espacios en blanco).
# Se invoca con
#make objetivo
# para que se ejecuten los comandos.
#
# Si `objetivo' es un archivo los comandos se ejecutan solo si no está
# actualizado (esto es, si su fecha de actualización es anterior a la de alguna
# de sus dependencias.
# Previamente se aplica la regla de cada dependencia.
# --------------------------------------------------------------------
# Objetivo predeterminado (no se necesita especificarlo al invocar `make').
all: principal
# Objetivos que no son archivos.
.PHONY: all clean_bin clean_test clean testing
TESTDIR = test
EJECUTABLE = principal
# compilador
CC = g++
# opciones de compilación
CCFLAGS = -Wall -Werror -I$(HDIR) -g -DNDEBUG
# -DNDEBUG
# si se mantiene esta opción las llamadas a assert no hacen nada.
# $^ se expande en todas las dependencias
$(EJECUTABLE):principal.cpp intervalos.cpp
$(CC) $(CCFLAGS) $^ -o $@
# casos de prueba
CASOS = 00 01 02 03 04 05
# cadena de archivos, con directorio y extensión
INS=$(CASOS:%=$(TESTDIR)/%.in)
OUTS=$(CASOS:%=$(TESTDIR)/%.out)
SALS=$(CASOS:%=$(TESTDIR)/%.sal)
DIFFS=$(CASOS:%=$(TESTDIR)/%.diff)
$(SALS):$(EJECUTABLE)
# el guión antes del comando es para que si hay error no se detenga la
# ejecución de los otros casos
$(TESTDIR)/%.sal:$(TESTDIR)/%.in
-timeout 6 valgrind -q --leak-check=full ./$(EJECUTABLE) < $< > $@ 2>&1
@if [ $$(stat -L -c %s $@) -ge 10000 ]; then \
echo "tamaño excedido" > $@;\
fi
# prueba de tiempo
$(TESTDIR)/05.sal:$(TESTDIR)/05.in
./$(EJECUTABLE) < $< > $@
# cada .diff depende de su .out y de su .sal
%.diff: %.out %.sal
@diff $^ > $@; \
if [ $$? -ne 0 ]; \
then \
echo ---- ERROR en caso $@ ----; \
fi
# Con $$? se obtiene el estado de salida del comando anterior.
# En el caso de `diff', si los dos archivos comparados no son iguales,
# el estado de la salida no es 0 y en ese caso se imprime el mensaje.
# Test general. Las dependencias son los .diff.
# Con `find` se encuentran los .diff de tamaño > 0 que están en el directorio
# $(TESTDIR) y lo asigna a $(LST_ERR).
# Si el tamaño de $(LST_ERR) no es cero imprime los casos con error.
# Con `sed` se elimina el nombre de directorio y la extensión.
testing:$(DIFFS)
@LST_ERR=$$(find $(TESTDIR) -name *.diff* -size +0c -print); \
if [ -n "$${LST_ERR}" ]; \
then \
echo -- CASOS CON ERRORES --; \
echo "$${LST_ERR}" | sed -e 's/$(TESTDIR)\///g' -e 's/.diff//g';\
fi
# borra binarios
clean_bin:
rm -f $(EJECUTABLE)
# borra resultados de ejecución y comparación
clean_test:
@rm -f $(TESTDIR)/*.sal $(TESTDIR)/*.diff $(TESTDIR)/*~
# borra binarios, resultados de ejecución y comparación, y copias de respaldo
clean:clean_test clean_bin
@rm -f *~ $(HDIR)/*~
check-syntax:
gcc -o nul -S ${CHK_SOURCES}