clox/Makefile

83 lines
1.3 KiB
Makefile

# 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)