Una explicacion mas a fondo de que hace cada comando del amkefile cuando son llamados. El makefile se puede modificar a gusto.
CC = gcc
CFILES = *.c
HFILES = *.h
MAIN = pruebas.c
OBJETOS = abb.o abb_minipruebas.o
FILES = Enunciado README.md makefile
EXEC = abb
CFLAGS = -g -std=c99 -Wall -Wconversion -Wtype-limits -pedantic -Werror -O0
GFLAGS = --tui
VFLAGS = --leak-check=full --track-origins=yes --show-reachable=yes
$(EXEC): $(MAIN) $(OBJETOS)
$(CC) $^ $(CFLAGS) -o $(EXEC)
debug: $(EXEC)
gdb $(GFLAGS) $(EXEC)
test: $(EXEC)
valgrind $(VFLAGS) ./$(EXEC) $(arg_1) $(arg_2) $(arg_3)
run: $(EXEC)
./$(EXEC) $(arg_1) $(arg_2) $(arg_3)
%.o: %.c %.h
$(CC) $(CFLAGS) -c $< -o $@
zip:
zip -r $(EXEC).zip $(CFILES) $(HFILES) $(FILES)
.PHONY: clean
clean:
rm -f *.o $(EXEC)
$(EXEC): $(MAIN) $(OBJETOS)
$(CC) $^ $(CFLAGS) -o $(EXEC)
Este comando compila el programa si y solo si el archivo de jecucion (EXEC) esta desactulizado.
MAIN
- El nombre del .c que tenga el main de su programa.
EXEC
- El nombre del ejecutable que se quiere crear
OBJETOS
- Los objetos que se quieren compilar para compilar el ejecutable(solo se vuelven a compilar lo objetos si estan des acutializados)
CC = gcc
- El nombre del compilador que se va usar
CFLAGS = -g -std=c99 -Wall -Wconversion -Wtype-limits -pedantic -Werror -O0
- Los flags de gcc que se van a usar al compilar el ejecutable.
$^
- Es una instruccion de make que agarra todo lo que esta depues del
:
y lo copia donde esta
- Es una instruccion de make que agarra todo lo que esta depues del
debug: $(EXEC)
gdb $(GFLAGS) $(EXEC)
Este comando primero chequea que $(EXEC)
este compilado y actualizado(si no lo esta lo actualiza) y corre gdb $(GFLAGS) $(EXEC)
para debuggear el programa.
GFLAGS
- Los flags que se quieran utilizar para gdb.
test: $(EXEC)
valgrind $(VFLAGS) ./$(EXEC) $(arg_1) $(arg_2) $(arg_3)
Este comando primero chequea que evento $(EXEC)
este compilado y actualizado; y corre valgrind para testear perdidas de memoria.
arg_n
- Estas variables se pueden utilizar cuando se quiere dar argumentos al main. Se inicializa escribiendo despues del comando
make test arg_1=i
y asi con cada arg_n que se quiera inicilazar.
- Estas variables se pueden utilizar cuando se quiere dar argumentos al main. Se inicializa escribiendo despues del comando
VFLAGS
- Los flags que se quieren utilizar para valgrind
run: $(EXEC)
./$(EXEC) $(arg_1) $(arg_2) $(arg_3)
Se usa para ejecutar el programa. El comando primero chequea que $(EXEC)
este compilado y actualizado(si no lo esta lo actualiza).
arg_n
- Estas variables se pueden utilizar cuando se quiere dar argumentos al main. Se inicializa escribiendo despues del comando
make run arg_1=i
y asi con cada arg_n que se quiera inicilazar.
- Estas variables se pueden utilizar cuando se quiere dar argumentos al main. Se inicializa escribiendo despues del comando
zip:
zip -r $(EXEC).zip $(CFILES) $(HFILES) $(FILES)
Este comando crea un zip con los archivos $(CFILES)
,$(HFILES)
y $(FILES)
con el nombre $(EXEC).zip
(osea el nombre del ejecutable con .zip al final).
.PHONY: clean
clean:
rm -f *.o $(EXEC)
make clean borra todos los objetos (*.o se remplaza por todos los ojetos en la carpeta) y el ejecutable ($(EXEC)
)
.PHONY : clean.
- Esto hace un clean mas robusto. Si existiera un archivo que se llamara clean, y no la pusieramos, vamos a tener un comportamiento indefinido.
%.o: %.c %.h
$(CC) $(CFLAGS) -c $< -o $@
Esta es una funcion interna del make la cual es llamada por make $(EXEC)
. Solo se llama cuando los $(OBJETOS)
estan desactualizados.
$@
- Indica que ahi se escribir a el nombre de lo que queremos generar, el target de la regla que es %.o
%.o
- Indica que es la regla para cualquier cosa terminada en .o .
$<
- Es una instruccion de make que agarra la primer instruccion prerequisito despues del
:
que es %.c.
- Es una instruccion de make que agarra la primer instruccion prerequisito despues del
%.c
- Chequea para cada .o este compilado con el ultimo .c mas actualizado.