## CONFIGURATION IS DONE IN FILE config.inc: 

include config.inc

## VARIABLES
INC_DIR     = ../include
OBJ_DIR     = ../obj
SRC_DIR     = ../src
BIN_DIR     = ../bin

ifneq ($(LIB_DIR_CSX),)
CSXAPI      = $(LIB_DIR_CSX)/libcsxapi_m.a
else
CFLAGS      = -DNO_CSXAPI
CSXAPI      = 
endif 

CFLAGS      += -Wall -c
VPATH       = $(INC_DIR_P11) $(INC_DIR)
LDFLAGS     = -ldl 

EXECUTABLE  = $(BIN_DIR)/qptool2

OBJECTS = $(OBJ_DIR)/CxiKeyAttributes_imp.o $(OBJ_DIR)/MLDSA_KeyGen_imp.o $(OBJ_DIR)/MLDSA_Sign_imp.o $(OBJ_DIR)/MLDSA_Verify_imp.o $(OBJ_DIR)/MLKEM_Decap_imp.o $(OBJ_DIR)/MLKEM_Encap_imp.o $(OBJ_DIR)/MLKEM_KeyGen_imp.o $(OBJ_DIR)/MLKEM_Response_imp.o

OBJECTS += $(OBJ_DIR)/p11_errmap.o
OBJECTS += $(OBJ_DIR)/pkcs11_testcase_main.o
OBJECTS += $(OBJ_DIR)/pkcs11_testcase_utilities.o
OBJECTS += $(OBJ_DIR)/template_util.o
OBJECTS += $(OBJ_DIR)/test_case.o
OBJECTS += $(OBJ_DIR)/test_case_hss.o
OBJECTS += $(OBJ_DIR)/test_case_lms.o
OBJECTS += $(OBJ_DIR)/test_case_mldsa.o
OBJECTS += $(OBJ_DIR)/test_case_mlkem.o
OBJECTS += $(OBJ_DIR)/test_case_xmss.o
OBJECTS += $(OBJ_DIR)/xmss_defs.o

## RULES
## e.g. to invoke rule "all" type: 
##                                 make all

# rule all: compile all sample programs
.PHONY: all
all: qptool2

# rule 3.2.1: compile only main_3.2.1_Initialization.c
.PHONY: qptool2
qptool2: $(OBJECTS)
	$(CC) -o $(BIN_DIR)/qptool2 $+ $(LDFLAGS) $(CSXAPI)

HEADERS = cs_core.h csxapi.h CxiKeyAttributes.h hbs_defs.h hbs.h load_store.h MLDSA_KeyGen.h MLDSA_Sign.h MLDSA_Verify.h MLKEM_Decap.h MLKEM_Encap.h MLKEM_KeyGen.h MLKEM_Response.h qptool2.h qsr2mux.h template_util.h xmss_defs.h

# create any of the object files needed above
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(HEADERS)
	if [ ! -d "$(OBJ_DIR)" ]; then mkdir $(OBJ_DIR); fi
	$(CC)  $(CFLAGS)  $< -o $@  -I$(INC_DIR_P11) -I$(INC_DIR)

# rule clean: remove all object files and executables
.PHONY: clean  
clean:
	rm -f $(OBJ_DIR)/*.o $(EXECUTABLE)

