| # Common User-Settable Flags | 
 | # ========================== | 
 | PREFIX?=gcr.io/google_containers | 
 | FLAGS= | 
 | ARCH?=amd64 | 
 | GOLANG_VERSION?=1.10 | 
 | # You can set this variable for testing and the built image will also be tagged with this name | 
 | IMAGE_NAME?=$(PREFIX)/metrics-server-$(ARCH):$(VERSION) | 
 |  | 
 | # by default, build the current arch's binary | 
 | # (this needs to be pre-include, for some reason) | 
 | all: _output/$(ARCH)/metrics-server | 
 |  | 
 | # Constants | 
 | # ========= | 
 | ALL_ARCHITECTURES=amd64 arm arm64 ppc64le s390x | 
 | ML_PLATFORMS=linux/amd64,linux/arm,linux/arm64,linux/ppc64le,linux/s390x | 
 |  | 
 | # Calculated Variables | 
 | # ==================== | 
 | REPO_DIR:=$(shell pwd) | 
 | LDFLAGS=-w $(VERSION_LDFLAGS) | 
 | # get the appropriate version information | 
 | include hack/Makefile.buildinfo | 
 | # Set default base image dynamically for each arch | 
 | ifeq ($(ARCH),amd64) | 
 | 	BASEIMAGE?=busybox | 
 | endif | 
 | ifeq ($(ARCH),arm) | 
 | 	BASEIMAGE?=arm32v7/busybox | 
 | endif | 
 | ifeq ($(ARCH),arm64) | 
 | 	BASEIMAGE?=arm64v8/busybox | 
 | endif | 
 | ifeq ($(ARCH),ppc64le) | 
 | 	BASEIMAGE?=ppc64le/busybox | 
 | endif | 
 | ifeq ($(ARCH),s390x) | 
 | 	BASEIMAGE?=s390x/busybox | 
 | endif | 
 |  | 
 |  | 
 | # Rules | 
 | # ===== | 
 |  | 
 | .PHONY: all test-unit container container-* clean container-only container-only-* tmp-dir push do-push-* sub-push-* | 
 |  | 
 | # Build Rules | 
 | # ----------- | 
 |  | 
 | pkg/generated/openapi/zz_generated.openapi.go: | 
 | 	go run vendor/k8s.io/kube-openapi/cmd/openapi-gen/openapi-gen.go --logtostderr -i k8s.io/metrics/pkg/apis/metrics/v1beta1,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/api/resource,k8s.io/apimachinery/pkg/version -p github.com/kubernetes-incubator/metrics-server/pkg/generated/openapi/ -O zz_generated.openapi -h $(REPO_DIR)/hack/boilerplate.go.txt -r /dev/null | 
 |  | 
 | # building depends on all go files (this is mostly redundant in the face of go 1.10's incremental builds, | 
 | # but it allows us to safely write actual dependency rules in our makefile) | 
 | src_deps=$(shell find pkg cmd -type f -name "*.go" -and ! -name "zz_generated.*.go") | 
 | _output/%/metrics-server: $(src_deps) pkg/generated/openapi/zz_generated.openapi.go | 
 | 	GOARCH=$* CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o _output/$*/metrics-server github.com/kubernetes-incubator/metrics-server/cmd/metrics-server | 
 |  | 
 | # Image Rules | 
 | # ----------- | 
 |  | 
 | # build a container using containerized build (the current arch by default) | 
 | container: container-$(ARCH) | 
 |  | 
 | container-%: pkg/generated/openapi/zz_generated.openapi.go tmpdir | 
 | 	# Run the build in a container in order to have reproducible builds | 
 | 	docker run --rm -v $(TEMP_DIR):/build -v $(REPO_DIR):/go/src/github.com/kubernetes-incubator/metrics-server -w /go/src/github.com/kubernetes-incubator/metrics-server golang:$(GOLANG_VERSION) /bin/bash -c "\ | 
 | 		GOARCH=$(ARCH) CGO_ENABLED=0 go build -ldflags \"$(LDFLAGS)\" -o /build/metrics-server github.com/kubernetes-incubator/metrics-server/cmd/metrics-server" | 
 |  | 
 | 	# copy the base Dockerfile into the temp dir, and set the base image | 
 | 	cp deploy/docker/Dockerfile $(TEMP_DIR) | 
 | 	sed -i -e "s|BASEIMAGE|$(BASEIMAGE)|g" $(TEMP_DIR)/Dockerfile | 
 |  | 
 | 	# run the actual build | 
 | 	docker build --pull -t $(IMAGE_NAME) $(TEMP_DIR) | 
 |  | 
 | 	# remove our TEMP_DIR, as needed | 
 | 	rm -rf $(TEMP_DIR) | 
 |  | 
 | # build a container using a locally-built binary (the current arch by default) | 
 | container-only: container-only-$(ARCH) | 
 |  | 
 | container-only-%: _output/$(ARCH)/metrics-server tmpdir | 
 | 	# copy the base Dockerfile and binary into the temp dir, and set the base image | 
 | 	cp deploy/docker/Dockerfile $(TEMP_DIR) | 
 | 	cp _output/$(ARCH)/metrics-server $(TEMP_DIR) | 
 | 	sed -i -e "s|BASEIMAGE|$(BASEIMAGE)|g" $(TEMP_DIR)/Dockerfile | 
 |  | 
 | 	# run the actual build | 
 | 	docker build --pull -t $(IMAGE_NAME) $(TEMP_DIR) | 
 |  | 
 | 	# remove our TEMP_DIR, as needed | 
 | 	rm -rf $(TEMP_DIR) | 
 |  | 
 | # Official Container Push Rules | 
 | # ----------------------------- | 
 |  | 
 | # do the actual push for official images | 
 | do-push-%: | 
 | 	# push with main tag | 
 | 	docker push $(PREFIX)/metrics-server-$*:$(VERSION) | 
 |  | 
 | 	# push alternate tags | 
 | ifeq ($(ARCH),amd64) | 
 | 	# TODO: Remove this and push the manifest list as soon as it's working | 
 | 	docker tag $(PREFIX)/metrics-server-$*:$(VERSION) $(PREFIX)/metrics-server:$(VERSION) | 
 | 	docker push $(PREFIX)/metrics-server:$(VERSION) | 
 | endif | 
 |  | 
 | # do build and then push a given official image | 
 | sub-push-%: container-% do-push-% ; | 
 |  | 
 | # do build and then push all official images | 
 | push: gcr-login $(addprefix sub-push-,$(ALL_ARCHITECTURES)) ; | 
 | 	# TODO: push with manifest-tool? | 
 | 	# Should depend on target: ./manifest-tool | 
 |  | 
 | # log in to the official container registry | 
 | gcr-login: | 
 | ifeq ($(findstring gcr.io,$(PREFIX)),gcr.io) | 
 | 	@echo "If you are pushing to a gcr.io registry, you have to be logged in via 'docker login'; 'gcloud docker push' can't push manifest lists yet." | 
 | 	@echo "This script is automatically logging you in now with 'gcloud docker -a'" | 
 | 	gcloud docker -a | 
 | endif | 
 |  | 
 | # Utility Rules | 
 | # ------------- | 
 |  | 
 | clean: | 
 | 	rm -rf _output | 
 | 	rm pkg/generated/openapi/zz_generated.openapi.go | 
 |  | 
 | fmt: | 
 | 	find pkg cmd -type f -name "*.go" | xargs gofmt -s -w | 
 |  | 
 | test-unit: pkg/generated/openapi/zz_generated.openapi.go | 
 | ifeq ($(ARCH),amd64) | 
 | 	GOARCH=$(ARCH) go test --test.short -race ./pkg/... $(FLAGS) | 
 | else | 
 | 	GOARCH=$(ARCH) go test --test.short ./pkg/... $(FLAGS) | 
 | endif | 
 |  | 
 | # set up a temporary director when we need it | 
 | # it's the caller's responsibility to clean it up | 
 | tmpdir: | 
 | 	$(eval TEMP_DIR:=$(shell mktemp -d /tmp/metrics-server.XXXXXX)) |