1515# We need bash for some conditional logic below.
1616SHELL := /usr/bin/env bash -e
1717
18- GO_INSTALL = ./hack/go-install.sh
19-
2018ROOT_DIR =$(abspath .)
2119TOOLS_DIR =hack/tools
22- TOOLS_GOBIN_DIR := $(abspath $(TOOLS_DIR ) )
23- GOBIN_DIR =$(abspath ./bin )
24- PATH := $(GOBIN_DIR ) :$(TOOLS_GOBIN_DIR ) :$(PATH )
25- TMPDIR := $(shell mktemp -d)
20+ BUILD_DIR =bin
21+ ABS_TOOLS_DIR := $(abspath $(TOOLS_DIR ) )
22+ ABS_BUILD_DIR =$(abspath $(BUILD_DIR ) )
23+ PATH := $(ABS_BUILD_DIR ) :$(ABS_TOOLS_DIR ) :$(PATH )
24+
25+ export UGET_DIRECTORY = $(TOOLS_DIR )
26+ export UGET_CHECKSUMS = hack/tools.checksums
2627
2728# Image build configuration
2829# REV is the short git sha of latest commit.
2930REV ?= $(shell git rev-parse --short HEAD)
3031IMAGE_REPO ?= kube-bind
3132
32- # Detect the path used for the install target
33- ifeq (,$(shell go env GOBIN) )
34- INSTALL_GOBIN =$(shell go env GOPATH) /bin
35- else
36- INSTALL_GOBIN =$(shell go env GOBIN)
37- endif
38-
3933CONTROLLER_GEN_VER := v0.17.3
4034CONTROLLER_GEN_BIN := controller-gen
41- CONTROLLER_GEN := $(TOOLS_DIR ) /$(CONTROLLER_GEN_BIN ) - $( CONTROLLER_GEN_VER )
35+ CONTROLLER_GEN := $(TOOLS_DIR ) /$(CONTROLLER_GEN_BIN )
4236export CONTROLLER_GEN # so hack scripts can use it
4337
4438KUBE_CLIENT_GEN_VER := v0.32.0
@@ -50,46 +44,46 @@ KUBE_INFORMER_GEN_BIN := informer-gen
5044KUBE_APPLYCONFIGURATION_GEN_VER := v0.32.0
5145KUBE_APPLYCONFIGURATION_GEN_BIN := applyconfiguration-gen
5246
53- KUBE_CLIENT_GEN := $(GOBIN_DIR ) /$(KUBE_CLIENT_GEN_BIN ) - $( KUBE_CLIENT_GEN_VER )
47+ KUBE_CLIENT_GEN := $(ABS_BUILD_DIR ) /$(KUBE_CLIENT_GEN_BIN )
5448export KUBE_CLIENT_GEN
55- KUBE_LISTER_GEN := $(GOBIN_DIR ) /$(KUBE_LISTER_GEN_BIN ) - $( KUBE_LISTER_GEN_VER )
49+ KUBE_LISTER_GEN := $(ABS_BUILD_DIR ) /$(KUBE_LISTER_GEN_BIN )
5650export KUBE_LISTER_GEN
57- KUBE_INFORMER_GEN := $(GOBIN_DIR ) /$(KUBE_INFORMER_GEN_BIN ) - $( KUBE_INFORMER_GEN_VER )
51+ KUBE_INFORMER_GEN := $(ABS_BUILD_DIR ) /$(KUBE_INFORMER_GEN_BIN )
5852export KUBE_INFORMER_GEN
59- KUBE_APPLYCONFIGURATION_GEN := $(GOBIN_DIR ) /$(KUBE_APPLYCONFIGURATION_GEN_BIN ) - $( KUBE_APPLYCONFIGURATION_GEN_VER )
53+ KUBE_APPLYCONFIGURATION_GEN := $(ABS_BUILD_DIR ) /$(KUBE_APPLYCONFIGURATION_GEN_BIN )
6054export KUBE_APPLYCONFIGURATION_GEN
6155
6256YAML_PATCH_VER ?= v0.0.11
6357YAML_PATCH_BIN := yaml-patch
64- YAML_PATCH := $(TOOLS_DIR ) /$(YAML_PATCH_BIN ) - $( YAML_PATCH_VER )
58+ YAML_PATCH := $(TOOLS_DIR ) /$(YAML_PATCH_BIN )
6559export YAML_PATCH # so hack scripts can use it
6660
67- GOLANGCI_LINT_VER := v2 .1.6
61+ GOLANGCI_LINT_VER := 2 .1.6
6862GOLANGCI_LINT_BIN := golangci-lint
69- GOLANGCI_LINT := $(TOOLS_GOBIN_DIR ) /$(GOLANGCI_LINT_BIN ) - $( GOLANGCI_LINT_VER )
63+ GOLANGCI_LINT := $(ABS_TOOLS_DIR ) /$(GOLANGCI_LINT_BIN )
7064
7165GOTESTSUM_VER := v1.8.1
7266GOTESTSUM_BIN := gotestsum
73- GOTESTSUM := $(abspath $(TOOLS_DIR ) ) /$(GOTESTSUM_BIN ) - $( GOTESTSUM_VER )
67+ GOTESTSUM := $(abspath $(TOOLS_DIR ) ) /$(GOTESTSUM_BIN )
7468
7569LOGCHECK_VER := v0.2.0
7670LOGCHECK_BIN := logcheck
77- LOGCHECK := $(TOOLS_GOBIN_DIR ) /$(LOGCHECK_BIN ) - $( LOGCHECK_VER )
71+ LOGCHECK := $(ABS_TOOLS_DIR ) /$(LOGCHECK_BIN )
7872export LOGCHECK # so hack scripts can use it
7973
8074CODE_GENERATOR_VER := v2.4.0
8175CODE_GENERATOR_BIN := code-generator
82- CODE_GENERATOR := $(TOOLS_GOBIN_DIR ) /$(CODE_GENERATOR_BIN ) - $( CODE_GENERATOR_VER )
76+ CODE_GENERATOR := $(ABS_TOOLS_DIR ) /$(CODE_GENERATOR_BIN )
8377export CODE_GENERATOR # so hack scripts can use it
8478
85- KCP_VER := v0 .28.3
79+ KCP_VER := 0 .28.3
8680KCP_BIN := kcp
87- KCP := $(TOOLS_GOBIN_DIR ) /$(KCP_BIN ) - $( KCP_VER )
81+ KCP := $(ABS_TOOLS_DIR ) /$(KCP_BIN )
8882KCP_CMD ?= $(KCP )
8983
9084DEX_VER := v2.43.1
9185DEX_BIN := dex
92- DEX := $(TOOLS_GOBIN_DIR ) /$(DEX_BIN ) - $( DEX_VER )
86+ DEX := $(ABS_TOOLS_DIR ) /$(DEX_BIN )
9387
9488ARCH := $(shell go env GOARCH)
9589OS := $(shell go env GOOS)
@@ -132,12 +126,16 @@ ldflags:
132126require-% :
133127 @if ! command -v $* 1> /dev/null 2>&1 ; then echo " $* not found in \$ $PATH " ; exit 1; fi
134128
129+ .PHONY : clean
130+ clean : # # Remove all build artifacts
131+ rm -rf $(BUILD_DIR ) $(TOOLS_DIR )
132+
135133build : WHAT ?= ./cmd/... ./cli/cmd/... ./contrib/kcp/cmd/kcp-init/...
136134build : require-jq require-go require-git verify-go-versions # # Build the project
137- mkdir -p $(GOBIN_DIR )
135+ mkdir -p $(BUILD_DIR )
138136 set -x; for W in $( WHAT) ; do \
139137 pushd . && cd $$ {W%..}; \
140- GOOS=$(OS ) GOARCH=$(ARCH ) CGO_ENABLED=0 go build $(BUILDFLAGS ) -ldflags=" $( LDFLAGS) " -o $( GOBIN_DIR ) ./...; \
138+ GOOS=$(OS ) GOARCH=$(ARCH ) CGO_ENABLED=0 go build $(BUILDFLAGS ) -ldflags=" $( LDFLAGS) " -o $( BUILD_DIR ) ./...; \
141139 popd ; \
142140 done
143141.PHONY : build
@@ -147,15 +145,17 @@ install: ## install binaries to GOBIN
147145 GOOS=$(OS ) GOARCH=$(ARCH ) go install -ldflags=" $( LDFLAGS) " $(WHAT )
148146.PHONY : install
149147
150-
151148$(GOLANGCI_LINT ) :
152- GOBIN=$(TOOLS_GOBIN_DIR ) $(GO_INSTALL ) github.com/golangci/golangci-lint/v2/cmd/golangci-lint $(GOLANGCI_LINT_BIN ) $(GOLANGCI_LINT_VER )
149+ @hack/uget.sh \
150+ https://github.com/golangci/golangci-lint/releases/download/v{VERSION}/golangci-lint-{VERSION}-{GOOS}-{GOARCH}.tar.gz \
151+ ${GOLANGCI_LINT_BIN} \
152+ ${GOLANGCI_LINT_VER}
153153
154154$(LOGCHECK ) :
155- GOBIN= $( TOOLS_GOBIN_DIR ) $( GO_INSTALL ) sigs.k8s.io/logtools/logcheck $( LOGCHECK_BIN ) $(LOGCHECK_VER )
155+ @GO_MODULE=true hack/uget.sh sigs.k8s.io/logtools/logcheck ${ LOGCHECK_BIN} $(LOGCHECK_VER )
156156
157157$(CODE_GENERATOR ) :
158- GOBIN= $( TOOLS_GOBIN_DIR ) $( GO_INSTALL ) github.com/kcp-dev/code-generator/v2 $( CODE_GENERATOR_BIN ) $(CODE_GENERATOR_VER )
158+ @GO_MODULE=true hack/uget.sh github.com/kcp-dev/code-generator/v2 ${ CODE_GENERATOR_BIN} $(CODE_GENERATOR_VER )
159159
160160lint : $(GOLANGCI_LINT ) $(LOGCHECK ) # # Run golangci-lint
161161 @if [ -n " $( WHAT) " ]; then \
@@ -180,23 +180,30 @@ tools: $(GOLANGCI_LINT) $(CONTROLLER_GEN) $(YAML_PATCH) $(GOTESTSUM) $(CODE_GENE
180180.PHONY : tools
181181
182182$(CONTROLLER_GEN ) :
183- GOBIN=$(TOOLS_GOBIN_DIR ) $(GO_INSTALL ) sigs.k8s.io/controller-tools/cmd/controller-gen $(CONTROLLER_GEN_BIN ) $(CONTROLLER_GEN_VER )
183+ @UNCOMPRESSED=true hack/uget.sh \
184+ https://github.com/kubernetes-sigs/controller-tools/releases/download/{VERSION}/controller-gen-{GOOS}-{GOARCH} \
185+ ${CONTROLLER_GEN_BIN} \
186+ ${CONTROLLER_GEN_VER} \
187+ ${CONTROLLER_GEN_BIN} *
184188
185189$(YAML_PATCH ) :
186- GOBIN= $( TOOLS_GOBIN_DIR ) $( GO_INSTALL ) github.com/pivotal-cf/yaml-patch/cmd/yaml-patch $(YAML_PATCH_BIN ) $(YAML_PATCH_VER )
190+ @GO_MODULE=true hack/uget.sh github.com/pivotal-cf/yaml-patch/cmd/yaml-patch $(YAML_PATCH_BIN ) $(YAML_PATCH_VER )
187191
188192$(GOTESTSUM ) :
189- GOBIN=$(TOOLS_GOBIN_DIR ) $(GO_INSTALL ) gotest.tools/gotestsum $(GOTESTSUM_BIN ) $(GOTESTSUM_VER )
193+ @hack/uget.sh \
194+ https://github.com/gotestyourself/gotestsum/releases/download/v{VERSION}/gotestsum_{VERSION}_{GOOS}_{GOARCH}.tar.gz \
195+ ${GOTESTSUM_BIN} \
196+ ${GOTESTSUM_VER} \
197+ ${GOTESTSUM_BIN}
190198
191199$(KUBE_CLIENT_GEN ) :
192- GOBIN= $( GOBIN_DIR ) $( GO_INSTALL ) k8s.io/code-generator/cmd/$(KUBE_CLIENT_GEN_BIN ) $(KUBE_CLIENT_GEN_BIN ) $(KUBE_CLIENT_GEN_VER )
200+ @GO_MODULE=true hack/uget.sh k8s.io/code-generator/cmd/$(KUBE_CLIENT_GEN_BIN ) $(KUBE_CLIENT_GEN_BIN ) $(KUBE_CLIENT_GEN_VER )
193201$(KUBE_LISTER_GEN ) :
194- GOBIN= $( GOBIN_DIR ) $( GO_INSTALL ) k8s.io/code-generator/cmd/$(KUBE_LISTER_GEN_BIN ) $(KUBE_LISTER_GEN_BIN ) $(KUBE_LISTER_GEN_VER )
202+ @GO_MODULE=true hack/uget.sh k8s.io/code-generator/cmd/$(KUBE_LISTER_GEN_BIN ) $(KUBE_LISTER_GEN_BIN ) $(KUBE_LISTER_GEN_VER )
195203$(KUBE_INFORMER_GEN ) :
196- GOBIN= $( GOBIN_DIR ) $( GO_INSTALL ) k8s.io/code-generator/cmd/$(KUBE_INFORMER_GEN_BIN ) $(KUBE_INFORMER_GEN_BIN ) $(KUBE_INFORMER_GEN_VER )
204+ @GO_MODULE=true hack/uget.sh k8s.io/code-generator/cmd/$(KUBE_INFORMER_GEN_BIN ) $(KUBE_INFORMER_GEN_BIN ) $(KUBE_INFORMER_GEN_VER )
197205$(KUBE_APPLYCONFIGURATION_GEN ) :
198- GOBIN=$(GOBIN_DIR ) $(GO_INSTALL ) k8s.io/code-generator/cmd/$(KUBE_APPLYCONFIGURATION_GEN_BIN ) $(KUBE_APPLYCONFIGURATION_GEN_BIN ) $(KUBE_APPLYCONFIGURATION_GEN_VER )
199-
206+ @GO_MODULE=true hack/uget.sh k8s.io/code-generator/cmd/$(KUBE_APPLYCONFIGURATION_GEN_BIN ) $(KUBE_APPLYCONFIGURATION_GEN_BIN ) $(KUBE_APPLYCONFIGURATION_GEN_VER )
200207
201208codegen : $(CONTROLLER_GEN ) $(YAML_PATCH ) $(CODE_GENERATOR ) $(KUBE_CLIENT_GEN ) $(KUBE_LISTER_GEN ) $(KUBE_INFORMER_GEN ) $(KUBE_APPLYCONFIGURATION_GEN ) # # Generate code
202209 go mod download
@@ -232,13 +239,15 @@ imports: $(GOLANGCI_LINT) verify-go-versions ## Fix imports and format code
232239 fi
233240
234241$(TOOLS_DIR ) /verify_boilerplate.py :
235- mkdir -p $(TOOLS_DIR )
236- curl --fail --retry 3 -L -o $(TOOLS_DIR ) /verify_boilerplate.py https://raw.githubusercontent.com/kubernetes/repo-infra/master/hack/verify_boilerplate.py
237- chmod +x $(TOOLS_DIR ) /verify_boilerplate.py
242+ @UNCOMPRESSED=true hack/uget.sh \
243+ https://raw.githubusercontent.com/kubernetes/repo-infra/master/hack/verify_boilerplate.py \
244+ verify_boilerplate.py \
245+ 201dcad9616c117927232ee0bc499ff38a27023e \
246+ verify_boilerplate.py
238247
239248.PHONY : verify-boilerplate
240249verify-boilerplate : $(TOOLS_DIR ) /verify_boilerplate.py
241- $(TOOLS_DIR ) /verify_boilerplate.py --boilerplate-dir=hack/boilerplate --skip dex
250+ $(TOOLS_DIR ) /verify_boilerplate.py --boilerplate-dir=hack/boilerplate --skip dex --skip hack/uget.sh
242251
243252ifdef ARTIFACT_DIR
244253GOTESTSUM_ARGS += --junitfile=$(ARTIFACT_DIR ) /junit.xml
@@ -257,22 +266,25 @@ else
257266E2E_PARALLELISM_FLAG :=
258267endif
259268
269+ # dex does not publish binaries for their releases, and their go.mod file
270+ # is missing "/v2" and so dex cannot be installed as a Go dependency. Cloning
271+ # the repo and building it by hand is the best of the worst approaches remaining.
272+ DEX_TMP_DIR = $(TOOLS_DIR ) /dex-clone-$(DEX_VER )
260273$(DEX ) :
261274 mkdir -p $(TOOLS_DIR )
262- git clone --branch $(DEX_VER ) --depth 1 https://github.com/dexidp/dex $(TOOLS_DIR ) /dex-clone- $( DEX_VER ) || true
263- cd $(TOOLS_DIR ) /dex-clone- $( DEX_VER ) && GOWORK=off make build
264- cp -a $(TOOLS_DIR ) /dex-clone- $( DEX_VER ) /bin/dex $(DEX )
265- ln -sf $(DEX ) $( TOOLS_GOBIN_DIR ) /dex
275+ git clone --branch $(DEX_VER ) --depth 1 https://github.com/dexidp/dex $(DEX_TMP_DIR ) || true
276+ cd $(DEX_TMP_DIR ) && GOWORK=off make build
277+ cp -a $(DEX_TMP_DIR ) /bin/dex $(DEX )
278+ rm -rf $(DEX_TMP_DIR )
266279
267280run-dex : $(DEX )
268281 $(DEX ) serve hack/dex-config-dev.yaml
269282
270283$(KCP ) :
271- mkdir -p $(TOOLS_DIR )
272- curl --fail --retry 3 -L " https://github.com/kcp-dev/kcp/releases/download/$( KCP_VER) /kcp_$( KCP_VER:v%=%) _$( OS) _$( ARCH) .tar.gz" | \
273- tar xz -C " $( TOOLS_DIR) " --strip-components=" 1" bin/kcp
274- mv $(TOOLS_DIR ) /kcp $(KCP )
275- ln -sf $(KCP ) $(TOOLS_GOBIN_DIR ) /kcp
284+ @hack/uget.sh \
285+ https://github.com/kcp-dev/kcp/releases/download/v{VERSION}/kcp_{VERSION}_{GOOS}_{GOARCH}.tar.gz \
286+ $(KCP_BIN ) \
287+ $(KCP_VER )
276288
277289run-kcp : $(KCP )
278290 $(KCP_CMD ) start --bind-address=127.0.0.1
@@ -375,7 +387,7 @@ deploy-docs: venv ## Deploy docs
375387 . $(VENV ) /activate; \
376388 REMOTE=$(REMOTE ) BRANCH=$(BRANCH ) docs/scripts/deploy-docs.sh
377389
378- # Example: make IMAGE_REPO=ghcr.io/<username> image-local
390+ # Example: make IMAGE_REPO=ghcr.io/<username> image-local
379391.PHONY : image-local
380392image-local :
381393 @echo " Building images locally with tag $( REV) "
@@ -410,7 +422,7 @@ kind-load:
410422helm-build-local : # # Build and package Helm charts locally for testing
411423 @echo " Building Helm charts locally..."
412424 @command -v helm > /dev/null 2>&1 || { echo " helm not found. Install from: https://helm.sh/docs/intro/install/" ; exit 1; }
413-
425+
414426 @# Set chart version to semver format for local builds (0.0.0-<git-sha>)
415427 CHART_VERSION="0.0.0-$(REV)"; \
416428 for chart_dir in deploy/charts/*/; do \
@@ -439,7 +451,7 @@ helm-clean: ## Clean up built helm charts
439451helm-push-local : # # Push Helm charts to IMAGE_REPO registry
440452 @echo " Pushing Helm charts to registry: $( IMAGE_REPO) "
441453 @command -v helm > /dev/null 2>&1 || { echo " helm not found. Install from: https://helm.sh/docs/intro/install/" ; exit 1; }
442-
454+
443455 CHART_VERSION="0.0.0-$(REV)"; \
444456 export HELM_EXPERIMENTAL_OCI=1; \
445457 for chart_file in ./bin/*-$$CHART_VERSION.tgz; do \
0 commit comments