Skip to content

Latest commit

 

History

History
156 lines (116 loc) · 4.43 KB

MAKEFILE.md

File metadata and controls

156 lines (116 loc) · 4.43 KB

Makefile:

Una explicacion mas a fondo de que hace cada comando del amkefile cuando son llamados. El makefile se puede modificar a gusto.

Tabla de Contenidos

Codigo:

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)

Comandos:

make o make $(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

make debug:

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.

make test:

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.
  • VFLAGS
    • Los flags que se quieren utilizar para valgrind

make run:

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.

make zip:

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).

make clean:

.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.

make %.o:

%.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.
  • %.c
    • Chequea para cada .o este compilado con el ultimo .c mas actualizado.