CXX = g++
TARGET = lemma_parallel_prover
SUBDIR = $(shell pwd)

SRC_BIN_RELEASE = $(SUBDIR)/bin/Release
SRC_BIN_DEBUG = $(SUBDIR)/bin/Debug

OBJ_DIR_RELEASE = $(SUBDIR)/obj/Release
OBJ_DIR_DEBUG = $(SUBDIR)/obj/Debug

# Create necessary directories if they do not exist
$(shell mkdir -p $(SRC_BIN_RELEASE) $(SRC_BIN_DEBUG) $(OBJ_DIR_RELEASE) $(OBJ_DIR_DEBUG))

INCL = -I $(SUBDIR) -lm -pthread
SRC = $(foreach dir, $(SUBDIR),$(wildcard $(dir)/*.cpp))

OBJ_RELEASE = $(patsubst %.cpp, $(OBJ_DIR_RELEASE)/%.o, $(notdir $(SRC)))
OBJ_DEBUG = $(patsubst %.cpp, $(OBJ_DIR_DEBUG)/%.o, $(notdir $(SRC)))

CXX_FLAGS_RELEASE = -Wall -std=c++11 -O3 -static -c
CXX_FLAGS_DEBUG = -Wall -std=c++11 -g -O0 -static -c


release: $(SRC_BIN_RELEASE)/$(TARGET)
$(SRC_BIN_RELEASE)/$(TARGET): $(OBJ_RELEASE)
	$(CXX) ${INCL} $^ -o $@
$(OBJ_DIR_RELEASE)/%.o:$(SUBDIR)/%.cpp
	$(CXX) ${INCL} $(CXX_FLAGS_RELEASE) $< -o $@

debug: $(SRC_BIN_DEBUG)/$(TARGET)
$(SRC_BIN_DEBUG)/$(TARGET): $(OBJ_DEBUG)
	$(CXX) ${INCL} $^ -o $@
$(OBJ_DIR_DEBUG)/%.o:$(SUBDIR)/%.cpp
	$(CXX) ${INCL} $(CXX_FLAGS_DEBUG) $< -o $@

.PHONY: clean
clean:
	rm -f $(OBJ_DIR_RELEASE)/* $(OBJ_DIR_DEBUG)/* $(SRC_BIN_RELEASE)/$(TARGET) $(SRC_BIN_DEBUG)/$(TARGET)
