GOOS := $(if $(GOOS),$(GOOS),linux)
GOARCH := $(if $(GOARCH),$(GOARCH),amd64)
GO=GO15VENDOREXPERIMENT="1" CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) GO111MODULE=on go
GOTEST=GO15VENDOREXPERIMENT="1" CGO_ENABLED=1 GO111MODULE=on go test # go race detector requires cgo
VERSION   := $(if $(VERSION),$(VERSION),latest)
DOCKER_REGISTRY := $(if $(DOCKER_REGISTRY),$(DOCKER_REGISTRY),hub.pingcap.net/schrodinger)

PACKAGES := $$(go list ./...| grep -vE 'vendor' )
TEST_DIR := /tmp/schrodinger_test

FILES     := $$(find . -name "*.go" | grep -vE "vendor")
GOFILTER := grep -vE 'vendor|render.Delims|bindata_assetfs|testutil|\.pb\.go'
GOCHECKER := $(GOFILTER) | awk '{ print } END { if (NR > 0) { exit 1 } }'
GOLINT := go list ./... | grep -vE 'vendor' | xargs -L1 -I {} golint {} 2>&1 | $(GOCHECKER)

LDFLAGS += -X "github.com/pingcap/schrodinger/util.BuildTS=$(shell date -u '+%Y-%m-%d %I:%M:%S')"
LDFLAGS += -X "github.com/pingcap/schrodinger/util.BuildHash=$(shell git rev-parse HEAD)"

GOBUILD=$(GO) build -ldflags '$(LDFLAGS)'

default: build

build: manager agent sch-ctl buildbot notifier-mgr

all: check test manager agent sch-ctl notifier-mgr

agent:
	$(GOBUILD) $(GOMOD) -o bin/agent cmd/agent/agent.go

manager:
	$(GOBUILD) $(GOMOD) -o bin/manager cmd/manager/*.go

sch-ctl:
	$(GOBUILD) $(GOMOD) -o bin/sch-ctl cmd/sch-ctl/*.go

notifier-mgr:
	$(GOBUILD) $(GOMOD) -o bin/notifier-mgr cmd/notifier-mgr/main.go

buildbot:
	$(GOBUILD) $(GOMOD) -o bin/buildbot cmd/buildbot/*.go

buildbot-docker: buildbot
	mkdir -p docker/bin
	mkdir -p docker/conf
	cp bin/buildbot docker/bin/
	cp cmd/buildbot/config.toml docker/conf
	cp cmd/buildbot/config.json docker/conf
	cd docker && sudo docker build --no-cache --network=host --tag "$(DOCKER_REGISTRY)/buildbot:$(VERSION)" --file buildBotDockerfile .
	docker push "$(DOCKER_REGISTRY)/buildbot:$(VERSION)"
	rm -rf docker/bin docker/conf


entrypoint-docker:
	cp -R hack docker/
	cd docker && docker build --network=host --tag "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-tikv:$(VERSION)" --file tikvDockerfile .
	docker push "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-tikv:$(VERSION)"
	cd docker && docker build --network=host --tag "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-tidb:$(VERSION)" --file tidbDockerfile .
	docker push "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-tidb:$(VERSION)"
	cd docker && docker build --network=host --tag "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-pd:$(VERSION)" --file pdDockerfile .
	docker push "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-pd:$(VERSION)"
	rm -rf docker/hack

daemon-docker:
	cp -R daemon docker/
	cd docker && docker build --no-cache --network=host --tag "$(DOCKER_REGISTRY)/centos-daemon:fuse6" --file DaemonDockerfile .
	rm -rf docker/daemon

chaos:
	cd hack/chaos/injuredfs && ./prepare.sh && make clean && make

chaos-docker:
	cp -R hack docker/
	cd docker && docker build --no-cache --network=host --tag "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-tikv-fuse:$(VERSION)" --file tikvFuseDockerfile .
	docker push "$(DOCKER_REGISTRY)/alpine-glibc-schrodinger-tikv-fuse:$(VERSION)"
	rm -rf docker/hack

agent-docker: agent
	mkdir -p docker/etc && mkdir -p docker/bin/tools && mkdir -p docker/build
	cp -r helper/yum.repos.d docker/etc/
	mkdir -p docker/bin && cp bin/agent docker/bin/
	cd docker && sudo docker build --network=host --tag "$(DOCKER_REGISTRY)/agent:$(VERSION)" --file Dockerfile .
	sudo docker push "$(DOCKER_REGISTRY)/agent:$(VERSION)"
	rm -rf docker/bin

lightning-docker: agent
	mkdir -p docker/bin && cp bin/agent docker/bin
	cd docker && sudo docker build --network=host --tag "$(DOCKER_REGISTRY)/lightningagent:$(VERSION)" --file lightningDockerfile .
	sudo docker push "$(DOCKER_REGISTRY)/lightningagent:$(VERSION)"
	rm -rf docker/bin

test:
	mkdir -p $(TEST_DIR)
	@export log_level=error; \
	$(GOTEST) $(GOMOD) -p 2 -covermode=atomic -coverprofile="$(TEST_DIR)/cov.unit_test.out" -race $(PACKAGES)

check:
	GO111MODULE=off go get golang.org/x/lint/golint

	@echo "vet"

	${GO} vet -all ./...

	@echo "golint"
	@ $(GOLINT)
	@echo "gofmt"
	@gofmt -s -l -w $(FILES) 2>&1 | $(GOCHECKER)

coverage:
	GO111MODULE=off go get github.com/zhouqiang-cl/gocovmerge
	gocovmerge "$(TEST_DIR)"/cov.* | grep -vE ".*.pb.go" > "$(TEST_DIR)/all_cov.out"
ifeq ("$(JenkinsCI)", "1")
	GO111MODULE=off go get github.com/mattn/goveralls
	@goveralls -coverprofile=$(TEST_DIR)/all_cov.out -service=jenkins-ci -repotoken $(COVERALLS_TOKEN)
else
	go tool cover -html "$(TEST_DIR)/all_cov.out" -o "$(TEST_DIR)/all_cov.html"
endif

update:
	which dep 2>/dev/null || go get -u github.com/golang/dep/cmd/dep
ifdef PKG
	dep ensure -add ${PKG}
else
	dep ensure -update
endif
	@echo "removing test files"
	dep prune
	bash ./hack/clean_vendor.sh

clean:
	@rm -rf bin/*

.PHONY: all test clean agent manager buildbot event sch-ctl bots
