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
avm/Makefile
Aryadev Chavali f725c2a668 Started developing a unit test module
Folder per module in test/.  Header only tests with one actual main
file to implement a program that runs them.

Makefile runs the test and provides some eye candy to show if the test
succeeded or failed.  The tests, on the other hand, will show success
or failure for each of them.
2024-04-28 15:33:47 +05:30

119 lines
2.8 KiB
Makefile

CC=gcc
VERBOSE=0
GENERAL-FLAGS:=-Wall -Wextra -Werror -Wswitch-enum -I$(shell pwd) -std=c11
DEBUG-FLAGS=-ggdb -fsanitize=address
RELEASE-FLAGS=-O3
CFLAGS:=$(GENERAL-FLAGS) $(DEBUG-FLAGS) -D VERBOSE=$(VERBOSE)
LIBS=-lm
DIST=build
TERM_YELLOW:=$(shell echo -e "\e[0;33m")
TERM_RED:=$(shell echo -e "\e[0;31m")
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)
## VM setup
VM_DIST=$(DIST)/vm
VM_SRC=vm
VM_CODE:=$(addprefix $(VM_SRC)/, struct.c runtime.c)
VM_OBJECTS:=$(VM_CODE:$(VM_SRC)/%.c=$(VM_DIST)/%.o)
VM_OUT=$(DIST)/avm.out
## Test setup
TEST_DIST=$(DIST)/test
TEST_SRC=test
TEST_LIB_CFLAGS:=$(GENERAL-FLAGS) -I$(TEST_SRC) $(DEBUG-FLAGS) -D VERBOSE=$(VERBOSE)
TEST_LIB_SRC=$(TEST_SRC)/lib
TEST_LIB_DIST=$(TEST_DIST)/lib
TEST_LIB_OUT=$(DIST)/test-lib.out
## Dependencies
DEPDIR:=$(DIST)/dependencies
DEPFLAGS = -MT $@ -MMD -MP -MF
DEPS:=$(LIB_CODE:$(LIB_SRC)/%.c=$(DEPDIR)/lib/%.d) $(VM_CODE:$(VM_SRC)/%.c=$(DEPDIR)/vm/%.d) $(DEPDIR)/vm/main.d $(DEPDIR)/test/lib/main.d
# Things you want to build on `make`
all: $(DIST) lib vm run-test-lib
lib: $(LIB_OBJECTS)
vm: $(VM_OUT)
test-lib: $(TEST_LIB_OUT)
# Recipes
$(LIB_DIST)/%.o: $(LIB_SRC)/%.c | $(LIB_DIST) $(DEPDIR)/lib
@$(CC) $(CFLAGS) $(DEPFLAGS) $(DEPDIR)/lib/$*.d -c $< -o $@ $(LIBS)
@echo "$(TERM_YELLOW)$@$(TERM_RESET): $<"
$(VM_OUT): $(LIB_OBJECTS) $(VM_OBJECTS) $(VM_DIST)/main.o
@$(CC) $(CFLAGS) $^ -o $@ $(LIBS)
@echo "$(TERM_GREEN)$@$(TERM_RESET): $^"
$(VM_DIST)/%.o: $(VM_SRC)/%.c | $(VM_DIST) $(DEPDIR)/vm
@$(CC) $(CFLAGS) $(DEPFLAGS) $(DEPDIR)/vm/$*.d -c $< -o $@ $(LIBS)
@echo "$(TERM_YELLOW)$@$(TERM_RESET): $<"
$(TEST_LIB_OUT): $(LIB_OBJECTS) $(TEST_LIB_DIST)/main.o
@$(CC) $(CFLAGS) $^ -o $@ $(LIBS)
@echo "$(TERM_GREEN)$@$(TERM_RESET): $^"
$(TEST_LIB_DIST)/main.o: $(TEST_LIB_SRC)/main.c | $(TEST_LIB_DIST) $(DEPDIR)/test/lib
@$(CC) $(TEST_LIB_CFLAGS) $(DEPFLAGS) $(DEPDIR)/test/lib/main.d -c $< -o $@ $(LIBS)
@echo "$(TERM_YELLOW)$@$(TERM_RESET): $<"
.PHONY: run-test-lib
.ONESHELL:
run-test-lib: $(TEST_LIB_OUT)
@echo "$(TERM_YELLOW)test/lib$(TERM_RESET): Starting test"
@./$^;
if [ $$? -ne 0 ];
then
echo "$(TERM_RED)test/lib$(TERM_RESET): Test failed";
else
echo "$(TERM_GREEN)test/lib$(TERM_RESET): Test succeeded";
fi
.PHONY: run
run: $(DIST)/$(VM_OUT)
./$^ $(ARGS)
.PHONY: clean
clean:
rm -rfv $(DIST)/*
.PHONY: interpret
interpret: $(VM_OUT)
@$(VM_OUT) $(BYTECODE)
# Directories
$(DIST):
mkdir -p $@
$(LIB_DIST):
mkdir -p $@
$(VM_DIST):
mkdir -p $@
$(TEST_LIB_DIST):
mkdir -p $@
$(DEPDIR)/lib:
mkdir -p $@
$(DEPDIR)/vm:
mkdir -p $@
$(DEPDIR)/test/lib:
mkdir -p $@
-include $(wildcard $(DEPS))