mirror of
https://github.com/gravitl/netmaker.git
synced 2026-10-12 02:15:06 +00:00
128 lines
4.2 KiB
Makefile
128 lines
4.2 KiB
Makefile
# Netmaker build targets for Community Edition (CE) and Enterprise Edition (EE).
|
|
#
|
|
# Docker image tags mirror .github/workflows/publish-docker.yml:
|
|
# CE: gravitl/netmaker:<TAG>
|
|
# EE: gravitl/netmaker:<TAG>-ee
|
|
#
|
|
# EE builds are slow on first run (CGO + SQLite + large pro/ tree).
|
|
# Run `make deps` once, then use `make build-ee` — cached rebuilds are much faster.
|
|
|
|
.PHONY: help deps check-cgo build-env build build-ce build-ee build-ee-timed \
|
|
image-ce image-ee images push-ce push-ee push clean
|
|
|
|
IMAGE ?= gravitl/netmaker
|
|
TAG ?= dev
|
|
DOCKERFILE ?= Dockerfile
|
|
GO_BUILDER_IMAGE ?= gravitl/go-builder:1.25.3
|
|
|
|
# CE includes arm/v7; EE matches CI (amd64 + arm64 only).
|
|
PLATFORMS_CE ?= linux/amd64,linux/arm64,linux/arm/v7
|
|
PLATFORMS_EE ?= linux/amd64,linux/arm64
|
|
|
|
BUILD_TAGS_CE ?= ce
|
|
BUILD_TAGS_EE ?= ee
|
|
LDFLAGS ?= -s -w
|
|
CGO_ENABLED ?= 1
|
|
BIN_DIR ?= bin
|
|
GO ?= go
|
|
GOMAXPROCS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
|
|
|
|
# Shared go build invocation — uses parallel compilation and build cache by default.
|
|
# Avoid `go build -a` unless you need a full rebuild.
|
|
GO_BUILD = CGO_ENABLED=$(CGO_ENABLED) GOMAXPROCS=$(GOMAXPROCS) $(GO) build -ldflags="$(LDFLAGS)"
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
help: ## Show available targets
|
|
@echo "Netmaker CE/EE build targets"
|
|
@echo ""
|
|
@echo "Variables:"
|
|
@echo " IMAGE=$(IMAGE)"
|
|
@echo " TAG=$(TAG)"
|
|
@echo " CGO_ENABLED=$(CGO_ENABLED)"
|
|
@echo " GOMAXPROCS=$(GOMAXPROCS)"
|
|
@echo ""
|
|
@echo "Tips for slow EE builds:"
|
|
@echo " 1. make deps — download modules first"
|
|
@echo " 2. make check-cgo — ensure gcc/build-essential is installed"
|
|
@echo " 3. make build-env — inspect GOCACHE / GOMODCACHE"
|
|
@echo " 4. make build-ee-timed — time a full EE build"
|
|
@echo " 5. Use ccache for repeated CGO/SQLite compiles (export CC=\"ccache gcc\")"
|
|
@echo ""
|
|
@grep -E '^[a-zA-Z0-9_.-]+:.*## ' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*## "}; {printf " %-16s %s\n", $$1, $$2}'
|
|
|
|
deps: ## Download Go modules (run once before first build)
|
|
$(GO) mod download
|
|
|
|
check-cgo: ## Verify C toolchain required for CGO/SQLite builds
|
|
@echo "CGO_ENABLED=$(CGO_ENABLED)"
|
|
@echo "GOMAXPROCS=$(GOMAXPROCS)"
|
|
@command -v gcc >/dev/null 2>&1 || { \
|
|
echo "ERROR: gcc not found."; \
|
|
echo " Debian/Ubuntu: sudo apt install build-essential"; \
|
|
echo " Alpine: apk add build-base"; \
|
|
exit 1; \
|
|
}
|
|
@gcc --version | head -1
|
|
@echo "C toolchain OK"
|
|
|
|
build-env: ## Show Go cache paths and build settings
|
|
@echo "GOMAXPROCS=$(GOMAXPROCS)"
|
|
@echo "CGO_ENABLED=$(CGO_ENABLED)"
|
|
@$(GO) env GOCACHE GOMODCACHE GOOS GOARCH GOPATH
|
|
@command -v gcc >/dev/null 2>&1 && gcc --version | head -1 || echo "gcc: not found"
|
|
|
|
build: deps build-ce build-ee ## Build CE and EE binaries locally
|
|
|
|
build-ce: deps check-cgo ## Build CE binary to $(BIN_DIR)/netmaker
|
|
@mkdir -p $(BIN_DIR)
|
|
$(GO_BUILD) -o $(BIN_DIR)/netmaker .
|
|
|
|
build-ee: deps check-cgo ## Build EE binary to $(BIN_DIR)/netmaker-ee
|
|
@mkdir -p $(BIN_DIR)
|
|
$(GO_BUILD) -tags $(BUILD_TAGS_EE) -o $(BIN_DIR)/netmaker-ee .
|
|
|
|
build-ee-timed: check-cgo deps ## Time an EE build (useful for diagnosing slow compiles)
|
|
@mkdir -p $(BIN_DIR)
|
|
@echo "Building EE with GOMAXPROCS=$(GOMAXPROCS) CGO_ENABLED=$(CGO_ENABLED) ..."
|
|
@time $(GO_BUILD) -tags $(BUILD_TAGS_EE) -o $(BIN_DIR)/netmaker-ee .
|
|
|
|
image-ce: ## Build CE Docker image ($(IMAGE):$(TAG))
|
|
docker build \
|
|
--build-arg tags=$(BUILD_TAGS_CE) \
|
|
-t $(IMAGE):$(TAG) \
|
|
-f $(DOCKERFILE) \
|
|
.
|
|
|
|
image-ee: ## Build EE Docker image ($(IMAGE):$(TAG)-ee)
|
|
docker build \
|
|
--build-arg tags=$(BUILD_TAGS_EE) \
|
|
-t $(IMAGE):$(TAG)-ee \
|
|
-f $(DOCKERFILE) \
|
|
.
|
|
|
|
images: image-ce image-ee ## Build both CE and EE Docker images
|
|
|
|
push-ce: ## Build and push CE multi-arch image ($(IMAGE):$(TAG))
|
|
docker buildx build \
|
|
--platform $(PLATFORMS_CE) \
|
|
--build-arg tags=$(BUILD_TAGS_CE) \
|
|
-t $(IMAGE):$(TAG) \
|
|
-f $(DOCKERFILE) \
|
|
--push \
|
|
.
|
|
|
|
push-ee: ## Build and push EE multi-arch image ($(IMAGE):$(TAG)-ee)
|
|
docker buildx build \
|
|
--platform $(PLATFORMS_EE) \
|
|
--build-arg tags=$(BUILD_TAGS_EE) \
|
|
-t $(IMAGE):$(TAG)-ee \
|
|
-f $(DOCKERFILE) \
|
|
--push \
|
|
.
|
|
|
|
push: push-ce push-ee ## Build and push both CE and EE multi-arch images
|
|
|
|
clean: ## Remove local build artifacts
|
|
rm -rf $(BIN_DIR)
|