# Compiler and assembler
CC = 		gcc
AS = 		as
LD = 		ld
OBJDUMP = 	objdump
SIZE = 		size

CFLAGS += -std=c2x
CFLAGS += -Wall
CFLAGS += -Wextra
CFLAGS += -Werror
CFLAGS += -Wno-unused-parameter
CFLAGS += -Wno-unused-variable
CFLAGS += -Wno-unused-function
CFLAGS += -Wno-unused-but-set-variable
CFLAGS += -Wno-unused-value
CFLAGS += -Wno-unused-label
CFLAGS += -Wno-unused-result
CFLAGS += -Wno-unused-local-typedefs
CFLAGS += -Wno-unused-const-variable
CFLAGS += -Wno-unused-macros
CFLAGS += -O3
CFLAGS += -g

# Specify the target binary (call it whatever)
TARGET = build/bin.elf
TARGET_TAR = $(TARGET).tar.zst
TARGET_SIG = $(TARGET_TAR).minisig

SRCS := $(wildcard src/*.c)

# Specify the object files in the build directory
OBJS := $(patsubst src/%.c,build/%.o,$(SRCS))

all : $(TARGET)

release : $(TARGET)
	@strip $(TARGET)
	@upx -q --force-overwrite $(TARGET) -o $(TARGET).upx > /dev/null
	@minisign -Sm $(TARGET)
	@tar --zstd -cvf $(TARGET).tar.zst $(TARGET) $(TARGET).minisig 1>/dev/null
	@zip $(TARGET).zip $(TARGET) $(TARGET).minisig 1>/dev/null
	@7za a $(TARGET).7z $(TARGET) $(TARGET).minisig 1>/dev/null

# For convenience
run : $(TARGET)
	@./$(TARGET)

mkbuilddir: 
	@mkdir -p build

# Link the object files into the target binary
$(TARGET) : $(OBJS)
	@$(CC) $(CFLAGS) -o $@ $^
	@echo -e "LD \t$^"

# Compile the source files into object files
build/%.o : src/%.c | mkbuilddir
	@$(CC) $(CFLAGS) -c -o $@ $< || (rm -f $@ && exit 1)
	@echo -e "CC \t$<"

# Print the size of the target binary
size : $(TARGET)
	$(SIZE) $(TARGET)

# Clean up the build directory
clean :
	rm -r build
	rm -f build/*.o
	rm -f $(TARGET)*

# Create a signed release
tar: $(TARGET_TAR) $(TARGET_SIG)

$(TARGET_SIG): $(TARGET_TAR)
	minisign -Sm $<

$(TARGET_TAR): $(TARGET)
	strip $<
	tar --zstd -cvf $@ $<

.PHONY : all clean size mkbuilddir run gdb