11# Image URL to use all building/pushing image targets
22IMG ?= fluxcd/source-controller:latest
3+
4+ # Base image used to build the Go binary
5+ BASE_IMG ?= ghcr.io/hiddeco/golang-with-libgit2
6+ BASE_TAG ?= dev
7+
38# Produce CRDs that work back to Kubernetes 1.16
49CRD_OPTIONS ?= crd:crdVersions=v1
510
6- ENVTEST_BIN_VERSION? =1.19.2
7- KUBEBUILDER_ASSETS? =$(shell $(SETUP_ENVTEST ) use -i $(ENVTEST_BIN_VERSION ) -p path)
11+ # Repository root based on Git metadata
12+ REPOSITORY_ROOT := $(shell git rev-parse --show-toplevel)
13+
14+ # Dependency versions
15+ LIBGIT2_VERSION ?= 1.2.0
16+ ENVTEST_BIN_VERSION ?= 1.19.2
17+ KUBEBUILDER_ASSETS ?= $(shell $(SETUP_ENVTEST ) use -i $(ENVTEST_BIN_VERSION ) -p path)
18+
19+ # libgit2 related magical paths
20+ # These are used to determine if the target libgit2 version is already available on
21+ # the system, or where they should be installed to
22+ SYSTEM_LIBGIT2_VERSION := $(shell pkg-config --modversion libgit2 2>/dev/null)
23+ LIBGIT2_PATH := $(REPOSITORY_ROOT ) /hack/libgit2
24+ LIBGIT2_LIB_PATH := $(LIBGIT2_PATH ) /lib
25+ LIBGIT2 := $(LIBGIT2_LIB_PATH ) /libgit2.so.$(LIBGIT2_VERSION )
26+
27+ # API (doc) generation utilities
28+ CONTROLLER_GEN_VERSION ?= v0.5.0
29+ GEN_API_REF_DOCS_VERSION ?= 0.3.0
830
931# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
1032ifeq (,$(shell go env GOBIN) )
@@ -13,121 +35,130 @@ else
1335GOBIN =$(shell go env GOBIN)
1436endif
1537
16- all : manager
38+ all : build
1739
18- # Run tests
19- test : generate fmt vet manifests api-docs setup-envtest
20- KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS ) go test ./... -coverprofile cover.out
21- cd api; go test ./... -coverprofile cover.out
22-
23- # Build manager binary
24- manager : generate fmt vet
40+ build : $(LIBGIT2 ) # # Build manager binary
41+ PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH ) /pkgconfig/ \
2542 go build -o bin/manager main.go
2643
27- # Run against the configured Kubernetes cluster in ~/.kube/config
28- run : generate fmt vet manifests
44+ test : $(LIBGIT2 ) test-api # # Run tests
45+ LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH ) \
46+ PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH ) /pkgconfig/ \
47+ go test ./... -coverprofile cover.out
48+
49+ test-api : # # Run api tests
50+ cd api; go test ./... -coverprofile cover.out
51+
52+ run : $(LIBGIT2 ) generate fmt vet manifests # # Run against the configured Kubernetes cluster in ~/.kube/config
53+ LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH ) \
2954 go run ./main.go
3055
31- # Install CRDs into a cluster
32- install : manifests
56+ install : manifests # # Install CRDs into a cluster
3357 kustomize build config/crd | kubectl apply -f -
3458
35- # Uninstall CRDs from a cluster
36- uninstall : manifests
59+ uninstall : manifests # # Uninstall CRDs from a cluster
3760 kustomize build config/crd | kubectl delete -f -
3861
39- # Deploy controller in the configured Kubernetes cluster in ~/.kube/config
40- deploy : manifests
62+ deploy : manifests # # Deploy controller in the configured Kubernetes cluster in ~/.kube/config
4163 cd config/manager && kustomize edit set image fluxcd/source-controller=${IMG}
4264 kustomize build config/default | kubectl apply -f -
4365
44- # Deploy controller dev image in the configured Kubernetes cluster in ~/.kube/config
45- dev-deploy :
66+ dev-deploy : # # Deploy controller dev image in the configured Kubernetes cluster in ~/.kube/config
4667 mkdir -p config/dev && cp config/default/* config/dev
4768 cd config/dev && kustomize edit set image fluxcd/source-controller=${IMG}
4869 kustomize build config/dev | kubectl apply -f -
4970 rm -rf config/dev
5071
51- # Generate manifests e.g. CRD, RBAC etc.
52- manifests : controller-gen
72+ manifests : controller-gen # # Generate manifests, e.g. CRD, RBAC, etc.
5373 $(CONTROLLER_GEN ) $(CRD_OPTIONS ) rbac:roleName=manager-role paths=" ./..." output:crd:artifacts:config=" config/crd/bases"
5474 cd api; $(CONTROLLER_GEN ) $(CRD_OPTIONS ) rbac:roleName=manager-role paths=" ./..." output:crd:artifacts:config=" ../config/crd/bases"
5575
56- # Generate API reference documentation
57- api-docs : gen-crd-api-reference-docs
76+ api-docs : gen-crd-api-reference-docs # # Generate API reference documentation
5877 $(API_REF_GEN ) -api-dir=./api/v1beta1 -config=./hack/api-docs/config.json -template-dir=./hack/api-docs/template -out-file=./docs/api/source.md
5978
60- # Run go mod tidy
61- tidy :
79+ tidy : # # Run go mod tidy
6280 go mod tidy
6381 cd api; go mod tidy
6482
65- # Run go fmt against code
66- fmt :
83+ fmt : # # Run go fmt against code
6784 go fmt ./...
6885 cd api; go fmt ./...
6986
70- # Run go vet against code
71- vet :
87+ vet : # # Run go vet against code
88+ PKG_CONFIG_PATH= $( LIBGIT2_LIB_PATH ) /pkgconfig \
7289 go vet ./...
7390 cd api; go vet ./...
7491
75- # Generate code
76- generate : controller-gen
92+ generate : controller-gen # # Generate API code
7793 cd api; $(CONTROLLER_GEN ) object:headerFile=" ../hack/boilerplate.go.txt" paths=" ./..."
7894
79- # Build the docker image
80- docker-build :
81- docker build . -t ${IMG}
95+ docker-build : # # Build the docker image
96+ docker build \
97+ --build-arg BASE_IMG=$(BASE_IMG ) \
98+ --build-arg BASE_TAG=$(BASE_TAG ) \
99+ -t ${IMG} .
82100
83- # Push the docker image
84- docker-push :
101+ docker-push : # # Push docker image
85102 docker push ${IMG}
86103
87- # Find or download controller-gen
88- controller-gen :
104+ controller-gen : # # Find or download controller-gen
89105ifeq (, $(shell which controller-gen) )
90106 @{ \
91- set -e ; \
92- CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ; \
93- cd $$CONTROLLER_GEN_TMP_DIR ; \
94- go mod init tmp ; \
95- go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.5.0 ; \
96- rm -rf $$CONTROLLER_GEN_TMP_DIR ; \
107+ set -e; \
108+ CONTROLLER_GEN_TMP_DIR=$$(mktemp -d); \
109+ cd $$CONTROLLER_GEN_TMP_DIR; \
110+ go mod init tmp; \
111+ go get sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_GEN_VERSION); \
112+ rm -rf $$CONTROLLER_GEN_TMP_DIR; \
97113 }
98114CONTROLLER_GEN =$(GOBIN ) /controller-gen
99115else
100116CONTROLLER_GEN =$(shell which controller-gen)
101117endif
102118
103- # Find or download gen-crd-api-reference-docs
104- gen-crd-api-reference-docs :
119+ gen-crd-api-reference-docs : # # Find or download gen-crd-api-reference-docs
105120ifeq (, $(shell which gen-crd-api-reference-docs) )
106121 @{ \
107- set -e ; \
108- API_REF_GEN_TMP_DIR=$$(mktemp -d) ; \
109- cd $$API_REF_GEN_TMP_DIR ; \
110- go mod init tmp ; \
111- go get github.com/ahmetb/gen-crd-api-reference-docs@v0.3.0 ; \
112- rm -rf $$API_REF_GEN_TMP_DIR ; \
122+ set -e; \
123+ API_REF_GEN_TMP_DIR=$$(mktemp -d); \
124+ cd $$API_REF_GEN_TMP_DIR; \
125+ go mod init tmp; \
126+ go get github.com/ahmetb/gen-crd-api-reference-docs@$(GEN_API_REF_DOCS_VERSION); \
127+ rm -rf $$API_REF_GEN_TMP_DIR; \
113128 }
114129API_REF_GEN =$(GOBIN ) /gen-crd-api-reference-docs
115130else
116131API_REF_GEN =$(shell which gen-crd-api-reference-docs)
117132endif
118133
119- # Find or download setup-envtest
120- setup-envtest :
134+ setup-envtest : # # Find or download setup-envtest
121135ifeq (, $(shell which setup-envtest) )
122136 @{ \
123- set -e ; \
124- SETUP_ENVTEST_TMP_DIR=$$(mktemp -d) ; \
125- cd $$SETUP_ENVTEST_TMP_DIR ; \
126- go mod init tmp ; \
127- go get sigs.k8s.io/controller-runtime/tools/setup-envtest@latest ; \
128- rm -rf $$SETUP_ENVTEST_TMP_DIR ; \
137+ set -e; \
138+ SETUP_ENVTEST_TMP_DIR=$$(mktemp -d); \
139+ cd $$SETUP_ENVTEST_TMP_DIR; \
140+ go mod init tmp; \
141+ go get sigs.k8s.io/controller-runtime/tools/setup-envtest@latest; \
142+ rm -rf $$SETUP_ENVTEST_TMP_DIR; \
129143 }
130144SETUP_ENVTEST =$(GOBIN ) /setup-envtest
131145else
132146SETUP_ENVTEST =$(shell which setup-envtest)
133147endif
148+
149+ libgit2 : $(LIBGIT2 ) # # Detect or download libgit2 library
150+
151+ $(LIBGIT2 ) :
152+ ifeq ($(LIBGIT2_VERSION ) ,$(SYSTEM_LIBGIT2_VERSION ) )
153+ else
154+ @{ \
155+ set -e; \
156+ mkdir -p $(LIBGIT2_PATH); \
157+ docker cp $(shell docker create --rm $(BASE_IMG):$(BASE_TAG)):/libgit2/Makefile $(LIBGIT2_PATH); \
158+ INSTALL_PREFIX=$(LIBGIT2_PATH) make -C $(LIBGIT2_PATH); \
159+ }
160+ endif
161+
162+ .PHONY : help
163+ help : # # Display this help menu
164+ @awk ' BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST )
0 commit comments