I've decided to split the module parsing into two modules, one for the preprocessing stage which only deals with tokens and the parsing stage which generates bytecode.
137 lines
3.2 KiB
Makefile
137 lines
3.2 KiB
Makefile
CC=gcc
|
|
CPP=g++
|
|
|
|
VERBOSE=0
|
|
GENERAL-FLAGS=-Wall -Wextra -Werror -Wswitch-enum -I$(shell pwd)
|
|
DEBUG-FLAGS=-ggdb -fsanitize=address
|
|
RELEASE-FLAGS=-O3
|
|
CFLAGS:=$(GENERAL-FLAGS) -std=c11 $(DEBUG-FLAGS) -D VERBOSE=$(VERBOSE)
|
|
CPPFLAGS:=$(GENERAL-FLAGS) -std=c++17 $(DEBUG-FLAGS) -D VERBOSE=$(VERBOSE)
|
|
|
|
LIBS=-lm
|
|
DIST=build
|
|
TERM_YELLOW:=$(shell echo -e "\e[0;33m")
|
|
TERM_GREEN:=$(shell echo -e "\e[0;32m")
|
|
TERM_RESET:=$(shell echo -e "\e[0;0m")
|
|
|
|
# Setup variables for source code, output, etc
|
|
## Lib setup
|
|
LIB_DIST=$(DIST)/lib
|
|
LIB_SRC=lib
|
|
LIB_CODE:=$(addprefix $(LIB_SRC)/, base.c darr.c heap.c inst.c)
|
|
LIB_OBJECTS:=$(LIB_CODE:$(LIB_SRC)/%.c=$(LIB_DIST)/%.o)
|
|
LIB_DEPS:=$(LIB_OBJECTS:%.o=%.d)
|
|
LIB_CFLAGS=$(CFLAGS)
|
|
|
|
## VM setup
|
|
VM_DIST=$(DIST)/vm
|
|
VM_SRC=vm
|
|
VM_CODE:=$(addprefix $(VM_SRC)/, runtime.c)
|
|
VM_OBJECTS:=$(VM_CODE:$(VM_SRC)/%.c=$(VM_DIST)/%.o)
|
|
VM_DEPS:=$(VM_OBJECTS:%.o=%.d) $(VM_DIST)/main.d
|
|
VM_CFLAGS:=$(CFLAGS)
|
|
VM_OUT=$(DIST)/ovm.out
|
|
|
|
## ASSEMBLY setup
|
|
ASM_DIST=$(DIST)/asm
|
|
ASM_SRC=asm
|
|
ASM_CODE:=$(addprefix $(ASM_SRC)/, lexer.cpp, preprocesser.cpp)
|
|
ASM_OBJECTS:=$(ASM_CODE:$(ASM_SRC)/%.cpp=$(ASM_DIST)/%.o)
|
|
ASM_DEPS:=$(ASM_OBJECTS:%.o=%.d) $(ASM_DIST)/main.d
|
|
ASM_CFLAGS=$(CPPFLAGS)
|
|
ASM_OUT=$(DIST)/asm.out
|
|
|
|
## EXAMPLES setup
|
|
EXAMPLES_DIST=$(DIST)/examples
|
|
EXAMPLES_SRC=examples
|
|
EXAMPLES=$(EXAMPLES_DIST)/instruction-test.out $(EXAMPLES_DIST)/fib.out $(EXAMPLES_DIST)/factorial.out $(EXAMPLES_DIST)/memory-print.out
|
|
|
|
# Things you want to build on `make`
|
|
all: $(DIST) lib vm asm examples
|
|
|
|
lib: $(LIB_DIST) $(LIB_OBJECTS)
|
|
vm: $(VM_DIST) $(VM_OUT)
|
|
asm: $(ASM_DIST) $(ASM_OUT)
|
|
examples: $(EXAMPLES_DIST) $(EXAMPLES)
|
|
|
|
# Recipes
|
|
## LIB Recipes
|
|
-include $(LIB_DEPS)
|
|
|
|
$(LIB_DIST)/%.o: $(LIB_SRC)/%.c
|
|
@$(CC) $(LIB_CFLAGS) -MMD -c $< -o $@ $(LIBS)
|
|
@echo "$(TERM_YELLOW)$@$(TERM_RESET): $<"
|
|
|
|
## VM Recipes
|
|
$(VM_OUT): $(LIB_OBJECTS) $(VM_OBJECTS) $(VM_DIST)/main.o
|
|
@$(CC) $(VM_CFLAGS) $^ -o $@ $(LIBS)
|
|
@echo "$(TERM_GREEN)$@$(TERM_RESET): $^"
|
|
|
|
-include $(VM_DEPS)
|
|
|
|
$(VM_DIST)/%.o: $(VM_SRC)/%.c
|
|
@$(CC) $(VM_CFLAGS) -MMD -c $< -o $@ $(LIBS)
|
|
@echo "$(TERM_YELLOW)$@$(TERM_RESET): $<"
|
|
|
|
## ASSEMBLY Recipes
|
|
$(ASM_OUT): $(LIB_OBJECTS) $(ASM_OBJECTS) $(ASM_DIST)/main.o
|
|
@$(CPP) $(ASM_CFLAGS) $^ -o $@ $(LIBS)
|
|
@echo "$(TERM_GREEN)$@$(TERM_RESET): $^"
|
|
|
|
-include $(ASM_DEPS)
|
|
|
|
$(ASM_DIST)/%.o: $(ASM_SRC)/%.cpp
|
|
$(CPP) $(ASM_CFLAGS) -MMD -c $< -o $@ $(LIBS)
|
|
echo "$(TERM_YELLOW)$@$(TERM_RESET): $<"
|
|
|
|
## EXAMPLES recipes
|
|
$(EXAMPLES_DIST)/%.out: $(EXAMPLES_SRC)/%.asm $(ASM_OUT)
|
|
@$(ASM_OUT) $< $@
|
|
@echo "$(TERM_GREEN)$@$(TERM_RESET): $<"
|
|
|
|
.PHONY: run-examples
|
|
run-examples: $(EXAMPLES)
|
|
@$(foreach example,$(EXAMPLES), echo "$(TERM_YELLOW)$(example)$(TERM_RESET)"; $(MAKE) -s interpret BYTECODE=$(example);)
|
|
|
|
OUT=
|
|
ARGS=
|
|
|
|
.PHONY: run
|
|
run: $(DIST)/$(OUT)
|
|
./$^ $(ARGS)
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
rm -rfv $(DIST)/*
|
|
|
|
SOURCE=
|
|
BYTECODE=
|
|
.PHONY: assemble
|
|
assemble: $(ASM_OUT)
|
|
@$(ASM_OUT) $(SOURCE) $(BYTECODE)
|
|
|
|
.PHONY: interpret
|
|
interpret: $(VM_OUT)
|
|
@$(VM_OUT) $(BYTECODE)
|
|
|
|
.PHONY: exec
|
|
exec: $(ASM_OUT) $(VM_OUT)
|
|
@$(ASM_OUT) $(SOURCE) $(BYTECODE)
|
|
@$(VM_OUT) $(BYTECODE)
|
|
|
|
# Directories
|
|
$(DIST):
|
|
mkdir -p $(DIST)
|
|
|
|
$(LIB_DIST):
|
|
mkdir -p $(LIB_DIST)
|
|
|
|
$(VM_DIST):
|
|
mkdir -p $(VM_DIST)
|
|
|
|
$(ASM_DIST):
|
|
mkdir -p $(ASM_DIST)
|
|
|
|
$(EXAMPLES_DIST):
|
|
mkdir -p $(EXAMPLES_DIST)
|