# 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

GITHASH = $(shell git rev-parse --short HEAD)

# Specify the target binary (call it whatever)
TARGET = build/program
TARGET_TAR = $(TARGET)-$(GITHASH).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)

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

# Create the build directory
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)

# Format with clang-format
format: $(SRCS)
	clang-format -i $^

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

# Create a signed release
tar: $(TARGET_TAR)

# Sign the tar
sign: $(TARGET_SIG)

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

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

.PHONY: all clean size mkbuilddir run tar sign