# Disable the use of implicit build rules
.SUFFIXES:


CC = clang
CFLAGS += -Wall -Werror -std=c11

all: lab project

lab: stack-lab-1 stack-lab-2 stack-lab-3 stack-lab-4
project: stack-1 stack-2 stack-3 stack-4

# Library object files
stack-1.o: stack-1.c stack-pointer.h stack.h
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<

stack-2.o: stack-2.c stack-buffer.h stack.h
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<

stack-3.o: stack-3.c stack-pointer.h stack.h
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<

stack-4.o: stack-4.c stack-buffer.h stack.h
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<

# Simple example suite
stack-lab-1: stack-1.o stack-lab.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

stack-lab-2: stack-2.o stack-lab.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

stack-lab-3: stack-3.o stack-lab.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

stack-lab-4: stack-4.o stack-lab.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

# Project example suite
stack-1: stack-1.o stack-project.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

stack-2: stack-2.o stack-project.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

stack-3: stack-3.o stack-project.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

stack-4: stack-4.o stack-project.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

# Comparison utility
stack-project-compare: stack-2.o stack-project-compare.c
	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^

clean:
	rm -f *.o stack-? stack-lab-? \
	stack-project-compare stack-project-compare-func *~
