.PHONY: help build run test clean docker-up docker-down docker-logs docker-reset dev
.PHONY: build-linux-arm64 build-linux-amd64 build-all-platforms docker-build docker-build-multiarch docker-push
# Variables
DOCKER_REGISTRY ?= docker.io
DOCKER_USERNAME ?= binarytouch
DOCKER_IMAGE ?= meilibridge
# Get clean version from git tag (remove 'v' prefix if present)
VERSION ?= $(shell git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo "latest")
# For builds not on exact tags, use git describe for informational purposes
FULL_VERSION ?= $(shell git describe --tags --always --dirty)
PLATFORMS ?= linux/amd64,linux/arm64
# Default target
help:
@echo "MeiliBridge Development Commands:"
@echo " make build - Build the project in release mode"
@echo " make dev - Build the project in debug mode"
@echo " make run - Run MeiliBridge with local config"
@echo " make test - Run all tests"
@echo " make clean - Clean build artifacts"
@echo ""
@echo "Cross-Platform Build Commands:"
@echo " make build-linux-arm64 - Build for Linux ARM64 using Docker"
@echo " make build-linux-amd64 - Build for Linux AMD64 using Docker"
@echo " make build-all-platforms - Build for all platforms"
@echo " make package-linux-arm64 - Package ARM64 binary as tar.gz"
@echo ""
@echo "Docker Commands:"
@echo " make docker-up - Start all Docker services"
@echo " make docker-down - Stop all Docker services"
@echo " make docker-logs - View logs from all services"
@echo " make docker-reset - Reset all data (WARNING: destructive)"
@echo " make docker-build - Build Docker image for current platform"
@echo " make docker-build-multiarch - Build multi-arch Docker image"
@echo " make docker-push - Push multi-arch image to registry"
@echo ""
@echo "Quick Start:"
@echo " make docker-up - Start services"
@echo " make dev - Build MeiliBridge"
@echo " make run - Run MeiliBridge"
# Build commands
build:
cargo build --release
dev:
cargo build
run:
cargo run -- --config config.yaml
test:
cargo test
clean:
cargo clean
rm -rf logs/
# Docker commands
docker-up:
@echo "Starting Docker services..."
docker compose -f docker/compose.yaml up -d
@echo "Waiting for services to be healthy..."
@sleep 5
@docker compose -f docker/compose.yaml ps
@echo ""
@echo "Services are running:"
@echo " PostgreSQL: localhost:5433"
@echo " Redis: localhost:6380"
@echo " Meilisearch: http://localhost:7700"
@echo " Meilisearch UI: http://localhost:24900"
@echo " Adminer: http://localhost:8090"
@echo " RedisInsight: http://localhost:8001"
@echo ""
@echo "Run 'make run' to start MeiliBridge"
docker-down:
docker compose -f docker/compose.yaml down
docker-logs:
docker compose -f docker/compose.yaml logs -f
docker-reset:
@echo "WARNING: This will delete all Docker volumes and data!"
@echo "Press Ctrl+C to cancel, or wait 5 seconds to continue..."
@sleep 5
docker compose -f docker/compose.yaml down -v
@echo "All data has been reset"
# Combined commands
quick-start: docker-up dev run
# Development helpers
watch:
cargo watch -x run
fmt:
cargo fmt
lint:
cargo clippy -- -D warnings
# Check if services are healthy
check-services:
@echo "Checking service health..."
@curl -s http://localhost:7700/health > /dev/null && echo "✓ Meilisearch is healthy" || echo "✗ Meilisearch is not responding"
@docker exec meilibridge-postgres pg_isready > /dev/null 2>&1 && echo "✓ PostgreSQL is healthy" || echo "✗ PostgreSQL is not responding"
@docker exec meilibridge-redis redis-cli ping > /dev/null 2>&1 && echo "✓ Redis is healthy" || echo "✗ Redis is not responding"
# Generate sample data
sample-data:
@echo "Inserting sample data into PostgreSQL..."
@docker exec meilibridge-postgres psql -U postgres -d meilibridge_dev -c "INSERT INTO users (email, first_name, last_name, age, metadata) VALUES ('alice.johnson@example.com', 'Alice', 'Johnson', 28, '{\"interests\": [\"art\", \"design\"]}'), ('charlie.brown@example.com', 'Charlie', 'Brown', 42, '{\"interests\": [\"finance\", \"investing\"]}'), ('diana.prince@example.com', 'Diana', 'Prince', 33, '{\"interests\": [\"fitness\", \"travel\"]}') ON CONFLICT (email) DO NOTHING;"
@docker exec meilibridge-postgres psql -U postgres -d meilibridge_dev -c "INSERT INTO products (sku, name, description, price, category, tags) VALUES ('DESK-001', 'Standing Desk', 'Adjustable height standing desk', 599.99, 'Furniture', ARRAY['desk', 'office', 'ergonomic']), ('MOUSE-001', 'Wireless Mouse', 'Ergonomic wireless mouse', 49.99, 'Electronics', ARRAY['mouse', 'wireless', 'peripherals']), ('CHAIR-001', 'Ergonomic Chair', 'High-back office chair', 399.99, 'Furniture', ARRAY['chair', 'office', 'ergonomic']) ON CONFLICT (sku) DO NOTHING;"
@echo "Sample data inserted!"
# Validate configuration
validate:
cargo run -- validate
# Show current sync status
status:
@echo "Checking MeiliBridge status..."
@curl -s http://localhost:7701/api/status || echo "API server not running"
# Cross-platform builds
build-linux-arm64:
@echo "Building for Linux ARM64 using Docker..."
@docker build --platform linux/arm64 \
--target builder \
-t meilibridge-builder-arm64 \
-f docker/Dockerfile .
@docker create --name temp-meilibridge-arm64 meilibridge-builder-arm64
@mkdir -p target/aarch64-unknown-linux-gnu/release
@docker cp temp-meilibridge-arm64:/usr/src/meilibridge/target/release/meilibridge target/aarch64-unknown-linux-gnu/release/meilibridge
@docker rm temp-meilibridge-arm64
@echo "Binary extracted to: target/aarch64-unknown-linux-gnu/release/meilibridge"
build-linux-amd64:
@echo "Building for Linux AMD64 using Docker..."
@docker build --platform linux/amd64 \
--target builder \
-t meilibridge-builder-amd64 \
-f docker/Dockerfile .
@docker create --name temp-meilibridge-amd64 meilibridge-builder-amd64
@mkdir -p target/x86_64-unknown-linux-gnu/release
@docker cp temp-meilibridge-amd64:/usr/src/meilibridge/target/release/meilibridge target/x86_64-unknown-linux-gnu/release/meilibridge
@docker rm temp-meilibridge-amd64
@echo "Binary extracted to: target/x86_64-unknown-linux-gnu/release/meilibridge"
build-all-platforms: build-linux-amd64 build-linux-arm64
@echo "All platform builds complete!"
# Docker multi-architecture builds
docker-setup-buildx:
@echo "Setting up Docker buildx..."
@docker buildx create --name meilibridge-builder --use || docker buildx use meilibridge-builder
@docker buildx inspect --bootstrap
docker-build:
@echo "Building Docker image for current platform..."
@echo "Version: $(VERSION) (Full: $(FULL_VERSION))"
docker build -t $(DOCKER_USERNAME)/$(DOCKER_IMAGE):$(VERSION) \
--build-arg VERSION=$(VERSION) \
-f docker/Dockerfile .
@if [ "$(VERSION)" != "latest" ]; then \
docker tag $(DOCKER_USERNAME)/$(DOCKER_IMAGE):$(VERSION) $(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest; \
fi
docker-build-multiarch: docker-setup-buildx
@echo "Building multi-architecture Docker image..."
@echo "Platforms: $(PLATFORMS)"
@echo "Version: $(VERSION) (Full: $(FULL_VERSION))"
@if [ "$(VERSION)" = "latest" ]; then \
docker buildx build \
--platform $(PLATFORMS) \
--tag $(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest \
--file docker/Dockerfile \
--build-arg VERSION=$(FULL_VERSION) \
.; \
else \
docker buildx build \
--platform $(PLATFORMS) \
--tag $(DOCKER_USERNAME)/$(DOCKER_IMAGE):$(VERSION) \
--tag $(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest \
--file docker/Dockerfile \
--build-arg VERSION=$(VERSION) \
.; \
fi
docker-push: docker-setup-buildx
@echo "Building and pushing multi-architecture Docker image..."
@echo "Registry: $(DOCKER_REGISTRY)"
@echo "Image: $(DOCKER_USERNAME)/$(DOCKER_IMAGE)"
@echo "Platforms: $(PLATFORMS)"
@echo "Version: $(VERSION) (Full: $(FULL_VERSION))"
@if [ "$(VERSION)" = "latest" ]; then \
echo "Warning: Not on a tagged release, pushing as 'latest' only"; \
docker buildx build \
--platform $(PLATFORMS) \
--tag $(DOCKER_REGISTRY)/$(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest \
--file docker/Dockerfile \
--build-arg VERSION=$(FULL_VERSION) \
--push \
.; \
echo ""; \
echo "Pushed to:"; \
echo " - $(DOCKER_REGISTRY)/$(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest"; \
else \
docker buildx build \
--platform $(PLATFORMS) \
--tag $(DOCKER_REGISTRY)/$(DOCKER_USERNAME)/$(DOCKER_IMAGE):$(VERSION) \
--tag $(DOCKER_REGISTRY)/$(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest \
--file docker/Dockerfile \
--build-arg VERSION=$(VERSION) \
--push \
.; \
echo ""; \
echo "Pushed to:"; \
echo " - $(DOCKER_REGISTRY)/$(DOCKER_USERNAME)/$(DOCKER_IMAGE):$(VERSION)"; \
echo " - $(DOCKER_REGISTRY)/$(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest"; \
fi
# Package release artifacts
package-linux-arm64: build-linux-arm64
@echo "Packaging Linux ARM64 binary..."
@mkdir -p dist
@cd target/aarch64-unknown-linux-gnu/release && \
tar czf ../../../dist/meilibridge-linux-arm64.tar.gz meilibridge
@echo "Package created: dist/meilibridge-linux-arm64.tar.gz"
package-all: package-linux-arm64
@echo "All packages created in dist/"
# Clean everything including cross compilation artifacts
deep-clean: clean
rm -rf target/
rm -rf dist/
docker buildx rm meilibridge-builder || true
# Install development dependencies
install-deps:
@echo "Installing development dependencies..."
@echo "Checking Docker..."
@if ! command -v docker > /dev/null 2>&1; then \
echo "ERROR: Docker is required for cross-platform builds. Please install Docker first."; \
exit 1; \
fi
@echo "Installing cargo-watch for development..."
cargo install cargo-watch
@echo "Setting up Docker buildx for multi-arch builds..."
@docker buildx create --name meilibridge-builder --use 2>/dev/null || true
@echo ""
@echo "Dependencies installed!"
@echo "You can now use:"
@echo " make build-linux-arm64 - Build ARM64 binary using Docker"
@echo " make build-linux-amd64 - Build AMD64 binary using Docker"
@echo " make docker-build-multiarch - Build multi-arch Docker image"
# Verify multi-arch image
docker-verify:
@echo "Verifying multi-architecture image..."
docker buildx imagetools inspect $(DOCKER_USERNAME)/$(DOCKER_IMAGE):latest