CXX      = g++
CXXFLAGS = -std=c++14 -Wall -Wextra -O3 -fpermissive
LDFLAGS  = -lboost_thread -lboost_system -lboost_chrono -lpthread

# --------------------------------------------------------------------
# Source files
# --------------------------------------------------------------------

# Core library: row, sort algorithms (header-only), affinity helper,
# CPU-utilization monitor used by the AIMD scheduler.
CORE_SRC = \
    row.cpp \
    scheduler_iface.cpp \
    utilization_monitor.cpp

# Thread schedulers
THREAD_SRC = \
    static_scheduler.cpp \
    dynamic_scheduler.cpp \
    chunk_scheduler.cpp \
    chunk_steal_scheduler.cpp \
    guided_scheduler.cpp \
    adaptive_scheduler.cpp \
    aimd.cpp

# Process schedulers (prolific / collective family)
PROC_SRC = \
    bounded_prolific_scheduler.cpp \
    bounded_collective_scheduler.cpp

# Pipe schedulers
PIPE_SRC = \
    one_to_one_pipe_scheduler.cpp \
    one_to_many_scheduler.cpp \
    many_to_many_scheduler.cpp

ALL_SRC = $(CORE_SRC) $(THREAD_SRC) $(PROC_SRC) $(PIPE_SRC)
ALL_OBJ = $(ALL_SRC:.cpp=.o)

# --------------------------------------------------------------------
# Top-level targets
# --------------------------------------------------------------------

all: shm_generator shm_benchmark

shm_generator: shm_generator.cpp shm_keys.hpp
	$(CXX) $(CXXFLAGS) shm_generator.cpp -o $@ -lpthread

shm_benchmark: shm_benchmark.o $(ALL_OBJ)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

# Generic compile rule. Each .o depends on its matching .cpp and any
# .hpp with the same stem (when one exists). Header changes elsewhere
# are handled by `make clean && make`.
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# --------------------------------------------------------------------
clean:
	rm -f *.o shm_generator shm_benchmark

.PHONY: all clean
