# Para que este Makefile funcione, se necesita la siguiente estructura de
# directorios:
#
# ./Makefile
# ./tarea1/
# ./tarea1/strtokens.h
# ./tarea1/strtokens.c
# ./tarea1/otros archivos
# ./tarea2/
# ./tarea2/dict.h
# ./tarea2/dict.c
# ./tarea2/otros archivos
# ./tarea3/mishell.c
# ./tarea3/otros archivos
#
# Adems, deben crear links a este Makefile dentro de los directorios de las
# tareas:
# ln -s ../Makefile ./tarea1
# ln -s ../Makefile ./tarea2
# ln -s ../Makefile ./tarea3
#
# Al invocar make, dentro de cada subdirectorio se generarn los archivos .o de
# cada archivo .c que tengan dentro de ellos, con los que se proceder a
# generar el ejecutable ./mishell
#
# Formas de uso:
# Compilacin normal:     % make
# Debugging:              % make debug
# Borrar .o:              % make clean
# Borrar .o y ejecutable: % make cleanall
#
# Este Makefile es independiente de qu tareas previas utilicen para esta
# tarea. Se asume que hay una tarea por subdirectorio con todos los codigos
# fuente necesarios para ella dentro del mismo. Los nombres de cada
# subdirectorio son de la forma "tareaN", con N el nmero de la tarea al cual
# corresponde el subdirectorio. Si no necesitan alguna tarea previa, basta con
# que no exista su subdirectorio para que este Makefile la ignore.
#
# Como resultado del proceso de compilacin, dentro de cada subdirectorio
# quedarn los archivos .o asociados a sus archivos .c y en el directorio
# principal quedar el ejecutable.
#
# La tarea DEBE ser entregada con un Makefile ubicado en el directorio
# principal, bien sea este mismo o bien otro hecho por uds. mismos, con la
# condicin de que deje al ejecutable en el directorio principal.

# Estos son los parmetros de las tareas
PREFIJO_TAREAS = tarea
TAREAS = $(wildcard $(PREFIJO_TAREAS)*)
TAREAS_TODO = $(addsuffix .todo,$(TAREAS))
BIN = mishell

# Estos son los parmetros de compilacin
export CPPFLAGS
export CC = gcc
export MAKE = make
export MAKEFILE = Makefile

# Pueden agregar -O si quieren ejecutable optimizado
export CFLAGS = -Wall -pedantic -ansi -pipe

# Si esta variable vale -j, la compilacin se hace en paralelo, por lo que es
# ms rpida, pero es ms difcil detectar errores. Si se deja vaca, la
# compilacin se en forma secuencial, siendo ms lenta, por lo que es ms fcil
# detectar los errores de compilacin
# export MAKE_FLAGS = -j
export MAKE_FLAGS =

all:
	$(MAKE) $(MAKE_FLAGS) $(BIN)

$(BIN): $(TAREAS_TODO)
	@echo Regla BIN : $(BIN)
	@echo TAREAS: $(TAREAS)
	$(CC) $(CPPFLAGS) $(CFLAGS) $(addsuffix .o,$(basename $(foreach C,$(TAREAS),$(wildcard $(C)/*.c)))) -o $(BIN)

$(TAREAS_TODO):
	@echo Regla TAREAS_TODO: Haciendo $(basename $@)
	$(MAKE) -C $(basename $@) $(addsuffix .o,$(basename $(notdir $(wildcard $(basename $@)/*.c))))

%.o: %.c
	@echo Regla $@ : $^
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $^

debug:
	$(MAKE) CPPFLAGS="-D__DEBUGGING__"

cleanall: clean
	rm -f $(BIN)

clean:
	rm -f $(foreach OBJ,$(foreach O,$(TAREAS),$(wildcard $(O)/*.o)),$(OBJ))
