SHELL = /bin/bash
# ALL_PKGS is the list of all packages where ALL_SRC files reside.
ALL_PKGS := $(sort $(shell go list ./...))
# COVER_PKGS is the list of packages to include in the coverage
COVER_PKGS := $(shell go list ./... | tr "\n" ",")

GOTEST_OPT?= -race -timeout 120s
GOCMD?= go
GOTEST=$(GOCMD) test
GOOS := $(shell $(GOCMD) env GOOS)
GOARCH := $(shell $(GOCMD) env GOARCH)

# SRC_ROOT is the top of the source tree.
SRC_ROOT := $(shell git rev-parse --show-toplevel)

TOOLS_MOD_DIR   := $(SRC_ROOT)/internal/tools
TOOLS_BIN_DIR   := $(SRC_ROOT)/.tools
TOOLS_MOD_REGEX := "\s+_\s+\".*\""
TOOLS_PKG_NAMES := $(shell grep -E $(TOOLS_MOD_REGEX) < $(TOOLS_MOD_DIR)/tools.go | tr -d " _\"" | grep -vE '/v[0-9]+$$')
TOOLS_BIN_NAMES := $(addprefix $(TOOLS_BIN_DIR)/, $(notdir $(shell echo $(TOOLS_PKG_NAMES))))
CHLOGGEN_CONFIG := .chloggen/config.yaml

ADDLICENSE   := $(TOOLS_BIN_DIR)/addlicense
APIDIFF      := $(TOOLS_BIN_DIR)/apidiff
CHECKFILE    := $(TOOLS_BIN_DIR)/checkfile
CHLOGGEN     := $(TOOLS_BIN_DIR)/chloggen
CROSSLINK    := $(TOOLS_BIN_DIR)/crosslink
ENVSUBST     := $(TOOLS_BIN_DIR)/envsubst
GOIMPORTS    := $(TOOLS_BIN_DIR)/goimports
GOVULNCHECK  := $(TOOLS_BIN_DIR)/govulncheck
LINT         := $(TOOLS_BIN_DIR)/golangci-lint
IMPI         := $(TOOLS_BIN_DIR)/impi
MISSPELL     := $(TOOLS_BIN_DIR)/misspell
MULTIMOD     := $(TOOLS_BIN_DIR)/multimod
PORTO        := $(TOOLS_BIN_DIR)/porto
SEMCONVGEN   := $(TOOLS_BIN_DIR)/semconvgen
SEMCONVKIT   := $(TOOLS_BIN_DIR)/semconvkit

.PHONY: install-tools
install-tools: $(TOOLS_BIN_NAMES)

$(TOOLS_BIN_DIR):
	mkdir -p $@

$(TOOLS_BIN_NAMES): $(TOOLS_BIN_DIR) $(TOOLS_MOD_DIR)/go.mod
	cd $(TOOLS_MOD_DIR) && $(GOCMD) build -o $@ -trimpath $(filter %/$(notdir $@),$(TOOLS_PKG_NAMES))

.PHONY: test
test:
	$(GOTEST) $(GOTEST_OPT) ./...

.PHONY: test-with-cover
test-with-cover: $(GO_ACC)
	mkdir -p $(PWD)/coverage/unit
	$(GOTEST) $(GOTEST_OPT) -cover ./... -covermode=atomic -coverpkg $(COVER_PKGS) -args -test.gocoverdir="$(PWD)/coverage/unit"

.PHONY: benchmark
benchmark:
	$(GOTEST) -bench=. -run=notests ./... | tee benchmark.txt

.PHONY: fmt
fmt: $(GOIMPORTS)
	gofmt -w -s ./
	$(GOIMPORTS) -w  -local go.opentelemetry.io/collector ./

.PHONY: tidy
tidy:
	rm -fr go.sum
	$(GOCMD) mod tidy -compat=1.21

.PHONY: lint
lint: $(LINT)
	$(LINT) run

.PHONY: govulncheck
govulncheck: $(GOVULNCHECK)
	$(GOVULNCHECK) ./...

.PHONY: generate
generate:
	$(GOCMD) generate ./...

.PHONY: impi
impi: $(IMPI)
	@$(IMPI) --local go.opentelemetry.io/collector --scheme stdThirdPartyLocal ./...

.PHONY: moddownload
moddownload:
	$(GOCMD) mod download
