add Makefile
diff --git a/.gitignore b/.gitignore
index 7dae8e6..d556ffd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@
 CMakeFiles
 CMakeScripts
 Testing
-Makefile
 cmake_install.cmake
 install_manifest.txt
 compile_commands.json
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b6ca0a1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,43 @@
+
+# Whether to turn compiler warnings into errors
+export WERROR ?= true
+export BUILD_DIR ?= cmake-build
+
+default: release
+
+release:
+	mkdir -p ./$(BUILD_DIR) && cd ./$(BUILD_DIR) && cmake ../ -DCMAKE_BUILD_TYPE=Release -DWERROR=$(WERROR) && VERBOSE=1 cmake --build .
+
+debug:
+	mkdir -p ./$(BUILD_DIR) && cd ./$(BUILD_DIR) && cmake ../ -DCMAKE_BUILD_TYPE=Debug -DWERROR=$(WERROR) && VERBOSE=1 cmake --build .
+
+test:
+	@if [ -f ./$(BUILD_DIR)/unit-tests ]; then ./$(BUILD_DIR)/unit-tests; else echo "Please run 'make release' or 'make debug' first" && exit 1; fi
+
+bench:
+	@if [ -f ./$(BUILD_DIR)/bench-tests ]; then ./$(BUILD_DIR)/bench-tests; else echo "Please run 'make release' or 'make debug' first" && exit 1; fi
+
+tidy:
+	@echo "not implmented"
+
+coverage:
+	@echo "not implmented"
+
+clean:
+	rm -rf ./$(BUILD_DIR)
+	# remove remains from running 'make coverage'
+	rm -f *.profraw
+	rm -f *.profdata
+	@echo "run 'make distclean' to also clear mason_packages, .mason, and .toolchain directories"
+
+distclean: clean
+	rm -rf mason_packages
+	# remove remains from running './scripts/setup.sh'
+	rm -rf .mason
+	rm -rf .toolchain
+	rm -f local.env
+
+format:
+	@echo "not implmented"
+
+.PHONY: test bench
\ No newline at end of file