From 23a0217cae3bc16d509bc19f03ef3459fc8d4391 Mon Sep 17 00:00:00 2001 From: Sanskar Jaiswal Date: Mon, 13 Dec 2021 16:33:55 +0530 Subject: [PATCH] fix potentially broken support for macOS macOS support is broken for users who rely on the Makefile to install libgit2 for them. libgit2.1.1.dylib could not be dynamically linked at runtime because it couldn't be found. This patch makes the following changes to the Makefile: 1) Respects the user's PKG_CONFIG_PATH present in the env so that both libgit2.pc and openssl.pc are discoverable. 2) Embeds the required rpath in the binary at compile time, so that libgit2.1.1.dylib can be found at runtime. For more info see: https://github.com/fluxcd/source-controller/pull/515#discussion_r764245029 Signed-off-by: Sanskar Jaiswal --- Makefile | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 87ddee68..e89d99f4 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,10 @@ endif ifeq ($(shell uname -s),Darwin) LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.$(LIBGIT2_VERSION).dylib + HAS_BREW := $(shell brew --version 2>/dev/null) +ifdef HAS_BREW + HAS_OPENSSL := $(shell brew --prefix openssl@1.1) +endif endif # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) @@ -56,6 +60,16 @@ else GOBIN=$(shell go env GOBIN) endif +ifeq ($(strip ${PKG_CONFIG_PATH}),) + MAKE_PKG_CONFIG_PATH = $(LIBGIT2_LIB_PATH)/pkgconfig +else + MAKE_PKG_CONFIG_PATH = ${PKG_CONFIG_PATH}:$(LIBGIT2_LIB_PATH)/pkgconfig +endif + +ifdef HAS_OPENSSL + MAKE_PKG_CONFIG_PATH := $(MAKE_PKG_CONFIG_PATH):$(HAS_OPENSSL)/lib/pkgconfig +endif + TEST_CRDS := controllers/testdata/crds # Log level for `make run` @@ -88,19 +102,39 @@ ${CACHE}/imagepolicies_${REFLECTOR_VER}.yaml: -o ${CACHE}/imagepolicies_${REFLECTOR_VER}.yaml test: $(LIBGIT2) test-api test_deps generate fmt vet manifests api-docs ## Run tests +ifeq ($(shell uname -s),Darwin) LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \ - PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH)/pkgconfig/:$(PKG_CONFIG_PATH) \ + PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \ + CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \ go test ./... -coverprofile cover.out +else + LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \ + PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \ + go test ./... -coverprofile cover.out +endif test-api: ## Run api tests cd api; go test ./... -coverprofile cover.out manager: $(LIBGIT2) generate fmt vet ## Build manager binary - PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH)/pkgconfig/:$(PKG_CONFIG_PATH) \ +ifeq ($(shell uname -s),Darwin) + PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \ + CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \ + go build -o bin/manager main.go +else + PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \ + CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \ go build -o bin/manager main.go +endif + run: $(LIBGIT2) generate fmt vet manifests # Run against the configured Kubernetes cluster in ~/.kube/config +ifeq ($(shell uname -s),Darwin) + CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \ go run ./main.go --log-level=${LOG_LEVEL} --log-encoding=console +else + go run ./main.go --log-level=${LOG_LEVEL} --log-encoding=console +endif install: manifests ## Install CRDs into a cluster kustomize build config/crd | kubectl apply -f - @@ -133,9 +167,17 @@ fmt: ## Run go fmt against code cd api; go fmt ./... vet: $(LIBGIT2) ## Run go vet against code - PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH)/pkgconfig:$(PKG_CONFIG_PATH) \ +ifeq ($(shell uname -s),Darwin) + PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \ + CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \ + go vet ./... + cd api; go vet ./... +else + PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \ go vet ./... cd api; go vet ./... +endif + generate: controller-gen ## Generate code cd api; $(CONTROLLER_GEN) object:headerFile="../hack/boilerplate.go.txt" paths="./..."