BUILD_DIR=out
SRC_DIR=src
INC_DIR=inc
CC=gcc
AR=ar
OBJDUMP=objdump
LIBS=
LIBS_HEADERS=deps/
STANDART=c23
OPTIMIZE=-Og
TARGET=ptQueue


DEFINES=#-DOPCODE_WORDSIZE=2 -DMEM_CELL_WORDS=1 -DPC_WORDSIZE=2 -DGP_REG_CELL_WORDS=1 -DIO_REG_CELL_WORDS=1

C_SOURCES=$(wildcard $(SRC_DIR)/*.c)
# C_SOURCES=$(wildcard $(SRC_DIR)/*.c)
C_HEADERS=$(wildcard $(INC_DIR)/*.h)

C_INCLUDES=-I$(INC_DIR)/ $(addprefix -I,$(LIBS_HEADERS))

C_DEFS=-D_POSIX_C_SOURCE=199309L

DISABLE_FLAGS=-Wno-unused-variable -Wno-unused-parameter -Wno-write-strings -Wno-pointer-arith
PEDANTIC_FLAGS=-pedantic -pedantic-errors $(DISABLE_FLAGS) -Wall -Wcast-align -Wcast-qual -Wconversion -Wduplicated-branches -Wduplicated-cond -Werror -Wextra -Wfloat-equal -Wlogical-op -Wpedantic -Wredundant-decls -Wsign-conversion
ANALYZER_FLAGS=-fanalyzer -fdiagnostics-show-option -fdiagnostics-color=always
LSECTIONS=-ffunction-sections -fdata-sections -Wl,--gc-sections
CFLAGS=$(C_DEFS) -g $(C_INCLUDES) $(DEFINES) $(OPTIMIZE) --std=$(STANDART) $(PEDANTIC_FLAGS) $(ANALYZER_FLAGS)
LFLAGS=$(OPTIMIZE) -g $(PEDANTIC_FLAGS) $(DEFINES) -flto -fuse-linker-plugin $(LSECTIONS) -lm 



OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) $(LIBS)
vpath %.c $(sort $(dir $(C_SOURCES)))
vpath %.h $(sort $(dir $(C_HEADERS)))

# $(info SOURCES=$(C_SOURCES))
# $(info HEADERS=$(C_HEADERS))
# $(info OBJECTS=$(OBJECTS))


all: build

build: date deps Dir $(C_HEADERS) target compile_commands

rebuild: clean | build





target: date $(BUILD_DIR)/$(TARGET).a


$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
	@echo -e '\033[1;32mCC\t'$<'\t->\t'$@'\033[0m'
	@$(CC) -c $(CFLAGS) $< -o $@


$(BUILD_DIR)/main.elf: $(OBJECTS)
	@echo -e '\033[1;32mELF\t'$(OBJECTS)'\n\t\t\t->\t'$@'\033[0m'
	@$(CC) $(LFLAGS) $(OBJECTS) -o $(BUILD_DIR)/main.elf


$(BUILD_DIR)/$(TARGET).a: $(BUILD_DIR)/ptQueue.o
	@echo -e '\033[1;32mAR\t'$(BUILD_DIR)/$(TARGET).o'\n\t\t\t->\t'$@'\033[0m'
	@$(AR) rcs $(BUILD_DIR)/$(TARGET).a $(BUILD_DIR)/$(TARGET).o



BuildDir:
	@mkdir -p $(BUILD_DIR)

SrcDir:
	@mkdir -p $(SRC_DIR)

IncDir:
	@mkdir -p $(INC_DIR)

Dir: BuildDir SrcDir IncDir


.PHONY: clean deps
clean:
	@rm -rf $(BUILD_DIR)/*
#	@rm -f compile_commands.json
	@echo -e '\033[0;31mCleaned\033[0m'

.NOTPARALLEL: date target rebuild  deps
date:
	@echo -e '\033[1;32m'"Starting building $(TARGET) at " | tr -d '\n'
	@date
	@echo -e '\033[0m'


compile_commands:
#	 @bear -- ./.gen_compile_commands.sh $(TARGET) $(CC) "$(CFLAGS)" "$(LFLAGS)" "$(OBJECTS)"
