Skip to content

Commit c7ce398

Browse files
jjomurali-reddy
authored andcommitted
[jjo] add arm cross-compile support (#336)
* [jjo] add arm and arm64 cross compile support * hint multiarch-setup run * fix `file` check for arm64`
1 parent 4902a0c commit c7ce398

File tree

1 file changed

+40
-7
lines changed

1 file changed

+40
-7
lines changed

Makefile

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
NAME?=kube-router
2+
GOARCH?=amd64
23
DEV_SUFFIX?=-git
34
BUILD_DATE?=$(shell date --iso-8601)
45
LOCAL_PACKAGES?=app app/controllers app/options app/watchers utils
56
IMG_NAMESPACE?=cloudnativelabs
67
GIT_COMMIT=$(shell git describe --tags --dirty)
78
GIT_BRANCH?=$(shell git rev-parse --abbrev-ref HEAD)
8-
IMG_TAG?=$(if $(IMG_TAG_PREFIX),$(IMG_TAG_PREFIX)-)$(GIT_BRANCH)
9+
IMG_TAG?=$(if $(IMG_TAG_PREFIX),$(IMG_TAG_PREFIX)-)$(if $(ARCH_TAG_PREFIX),$(ARCH_TAG_PREFIX)-)$(GIT_BRANCH)
910
RELEASE_TAG?=$(shell build/get-git-tag.sh)
1011
REGISTRY?=$(if $(IMG_FQDN),$(IMG_FQDN)/$(IMG_NAMESPACE)/$(NAME),$(IMG_NAMESPACE)/$(NAME))
1112
REGISTRY_DEV?=$(REGISTRY)$(DEV_SUFFIX)
@@ -15,11 +16,26 @@ DOCKER=$(if $(or $(IN_DOCKER_GROUP),$(IS_ROOT)),docker,sudo docker)
1516
MAKEFILE_DIR=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
1617
UPSTREAM_IMPORT_PATH=$(GOPATH)/src/github.com/cloudnativelabs/kube-router/
1718

19+
ifeq ($(GOARCH), arm)
20+
QEMU_ARCH=arm
21+
ARCH_TAG_PREFIX=$(GOARCH)
22+
FILE_ARCH=ARM
23+
DOCKERFILE_SED_EXPR?=s,FROM alpine:,FROM multiarch/alpine:armhf-v,
24+
else ifeq ($(GOARCH), arm64)
25+
QEMU_ARCH=aarch64
26+
ARCH_TAG_PREFIX=$(GOARCH)
27+
FILE_ARCH=ARM aarch64
28+
DOCKERFILE_SED_EXPR?=s,FROM alpine:,FROM multiarch/alpine:aarch64-v,
29+
else
30+
DOCKERFILE_SED_EXPR?=
31+
FILE_ARCH=x86-64
32+
endif
33+
$(info Building for GOARCH=$(GOARCH))
1834
all: test kube-router container ## Default target. Runs tests, builds binaries and images.
1935

2036
kube-router:
2137
@echo Starting kube-router binary build.
22-
CGO_ENABLED=0 go build -ldflags '-X github.com/cloudnativelabs/kube-router/app.version=$(GIT_COMMIT) -X github.com/cloudnativelabs/kube-router/app.buildDate=$(BUILD_DATE)' -o kube-router kube-router.go
38+
GOARCH=$(GOARCH) CGO_ENABLED=0 go build -ldflags '-X github.com/cloudnativelabs/kube-router/app.version=$(GIT_COMMIT) -X github.com/cloudnativelabs/kube-router/app.buildDate=$(BUILD_DATE)' -o kube-router kube-router.go
2339
@echo Finished kube-router binary build.
2440

2541
test: gofmt ## Runs code quality pipelines (gofmt, tests, coverage, lint, etc)
@@ -52,14 +68,17 @@ vagrant-image-update: all ## Rebuild kube-router, update image in local VMs, and
5268
run: kube-router ## Runs "kube-router --help".
5369
./kube-router --help
5470

55-
container: kube-router gobgp ## Builds a Docker container image.
71+
container: multiarch-check Dockerfile.$(GOARCH).run kube-router gobgp multiarch-binverify ## Builds a Docker container image.
5672
@echo Starting kube-router container image build.
57-
$(DOCKER) build -t "$(REGISTRY_DEV):$(IMG_TAG)" .
73+
$(DOCKER) build -t "$(REGISTRY_DEV):$(IMG_TAG)" -f Dockerfile.$(GOARCH).run .
5874
@if [ "$(GIT_BRANCH)" = "master" ]; then \
5975
$(DOCKER) tag "$(REGISTRY_DEV):$(IMG_TAG)" "$(REGISTRY_DEV)"; \
6076
fi
6177
@echo Finished kube-router container image build.
6278

79+
Dockerfile.$(GOARCH).run: Dockerfile Makefile
80+
@sed -e "$(DOCKERFILE_SED_EXPR)" Dockerfile > $(@)
81+
6382
docker-login: ## Logs into a docker registry using {DOCKER,QUAY}_{USERNAME,PASSWORD} variables.
6483
@echo Starting docker login target.
6584
@if [ -n "$(DOCKER_USERNAME)" ] && [ -n "$(DOCKER_PASSWORD)" ]; then \
@@ -149,9 +168,22 @@ gobgp: vendor/github.com/osrg/gobgp/gobgp
149168
sh -c ' \
150169
apk add -U git && \
151170
ln -s /pwd/vendor /go/src && \
152-
CGO_ENABLED=0 go get github.com/osrg/gobgp/gobgp && \
153-
gobgp --version && \
154-
cp /go/bin/gobgp /pwd'
171+
CGO_ENABLED=0 GOARCH=$(GOARCH) go get github.com/osrg/gobgp/gobgp && \
172+
cp `find /go/bin -type f -name gobgp` /pwd'
173+
174+
multiarch-check:
175+
@[ -z "$(QEMU_ARCH)" ] && exit 0; \
176+
QEMU_RUNTIME=$$(sed -n '/interpreter/s/.* //p' /proc/sys/fs/binfmt_misc/qemu-$(QEMU_ARCH)); \
177+
trap 'rc=$$?; [ $$rc -ne 0 ] && echo "To fix below, try running: make multiarch-setup\n"; exit $$rc' 0 ;\
178+
echo "Checking for QEMU_RUNTIME=$${QEMU_RUNTIME} ..." ;\
179+
test -x "$${QEMU_RUNTIME}"
180+
181+
multiarch-binverify:
182+
@echo 'Verifying kube-router gobgp for ARCH=$(FILE_ARCH) ...'
183+
@[ `file kube-router gobgp| cut -d, -f2 |grep -cw "$(FILE_ARCH)"` -eq 2 ]
184+
185+
multiarch-setup:
186+
$(DOCKER) run --rm --privileged multiarch/qemu-user-static:register
155187

156188
# http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
157189
help:
@@ -177,5 +209,6 @@ endif
177209
.PHONY: update-glide test docker-login push-release github-release help
178210
.PHONY: gopath gopath-fix vagrant-up-single-node
179211
.PHONY: vagrant-up-multi-node vagrant-destroy vagrant-clean vagrant
212+
.PHONY: multiarch-setup multiarch-check multiarch-binverify
180213

181214
.DEFAULT: all

0 commit comments

Comments
 (0)