.PHONY: all build release run test clean fmt help install container registry-login container-build container-push # Project configuration PROJECT_NAME := jormundb ODIN := odin BUILD_DIR := build SRC_DIR := . # Container configuration REGISTRY := atl.vultrcr.com/jormun IMAGE_NAME := jormundb IMAGE_TAG ?= latest FULL_IMAGE := $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) # Registry credentials CR_USER ?= $(error CR_USER is not set) CR_PASS ?= $(error CR_PASS is not set) # C++ shim (WAL replication helpers via RocksDB C++ API) SHIM_DIR := rocksdb_shim SHIM_LIB := $(BUILD_DIR)/libjormun_rocksdb_shim.a SHIM_SRCS := $(SHIM_DIR)/rocksdb_shim.cc SHIM_HDRS := $(SHIM_DIR)/rocksdb_shim.h CXX := g++ AR := ar CXXFLAGS := -O2 -fPIC -std=c++20 $(INCLUDE_PATH) # RocksDB and compression libraries ROCKSDB_LIBS := -lrocksdb -lstdc++ -lsnappy -llz4 -lzstd -lz -lbz2 # Platform-specific library paths UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) # macOS (Homebrew) LIB_PATH := -L/usr/local/lib -L/opt/homebrew/lib INCLUDE_PATH := -I/usr/local/include -I/opt/homebrew/include else ifeq ($(UNAME_S),Linux) # Linux LIB_PATH := -L/usr/local/lib -L/usr/lib INCLUDE_PATH := -I/usr/local/include endif # Build flags DEBUG_FLAGS := -debug -o:none RELEASE_FLAGS := -o:speed -disable-assert -no-bounds-check COMMON_FLAGS := -vet -strict-style # Linker flags EXTRA_LINKER_FLAGS = $(LIB_PATH) $(SHIM_LIB) $(ROCKSDB_LIBS) # Runtime configuration PORT ?= 8002 HOST ?= 0.0.0.0 DATA_DIR ?= ./data # Colors for output BLUE := \033[0;34m GREEN := \033[0;32m YELLOW := \033[0;33m RED := \033[0;31m NC := \033[0m # No Color # To this use a sentinel file instead of the dir name $(BUILD_DIR)/.dir: @mkdir -p $(BUILD_DIR) @touch $(BUILD_DIR)/.dir $(SHIM_LIB): $(SHIM_SRCS) $(SHIM_HDRS) | $(BUILD_DIR)/.dir @echo "$(BLUE)Building RocksDB C++ shim...$(NC)" $(CXX) $(CXXFLAGS) -c $(SHIM_SRCS) -o $(BUILD_DIR)/rocksdb_shim.o $(AR) rcs $(SHIM_LIB) $(BUILD_DIR)/rocksdb_shim.o @echo "$(GREEN)✓ Built: $(SHIM_LIB)$(NC)" # Default target all: build build: $(SHIM_LIB) | $(BUILD_DIR)/.dir @echo "$(BLUE)Building $(PROJECT_NAME) (debug)...$(NC)" $(ODIN) build $(SRC_DIR) \ $(COMMON_FLAGS) \ $(DEBUG_FLAGS) \ -out:$(BUILD_DIR)/$(PROJECT_NAME) \ -extra-linker-flags:"$(EXTRA_LINKER_FLAGS)" @echo "$(GREEN)✓ Build complete: $(BUILD_DIR)/$(PROJECT_NAME)$(NC)" release: $(SHIM_LIB) | $(BUILD_DIR)/.dir @echo "$(BLUE)Building $(PROJECT_NAME) (release)...$(NC)" $(ODIN) build $(SRC_DIR) \ $(COMMON_FLAGS) \ $(RELEASE_FLAGS) \ -out:$(BUILD_DIR)/$(PROJECT_NAME) \ -extra-linker-flags:"$(EXTRA_LINKER_FLAGS)" @echo "$(GREEN)✓ Release build complete: $(BUILD_DIR)/$(PROJECT_NAME)$(NC)" # Run the server run: build @echo "$(BLUE)Starting $(PROJECT_NAME)...$(NC)" @mkdir -p $(DATA_DIR) @JORMUN_PORT=$(PORT) \ JORMUN_HOST=$(HOST) \ JORMUN_DATA_DIR=$(DATA_DIR) \ $(BUILD_DIR)/$(PROJECT_NAME) # Run with custom port run-port: build @echo "$(BLUE)Starting $(PROJECT_NAME) on port $(PORT)...$(NC)" @mkdir -p $(DATA_DIR) @JORMUN_PORT=$(PORT) $(BUILD_DIR)/$(PROJECT_NAME) # Run tests test: @echo "$(BLUE)Running tests...$(NC)" $(ODIN) test $(SRC_DIR) \ $(COMMON_FLAGS) \ $(DEBUG_FLAGS) \ -extra-linker-flags:"$(EXTRA_LINKER_FLAGS)" @echo "$(GREEN)✓ Tests passed$(NC)" # Format code fmt: @echo "$(BLUE)Formatting code...$(NC)" @find $(SRC_DIR) -name "*.odin" -exec odin-format -w {} \; @echo "$(GREEN)✓ Code formatted$(NC)" # Clean build artifacts clean: @echo "$(YELLOW)Cleaning build artifacts...$(NC)" @rm -rf $(BUILD_DIR) @rm -rf $(DATA_DIR) @echo "$(GREEN)✓ Clean complete$(NC)" # Install to /usr/local/bin (requires sudo) install: release @echo "$(BLUE)Installing $(PROJECT_NAME)...$(NC)" @sudo cp $(BUILD_DIR)/$(PROJECT_NAME) /usr/local/bin/ @sudo chmod +x /usr/local/bin/$(PROJECT_NAME) @echo "$(GREEN)✓ Installed to /usr/local/bin/$(PROJECT_NAME)$(NC)" # Uninstall from /usr/local/bin uninstall: @echo "$(YELLOW)Uninstalling $(PROJECT_NAME)...$(NC)" @sudo rm -f /usr/local/bin/$(PROJECT_NAME) @echo "$(GREEN)✓ Uninstalled$(NC)" # Check dependencies check-deps: @echo "$(BLUE)Checking dependencies...$(NC)" @which $(ODIN) > /dev/null || (echo "$(RED)✗ Odin compiler not found$(NC)" && exit 1) @pkg-config --exists rocksdb || (echo "$(RED)✗ RocksDB not found$(NC)" && exit 1) @echo "$(GREEN)✓ All dependencies found$(NC)" # Development workflow dev: clean build run # Quick rebuild and run quick: @$(MAKE) build run # Login to container registry registry-login: @echo "$(BLUE)Logging into container registry...$(NC)" @echo "$(CR_PASS)" | docker login https://$(REGISTRY) -u $(CR_USER) --password-stdin @echo "$(GREEN)✓ Logged in to $(REGISTRY)$(NC)" # Build container image container-build: @echo "$(BLUE)Building container image $(FULL_IMAGE)...$(NC)" docker build -t $(FULL_IMAGE) . @echo "$(GREEN)✓ Built: $(FULL_IMAGE)$(NC)" # Push container image container-push: @echo "$(BLUE)Pushing $(FULL_IMAGE)...$(NC)" docker push $(FULL_IMAGE) @echo "$(GREEN)✓ Pushed: $(FULL_IMAGE)$(NC)" # Login, build, and push in one shot container: registry-login container-build container-push @echo "$(GREEN)✓ Container $(FULL_IMAGE) built and pushed$(NC)" # Show help help: @echo "$(BLUE)JormunDB - DynamoDB-compatible database$(NC)" @echo "" @echo "$(GREEN)Build Commands:$(NC)" @echo " make build - Build debug version" @echo " make release - Build optimized release version" @echo " make clean - Remove build artifacts" @echo "" @echo "$(GREEN)Run Commands:$(NC)" @echo " make run - Build and run server (default: localhost:8002)" @echo " make run PORT=9000 - Run on custom port" @echo " make dev - Clean, build, and run" @echo " make quick - Fast rebuild and run" @echo "" @echo "$(GREEN)Test Commands:$(NC)" @echo " make test - Run unit tests" @echo "" @echo "$(GREEN)Utility Commands:$(NC)" @echo " make fmt - Format source code" @echo " make check-deps - Check for required dependencies" @echo " make install - Install to /usr/local/bin (requires sudo)" @echo " make uninstall - Remove from /usr/local/bin" @echo "" @echo "$(GREEN)Configuration:$(NC)" @echo " PORT=$(PORT) - Server port" @echo " HOST=$(HOST) - Bind address" @echo " DATA_DIR=$(DATA_DIR) - RocksDB data directory" @echo "" @echo "$(GREEN)Examples:$(NC)" @echo " make run PORT=9000" @echo " make dev"