MAKEFLAGS += -rR
.SUFFIXES:

TOOLCHAIN_PREFIX := $(shell cd ../../.. && pwd)/toolchain/local/bin/x86_64-elf-
ifneq ($(wildcard $(TOOLCHAIN_PREFIX)gcc),)
    CC := $(TOOLCHAIN_PREFIX)gcc
    AR := $(TOOLCHAIN_PREFIX)ar
else
    CC := gcc
    AR := ar
endif

SRCDIR   := src
OBJDIR   := obj
LIBC_DIR := ../../lib/libc
BINDIR   := ../../bin/os
LIBDIR   := ../../bin/lib/lua

CFLAGS := \
    -std=gnu11 \
    -g -O2 -pipe \
    -Wall \
    -Wextra \
    -Wno-unused-parameter \
    -Wno-unused-function \
    -Wno-sign-compare \
    -Wno-misleading-indentation \
    -Wno-implicit-fallthrough \
    -nostdinc \
    -ffreestanding \
    -fno-stack-protector \
    -fno-stack-check \
    -fno-PIC \
    -ffunction-sections \
    -fdata-sections \
    -m64 \
    -march=x86-64 \
    -msse \
    -msse2 \
    -mno-red-zone \
    -mcmodel=small \
    -D__MONTAUKOS__=1 \
    -DLUA_COMPAT_5_3 \
    -I$(SRCDIR) \
    -isystem ../../include/libc \
    -isystem $(shell $(CC) -print-file-name=include)

LDFLAGS := \
    -nostdlib \
    -static \
    -Wl,--build-id=none \
    -Wl,--gc-sections \
    -Wl,-m,elf_x86_64 \
    -z max-page-size=0x1000 \
    -T ../../link.ld

CORE_SRCS := \
    lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c \
    lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c \
    ltm.c lundump.c lvm.c lzio.c

LIB_SRCS := \
    lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c lmathlib.c loadlib.c \
    loslib.c lstrlib.c ltablib.c lutf8lib.c linit.c

BASE_SRCS := $(CORE_SRCS) $(LIB_SRCS)
BASE_OBJS := $(addprefix $(OBJDIR)/,$(BASE_SRCS:.c=.o))
LUA_MAIN  := $(OBJDIR)/lua.o

TARGET_LIB := $(LIBDIR)/liblua.a
TARGET_BIN := $(BINDIR)/lua.elf
STAGE_HEADERS := \
    $(LIBDIR)/include/lua.h \
    $(LIBDIR)/include/lauxlib.h \
    $(LIBDIR)/include/luaconf.h \
    $(LIBDIR)/include/lualib.h \
    $(LIBDIR)/include/lua.hpp

.PHONY: all clean

all: $(TARGET_LIB) $(TARGET_BIN) $(STAGE_HEADERS)

$(TARGET_LIB): $(BASE_OBJS) $(LIBC_DIR)/liblibc.a
	@mkdir -p $(LIBDIR)
	$(AR) rcs $@ $(BASE_OBJS)

$(TARGET_BIN): $(LUA_MAIN) $(TARGET_LIB) $(LIBC_DIR)/liblibc.a $(LIBC_DIR)/crt1.o $(LIBC_DIR)/crti.o $(LIBC_DIR)/crtn.o
	@mkdir -p $(BINDIR)
	$(CC) $(CFLAGS) $(LDFLAGS) \
		$(LIBC_DIR)/crt1.o $(LIBC_DIR)/crti.o \
		$(LUA_MAIN) $(TARGET_LIB) $(LIBC_DIR)/liblibc.a $(LIBC_DIR)/crtn.o \
		-lgcc -o $@

$(LIBDIR)/include/%: $(SRCDIR)/%
	@mkdir -p $(LIBDIR)/include
	cp $< $@

$(OBJDIR)/%.o: $(SRCDIR)/%.c Makefile
	@mkdir -p $(OBJDIR)
	$(CC) $(CFLAGS) -MMD -MP -c $< -o $@

clean:
	rm -rf $(OBJDIR) $(TARGET_BIN) $(TARGET_LIB) $(LIBDIR)/include

# Auto-generated header dependency tracking (-MMD -MP).
-include $(BASE_OBJS:.o=.d)
