BIN ?= $(PWD)/bin

OS ?= $(shell uname | tr "[:upper:]" "[:lower:]")
ARCH ?= $(shell go env GOARCH)
GO := CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) go
GO_TEST_ARGS ?=
GO_TEST_COVERAGE_FILE ?= $(OUTPUT)/coverage.out
DOCKER := DOCKER_BUILDKIT=1 docker
IMAGE ?= hub.pingcap.net/qa/tps
IMAGE_TAG ?= latest

LDFLAGS += -X "main.version=$(shell git describe --tags --dirty --always)"
LDFLAGS += -X "main.buildTime=$(shell date -u '+%Y-%m-%dT%H:%M:%S')"

PLATFORM ?= linux/amd64,linux/arm64

SetupIMG ?= hub.pingcap.net/qa/plansetup:latest

clean:
	@rm -rfv bin/

bin:
	@mkdir -p $(BIN)/$(OS)/$(ARCH)

build: bin
	$(GO) build -o $(BIN)/$(OS)/$(ARCH)/tps -ldflags '$(LDFLAGS)' cmd/tps/main.go

# `ARCH=amd64 make build-image`
build-image: build
	$(DOCKER) build --build-arg arch=$(ARCH) --platform linux/$(ARCH) -t $(IMAGE):$(IMAGE_TAG)-$(ARCH) .

image-arm64:
	ARCH=arm64 OS=linux make build-image

image-amd64:
	ARCH=amd64 OS=linux make build-image

# Multi-arch image, support amd64 and arm64
image: image-amd64 image-arm64

image-push-amd64:
	$(DOCKER) push $(IMAGE):$(IMAGE_TAG)-amd64

image-push-arm64:
	$(DOCKER) push $(IMAGE):$(IMAGE_TAG)-arm64

image-push: image-push-arm64 image-push-amd64
# multi-arch
# TODO(gaozifeng): find a way to skip push image
	$(DOCKER) manifest create $(IMAGE):$(IMAGE_TAG) \
		--amend $(IMAGE):$(IMAGE_TAG)-amd64 \
		--amend $(IMAGE):$(IMAGE_TAG)-arm64
	$(DOCKER) manifest push --purge $(IMAGE):$(IMAGE_TAG)

.PHONY: build clean FORCE

mock-gen: install-mockgen
	mockgen -package mocks -source pkg/common/tcms.go > mocks/mock_tcms.go
	# mockgen -package mocks github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned/typed/workflow/v1alpha1 WorkflowInterface > mocks/mock_argo.go

install-mockgen:
ifeq (, $(shell which mockgen))
	go install github.com/golang/mock/mockgen@v1.6.0
endif

setup-image:
	docker build --platform linux/amd64 . -f dockerfiles/setup.Dockerfile -t $(SetupIMG)

install-linter:
ifeq (, $(shell which golangci-lint))
	go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
endif


lint: install-linter
# only show issues that not exist in main
	golangci-lint run --new-from-rev=origin/main

unit-test:
	go test -v github.com/pingcap/test-infra/services/tps/...

test: unit-test
