########################################################################
# Autor: Gil Perez, Borja (bor.gil@predoc.uam.es)
# Fecha: 2018-01-26 (yyyy-mm-dd)
########################################################################
# The GNU compiler collection
CC = gcc
# -O para aplicar el optimizador de codigo, -g para poder depurar, -Wall: avisos extra
# -ansi equivale a la version -std=c89, -pedantic desactiva extensiones para generar mas 'warnings'
CFLAGS = -O -g -Wall -ansi -pedantic
# -lm enlaza la biblioteca matematica, -pthread enlaza la biblioteca de hilos
LIBS = -lm -pthread

# $ make
# $ make all
all: p1 p2
# $ make p1
P1 = p1s1 p1s2
p1: $(P1)
# $ make p2
P2 = p2s1 p1s2
p2: $(P2)

# $@ es el item que aparece a la izquierda de ':'
# $< es el primer item en la lista de dependencias
# $^ son todos los archivos que se encuentran a la derecha de ':'
########################################################################
# P1
########################################################################
main.o: main.c header1.h header2.h
	$(CC) -c -o $@ $< $(CFLAGS)
src1.o: src1.c header1.h
	$(CC) -c -o $@ $< $(CFLAGS)
src2.o: src2.c header2.h
	$(CC) -c -o $@ $< $(CFLAGS)
p1s1: main.o src1.o src2.o
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
p1s2: main.o src2.o
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
########################################################################
# P2
########################################################################
src3.o: src3.c header2.h
	$(CC) -c -o $@ $< $(CFLAGS)
src4.o: src4.c header1.h header2.h
	$(CC) -c -o $@ $< $(CFLAGS)
p2s1: src3.o src1.o
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
p2s2: src3.o src4.o src2.o
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
	
########################################################################
# Utilities
########################################################################
# Un objetivo falso ("phony target") es aquel que no es el nombre de un
# archivo, sino un nombre descriptivo de alguna accion, de algunas
# ordenes que se ejecutarán al requerirse explicitamente.
UTILS = info dev-essential astyle valgrind doxygen clean lubuntu1404-custom
.PHONY: $(UTILS)
# $ make info
info:
	@echo "<Asignatura>, <Grado>"
	@echo "<Codigo de la entrega>"
	@echo "Autores:"
	@echo "	<Autor, Correo electronico>"
	@echo "	<Autor, Correo electronico>"
	@echo "Ejecutables:"
	@echo "	$(P1)"
	@echo "	$(P2)"
	@echo "	$(UTILS)"
	@echo
# $ make dev-essential
dev-essential:
	@echo "Installing essential developer tools."
	sudo apt-get install astyle build-essential geany nemiver nmon terminator valgrind
	sudo apt-get install doxygen graphviz
# $ make astyle
astyle:
	astyle *.h *.c
	@echo "Run make clean to remove *.orig files if any file was formated."
# $ make valgrind ARGS="./<executable> [<arguments>]"
valgrind:
	valgrind --leak-check=full ${ARGS}
# $ make doxygen
doxygen:
	@rm -fr Doxyfile html latex
	@doxygen -g
	@doxygen Doxyfile
# $ make clean
clean:
	@rm -fr Doxyfile html latex
	@rm -f *.o *~ core *.orig $(P1) $(P2)
# $ make lubuntu1404-custom
lubuntu1404-custom:
	@echo "Customizing Lubuntu 14.04"
	sudo apt-get purge abiword gnumeric
	sudo add-apt-repository ppa:indicator-brightness/ppa
	sudo add-apt-repository ppa:webupd8team/java
	sudo apt-get update
	sudo apt-get install language-selector-gnome libreoffice libreoffice-l10n-es lubuntu-restricted-extras
	sudo apt-get install indicator-brightness
	sudo apt-get install oracle-java8-installer && sudo apt-get install oracle-java8-set-default
	sudo apt-get autoremove && sudo apt-get autoclean
