From f3c5d603a02ebcb6ce8b328cef9f74277ed350d7 Mon Sep 17 00:00:00 2001 From: Steve Munene Date: Thu, 29 Jan 2026 11:50:38 +0300 Subject: [PATCH] MG-379 - Refactor `makefile` (#385) * refactor command Signed-off-by: nyagamunene * update makefile and readme file Signed-off-by: nyagamunene * update commands Signed-off-by: nyagamunene * Add changes for apple silicon --------- Signed-off-by: nyagamunene Co-authored-by: dorcaslitunya --- Makefile | 82 ++++++++++++++++++++++++++++++++++++++++++++----------- README.md | 14 ++++++++++ 2 files changed, 80 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index c13eeeac6..c3a8e4f77 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,31 @@ SERVICES = bootstrap provision re postgres-writer postgres-reader timescale-wri DOCKERS = $(addprefix docker_,$(SERVICES)) DOCKERS_DEV = $(addprefix docker_dev_,$(SERVICES)) CGO_ENABLED ?= 0 -GOARCH ?= amd64 +# Auto-detect architecture: use arm64 for Apple Silicon, default to amd64 otherwise +UNAME_M := $(shell uname -m) +ifeq ($(UNAME_M),arm64) + GOARCH ?= arm64 +else ifeq ($(UNAME_M),aarch64) + GOARCH ?= arm64 +else + GOARCH ?= amd64 +endif + +# Detect OS for sed compatibility: macOS (BSD sed) vs Linux (GNU sed) +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Darwin) + SED_INPLACE := sed -i '' +else + SED_INPLACE := sed -i +endif + +# For Apple Silicon: use amd64 platform for pre-built images (emulation via Rosetta) +# This is needed because upstream stable images may not have ARM64 builds +ifeq ($(UNAME_M),arm64) + DOCKER_PLATFORM := --platform linux/amd64 +else + DOCKER_PLATFORM := +endif VERSION ?= $(shell git describe --abbrev=0 --tags 2>/dev/null || echo 'unknown') COMMIT ?= $(shell git rev-parse HEAD) TIME ?= $(shell date +%F_%T) @@ -71,6 +95,31 @@ define make_docker_dev -f docker/Dockerfile.dev ./build endef +define run_with_arch_detection + @echo "Detecting architecture..." + @if [ "$(DETECTED_ARCH)" = "arm64" ] || [ "$(DETECTED_ARCH)" = "aarch64" ]; then \ + echo "ARM64 architecture detected."; \ + git checkout $(1); \ + GOARCH=arm64 $(MAKE) dockers; \ + for svc in $(SERVICES); do \ + docker tag ghcr.io/absmach/magistrala/$$svc ghcr.io/absmach/magistrala/$$svc:latest; \ + done; \ + sed -i.bak 's/^MG_RELEASE_TAG=.*/MG_RELEASE_TAG=latest/' docker/.env && rm -f docker/.env.bak; \ + MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/docker-compose.yaml \ + -f docker/addons/timescale-reader/docker-compose.yaml \ + -f docker/addons/timescale-writer/docker-compose.yaml \ + --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args); \ + else \ + echo "x86_64 architecture detected."; \ + git checkout $(1); \ + sed -i.bak 's/^MG_RELEASE_TAG=.*/MG_RELEASE_TAG=$(2)/' docker/.env && rm -f docker/.env.bak; \ + MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/docker-compose.yaml \ + -f docker/addons/timescale-reader/docker-compose.yaml \ + -f docker/addons/timescale-writer/docker-compose.yaml \ + --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args); \ + fi +endef + ADDON_SERVICES = bootstrap provision certs timescale-reader timescale-writer postgres-reader postgres-writer EXTERNAL_SERVICES = prometheus @@ -229,21 +278,21 @@ grpc_mtls_certs: check_tls: ifeq ($(GRPC_TLS),true) - @unset GRPC_MTLS + @bash -c 'unset GRPC_MTLS' @echo "gRPC TLS is enabled" GRPC_MTLS= else - @unset GRPC_TLS + @bash -c 'unset GRPC_TLS' GRPC_TLS= endif check_mtls: ifeq ($(GRPC_MTLS),true) - @unset GRPC_TLS + @bash -c 'unset GRPC_TLS' @echo "gRPC MTLS is enabled" GRPC_TLS= else - @unset GRPC_MTLS + @bash -c 'unset GRPC_MTLS' GRPC_MTLS= endif @@ -260,25 +309,26 @@ fetch_supermq: @./scripts/supermq.sh run_latest: check_certs - MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/docker-compose.yaml \ + DOCKER_DEFAULT_PLATFORM=$(if $(DOCKER_PLATFORM),linux/amd64,) MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/docker-compose.yaml \ -f docker/addons/timescale-reader/docker-compose.yaml \ -f docker/addons/timescale-writer/docker-compose.yaml \ --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args) run_stable: check_certs - $(eval version = $(shell git describe --abbrev=0 --tags)) - git checkout $(version) - sed -i 's/^SMQ_RELEASE_TAG=.*/SMQ_RELEASE_TAG=$(version)/' docker/supermq-docker/.env - sed -i 's/^MG_RELEASE_TAG=.*/MG_RELEASE_TAG=$(version)/' docker/.env - docker compose -f docker/docker-compose.yaml --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args) - MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/docker-compose.yaml \ - -f docker/addons/timescale-reader/docker-compose.yaml \ - -f docker/addons/timescale-writer/docker-compose.yaml \ - --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args) + @version=$$(git describe --abbrev=0 --tags 2>/dev/null) || { echo "Error: No git tags found. Please create a release tag first (e.g., git tag v0.1.0) or use 'make run_latest' instead."; exit 1; }; \ + echo "Using stable version: $$version"; \ + git checkout $$version; \ + $(SED_INPLACE) "s/^SMQ_RELEASE_TAG=.*/SMQ_RELEASE_TAG=$$version/" docker/supermq-docker/.env; \ + $(SED_INPLACE) "s/^MG_RELEASE_TAG=.*/MG_RELEASE_TAG=$$version/" docker/.env; \ + DOCKER_DEFAULT_PLATFORM=$(if $(DOCKER_PLATFORM),linux/amd64,) docker compose -f docker/docker-compose.yaml --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args); \ + DOCKER_DEFAULT_PLATFORM=$(if $(DOCKER_PLATFORM),linux/amd64,) MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/docker-compose.yaml \ + -f docker/addons/timescale-reader/docker-compose.yaml \ + -f docker/addons/timescale-writer/docker-compose.yaml \ + --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args) run_addons: check_certs $(foreach SVC,$(RUN_ADDON_ARGS),$(if $(filter $(SVC),$(ADDON_SERVICES) $(EXTERNAL_SERVICES)),,$(error Invalid Service $(SVC)))) @for SVC in $(RUN_ADDON_ARGS); do \ - MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/addons/$$SVC/docker-compose.yaml -p $(DOCKER_PROJECT) --env-file ./docker/.env $(DOCKER_COMPOSE_COMMAND) $(args) & \ + DOCKER_DEFAULT_PLATFORM=$(if $(DOCKER_PLATFORM),linux/amd64,) MG_ADDONS_CERTS_PATH_PREFIX="../." docker compose -f docker/addons/$$SVC/docker-compose.yaml -p $(DOCKER_PROJECT) --env-file ./docker/.env $(DOCKER_COMPOSE_COMMAND) $(args) & \ done diff --git a/README.md b/README.md index 4f8e65cda..f3e456a36 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,20 @@ The `make run_stable` command will: git checkout main ``` +### Running on Apple Silicon (M1/M2/M3) Macs + +When running Magistrala on Apple Silicon Macs, the Makefile will automatically detect your ARM64 architecture and build Docker images locally. + +**If using Docker Desktop:** + +1. **Enable Apple Virtualization Framework**: In Docker Desktop, go to: + - Settings → General → Enable "Use the new Virtualization framework" + +2. **Enable Rosetta for x86_64 Emulation**: In Docker Desktop, go to: + - Settings → General → Enable "Use Rosetta for x86_64/amd64 emulation on Apple Silicon" + +After enabling these options, restart Docker Desktop, then run `make run_stable` or `make run_latest` as usual. + ## 📤 Usage