# Detect OS ifeq ($(OS),Windows_NT) ISWIN := 1 endif ifdef ISWIN CC := i686-w64-mingw32-gcc else CC := gcc endif RM ?= rm -f RMDIR ?= rm -rf MKDIR ?= mkdir -p WARFLAGS := -Wall #-Wextra -pedantic CFLAGS_g := $(WARFLAGS) -std=gnu11 -O2 -msse2 -ffast-math -mfpmath=sse -DNDEBUG \ -MMD LDFLAGS_g := -s # object output dir OBJDIR_g := obj_g SRCS := $(wildcard *.c) OBJS_g := $(SRCS:.c=.o) # include dirs CFLAGS_g += # libs ifdef ISWIN LDFLAGS_g += else CFLAGS_g += LDFLAGS_g += endif # binary target ifdef ISWIN TARG_g := clox.exe else TARG_g := clox endif game: $(TARG_g) @echo "*** Target '$@': '$^' is up to date!" default: game .PHONY: default game clean # rewrite OBJS so it outputs object files to seperate dir OBJS_g := $(patsubst %,$(OBJDIR_g)/%,$(OBJS_g)) # include the dependency rules generated by -MMD -include $(OBJS_g:.o=.d) clean: @echo "*** Removing target binary and object directory..." @$(RM) $(TARG_g) @$(RMDIR) $(OBJDIR_g) @echo "*** Done." # Compile $(OBJDIR_g)/%.o: %.c @$(MKDIR) $(@D) @echo "*** Compiling '$<' ..." @$(CC) $(CFLAGS_g) -c $< -o $@ # Link $(TARG_g): $(OBJS_g) @$(MKDIR) $(@D) @echo "\n*** Linking binary target '$@' ...\n" @$(CC) $(OBJS_g) -o $@ $(LDFLAGS_g)