11NAME? =kube-router
2+ GOARCH? =amd64
23DEV_SUFFIX? =-git
34BUILD_DATE? =$(shell  date --iso-8601) 
45LOCAL_PACKAGES? =app app/controllers app/options app/watchers utils
56IMG_NAMESPACE? =cloudnativelabs
67GIT_COMMIT =$(shell  git describe --tags --dirty) 
78GIT_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 ) 
910RELEASE_TAG? =$(shell  build/get-git-tag.sh) 
1011REGISTRY? =$(if  $(IMG_FQDN ) ,$(IMG_FQDN ) /$(IMG_NAMESPACE ) /$(NAME ) ,$(IMG_NAMESPACE ) /$(NAME ) ) 
1112REGISTRY_DEV? =$(REGISTRY )$(DEV_SUFFIX ) 
@@ -15,11 +16,26 @@ DOCKER=$(if $(or $(IN_DOCKER_GROUP),$(IS_ROOT)),docker,sudo docker)
1516MAKEFILE_DIR =$(dir  $(realpath  $(firstword  $(MAKEFILE_LIST ) ) ) ) 
1617UPSTREAM_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))
1834all : test kube-router container # # Default target. Runs tests, builds binaries and images.
1935
2036kube-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
2541test : 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
5268run : 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+ 
6382docker-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
157189help :
@@ -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