CC=clang CFLAGS = -Wall -Wextra ifeq ($(OS),Windows_NT) CFLAGS += -D WIN32 ifeq ($(PROCESSOR_ARCHITEW6432),AMD64) CFLAGS += -D AMD64 else ifeq ($(PROCESSOR_ARCHITECTURE),AMD64) CFLAGS += -D AMD64 endif ifeq ($(PROCESSOR_ARCHITECTURE),x86) CFLAGS += -D IA32 endif endif RELEASE_TARGET=bin/lbs.exe DEBUG_TARGET=bin/lbs-dbg.exe else UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) CFLAGS += -D LINUX endif ifeq ($(UNAME_S),Darwin) CFLAGS += -D OSX endif UNAME_P := $(shell uname -p) ifeq ($(UNAME_P),x86_64) CFLAGS += -D AMD64 endif ifneq ($(filter %86,$(UNAME_P)),) CFLAGS += -D IA32 endif ifneq ($(filter arm%,$(UNAME_P)),) CFLAGS += -D ARM endif RELEASE_TARGET=bin/lbs DEBUG_TARGET=bin/lbs-dbg endif # If the first argument is "modules"... ifeq (modules,$(firstword $(MAKECMDGOALS))) # use the rest as arguments for "run" MODULE_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) # ...and turn them into do-nothing targets $(eval $(MODULE_ARGS):;@:) endif rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) SRC_FILES=$(call rwildcard, src, *.c) OBJ_FILES=$(addprefix obj/, $(SRC_FILES:.c=.o)) modules: cd modules && $(MAKE) $(MODULE_ARGS) obj/src/%.o: src/%.c $(CC) $(CFLAGS) -c $(@:obj/%.o=%.c) -o $@ release: $(RELEASE_TARGET) $(RELEASE_TARGET): $(OBJ_FILES) $(CC) $(LFLAGS) $^ -o $@ debug: $(DEBUG_TARGET) $(DEBUG_TARGET): $(OBJ_FILES) $(CC) $(LFLAGS) $^ -o $@ clean: echo TODO