This repository has been archived on 2025-11-10. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
aal/Makefile
Aryadev Chavali 0ebbf3ca75 Start writing assembler in C++
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!
2024-04-14 02:45:48 +06:30

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)