214 lines
6.4 KiB
Makefile
214 lines
6.4 KiB
Makefile
.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"
|