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
