# Compiler settings
CC := g++                  # Compiler
CFLAGS := -std=c++17 -Wall -pthread -ltbb # Compiler flags

# Source files and object files for Program 1
SRCS1 := primes-threadPool-fixed-chunks.cpp
OBJS1 := $(SRCS1:.cpp=.o)
EXECUTABLE1 := primes-threadPool-fixed-chunks

# Source files and object files for Program 2
SRCS2 := primes-threadPool-concQueue.cpp
OBJS2 := $(SRCS2:.cpp=.o)
EXECUTABLE2 := primes-threadPool-concQueue

SRCS3 := thread.cpp
OBJS3 := $(SRCS3:.cpp=.o)
EXECUTABLE3 := thread

SRCS4 := conditionVariable.cpp
OBJS4 := $(SRCS4:.cpp=.o)
EXECUTABLE4 := conditionVariable

SRCS5 := future.cpp
OBJS5 := $(SRCS5:.cpp=.o)
EXECUTABLE5 := future

SRCS6 := future-promise.cpp
OBJS6 := $(SRCS6:.cpp=.o)
EXECUTABLE6 := future-promise

SRCS7 := threadSafequeueWithAsyncTasks.cpp
OBJS7 := $(SRCS7:.cpp=.o)
EXECUTABLE7 := threadSafequeueWithAsyncTasks

SRCS8 := threadPool-concQueue.cpp
OBJS8 := $(SRCS8:.cpp=.o)
EXECUTABLE8 := threadPool-concQueue

SRCS9 := transform-reduce.cpp
OBJS9 := $(SRCS9:.cpp=.o)
EXECUTABLE9 := transform-reduce

SRCS10 := forEach.cpp
OBJS10 := $(SRCS10:.cpp=.o)
EXECUTABLE10 := forEach

# Makefile rules
.PHONY: all clean

all: $(EXECUTABLE1) $(EXECUTABLE2) $(EXECUTABLE3) $(EXECUTABLE4) $(EXECUTABLE5) $(EXECUTABLE6) $(EXECUTABLE7) $(EXECUTABLE8) $(EXECUTABLE9) $(EXECUTABLE10)

$(EXECUTABLE1): $(OBJS1)
	$(CC) $(CFLAGS) $^ -o $@

$(EXECUTABLE2): $(OBJS2)
	$(CC) $(CFLAGS) $^ -o $@

$(EXECUTABLE3): $(OBJS3)
	$(CC) $(CFLAGS) $^ -o $@

$(EXECUTABLE4): $(OBJS4)
	$(CC) $(CFLAGS) $^ -o $@

$(EXECUTABLE5): $(OBJS5)
	$(CC) $(CFLAGS) $^ -o $@

$(EXECUTABLE6): $(OBJS6)
	$(CC) $(CFLAGS) $^ -o $@

$(EXECUTABLE7): $(OBJS7)
	$(CC) $(CFLAGS) $^ -o $@	

$(EXECUTABLE8): $(OBJS8)
	$(CC) $(CFLAGS) $^ -o $@	

$(EXECUTABLE9): $(OBJS9)
	$(CC) $(CFLAGS) $^ -o $@	

$(EXECUTABLE10): $(OBJS10)
	$(CC) $(CFLAGS) $^ -o $@

%.o: %.cpp
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -f $(OBJS1) $(EXECUTABLE1) $(OBJS2) $(EXECUTABLE2) $(OBJS3) $(EXECUTABLE3) $(OBJS4) $(EXECUTABLE4) $(OBJS5) $(EXECUTABLE5) $(OBJS6) $(EXECUTABLE6) $(OBJS7) $(EXECUTABLE7) $(OBJS8) $(EXECUTABLE8) $(OBJS9) $(EXECUTABLE9) $(OBJS10) $(EXECUTABLE10)
