SHELL = bash .SHELLFLAGS = -O globstar -c NAME = tetris VERSION = 0.0.3 DEBUG ?= 0 CC ?= cc LD ?= ld MARCH ?= $(shell uname -m) KERNEL ?= $(shell uname -s) CFLAGS += -c -std=gnu99 -Wall -Wextra -Wpedantic -MMD -MP LDFLAGS += -flto ifeq ($(KERNEL),) ISWIN := $(if $(filter $(OS),Windows_NT),1,0) ifeq ($(ISWIN),1) KERNEL = mingw MARCH = x86_64 else MARCH := $(shell uname -m) KERNEL := $(shell uname -s | tr '[:upper:]' '[:lower:]') endif else ISWIN := $(if $(filter $(KERNEL),mingw),1,0) endif ifeq ($(MARCH),) $(error must also set MARCH when manually setting KERNEL) endif ifeq ($(DEBUG),1) PROF = dbg CFLAGS += -UNDEBUG -Og -g -Wextra -Wpedantic CFLAGS += $(if $(filter 1,$(ISWIN)),,-fsanitize=address,undefined) -ftrapv LDFLAGS += $(if $(filter 1,$(ISWIN)),,-fsanitize=address,undefined) -ftrapv else PROF = rel CFLAGS += -DNDEBUG -O3 endif CFLAGS += $(shell pkg-config --cflags glfw3) -Ilib/glad/include LDFLAGS += $(shell pkg-config --libs glfw3) -lm SRC := $(shell echo src/**/*.c) lib/glad/src/gl.c RES := $(shell echo res/**.glsl) NAME += $(if $(filter 1,$(ISWIN)),.exe,) DIR_BIN := bin/$(MARCH)-$(KERNEL)/$(VERSION)/$(PROF) DIR_OBJ := obj/$(MARCH)-$(KERNEL)/$(VERSION)/$(PROF) BIN := $(DIR_BIN)/$(NAME) OBJ := $(SRC:%.c=$(DIR_OBJ)/%.o) $(RES:%=$(DIR_OBJ)/%.o) DEP := $(OBJ:%.o=%.d) .PHONY: run: compile $(BIN) .PHONY: compile: $(BIN) .PHONY .NOTPARALLEL: clean: @[ -d obj/ ] && rm -rv obj/ || true @[ -d bin/ ] && rm -rv bin/ || true $(BIN): $(OBJ) $(info [CC/LD] $@) @mkdir -p $(@D) @$(CC) -o $@ $^ $(LDFLAGS) $(DIR_OBJ)/%.o: %.c $(info [CC] $@) @mkdir -p $(@D) @$(CC) $(CFLAGS) -o $@ $< $(DIR_OBJ)/res/%.o: res/% $(info [LD] $@) @mkdir -p $(@D) @$(LD) -r -b binary -o $@ $< .PHONY: x86_64-linux-gnu-gcc x86_64-w64-mingw32-gcc x86_64-linux-gnu-gcc:; $(MAKE) $(CALL) $(MAKEFLAGS) CC=$@ MARCH=x86_64 KERNEL=linux x86_64-w64-mingw32-gcc:; $(MAKE) $(CALL) $(MAKEFLAGS) CC=$@ MARCH=x86_64 KERNEL=mingw -include $(DEP)