Best language to use as it's already compatible with the headers I'm using and can pretty neatly enter the build system while also using the functions I've built for converting to and from bytecode!
137 lines
3.1 KiB
Makefile
137 lines
3.1 KiB
Makefile
CC=gcc
|
|
CPP=g++
|
|
|
|
VERBOSE=0
|
|
GENERAL-FLAGS=-Wall -Wextra -Werror -Wswitch-enum -I.
|
|
DEBUG-FLAGS=-ggdb -fsanitize=address
|
|
RELEASE-FLAGS=-O3
|
|
CFLAGS:=$(GENERAL-FLAGS) -std=c11 $(DEBUG-FLAGS) -D VERBOSE=$(VERBOSE)
|
|
CPPFLAGS:=$(GENERAL_FLAGS) $(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)/, )
|
|
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)
|