GO=GO15VENDOREXPERIMENT="1" CGO_ENABLED=0 GO111MODULE=on go
GO_CGO=GO15VENDOREXPERIMENT="1" CGO_ENABLED=1 GO111MODULE=on go
GORACE=CGO_ENABLED=1 GO111MODULE=on go build -race
# go race detector requires cgo
GOTEST=GO15VENDOREXPERIMENT="1" CGO_ENABLED=1 GO111MODULE=on go test

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

GOFILTER := grep -vE 'vendor|render.Delims|bindata_assetfs|testutil'
GOCHECKER := $(GOFILTER) | awk '{ print } END { if (NR > 0) { exit 1 } }'

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

TEST_DDL_TRANSACTION_LDFLAGS =  '-X "github.com/pingcap/schrodinger-test/logic/ddl.enableTransactionTestFlag=1"'

default: build

all: build

build:
	$(GOBUILD) ./...

bank:
	$(GOBUILD_CGO) -o bin/bank transaction/bank/*.go

bank2:
	$(GOBUILD_CGO) -o bin/bank2 transaction/bank2/*.go

random_nemesis:
	$(GOBUILD_CGO) -o bin/random_nemesis nemesis/random/*.go

leak:
	$(GOBUILD_CGO) -o bin/leak nemesis/leak/*.go

failpoint_nemesis:
	$(GOBUILD_CGO) -o bin/failpoint_nemesis nemesis/failpoint/*.go

shuffle_nemesis:
	$(GOBUILD_CGO) -o bin/shuffle_nemesis nemesis/shuffle/*.go

randgen:
	$(GOBUILD_CGO) -o bin/randgen randgen/*.go

tpcc:
	$(GOBUILD_CGO) -o bin/tpcc tpcc/cmd/*.go

crud:
	$(GOBUILD_CGO) -o bin/crud transaction/crud/*.go

ledger:
	$(GOBUILD_CGO) -o bin/ledger transaction/ledger/*.go

mvcc_bank:
	$(GOBUILD_CGO) -o bin/mvcc_bank transaction/mvcc_bank/*.go

block_writer:
	$(GOBUILD_CGO) -o bin/block_writer write/block_writer/*.go

log:
	$(GOBUILD_CGO) -o bin/log write/log/*.go

binlog:
	$(GOBUILD_CGO) -o bin/binlog binlog/*.go

dm-test:
	$(GORACE) -o bin/dm-test dm/*.go

dm-demo:
	$(GOBUILD_CGO) -o bin/dm-demo tools/dm/*.go

mysql-replicate:
	$(GOBUILD_CGO) -o bin/mysql-replicate tools/test_replicate/*.go

small_writer:
	$(GOBUILD_CGO) -o bin/small_writer write/small_writer/*.go

on_dup:
	$(GOBUILD_CGO) -o bin/on_dup logic/on_dup/*.go

#stmt_retry:
#	$(GOBUILD_CGO) -o bin/stmt_retry logic/stmt_retry/*.go

merge:
	$(GOBUILD_CGO) -o bin/merge logic/merge/*.go

ddl:
	$(GORACE) -o bin/ddl logic/sddl/*.go

ddl-transaction:
	$(GORACE) -ldflags $(TEST_DDL_TRANSACTION_LDFLAGS) -o bin/ddl-transaction logic/sddl/*.go

pddl:
	$(GORACE) -o bin/pddl logic/pddl/*.go

rand_txn:
	$(GOBUILD) -o bin/rand_txn randtxn/*.go

sqllogic:
	$(GOBUILD) -o bin/sqllogic sqllogic/*.go

sysbench:
	$(GOBUILD_CGO) -o bin/sysbench sysbench/*.go

reverse_scan:
	$(GOBUILD_CGO) -o bin/reverse_scan scan/reverse_scan/*.go

scan_end_limit:
	$(GOBUILD_CGO) -o bin/scan_end_limit scan/scan_end_limit/*.go

tpch:
	$(GOBUILD) -o bin/tpch bench/tpch/*.go

bench_block_write:
	$(GOBUILD) -o bin/bench_block_write bench/block_write/*.go

bench_sysbench:
	$(GOBUILD) -o bin/bench_sysbench bench/bench_sysbench/*.go

bench_ycsb:
	$(GOBUILD) -o bin/bench_ycsb bench/bench_ycsb/*.go

bench_hierarchy:
	$(GOBUILD) -o bin/bench_hierarchy bench/bench_hierarchy/*.go
	
bench_large_table:
	$(GOBUILD) -o bin/bench_large_table bench/bench_large_table/*.go

upgrade:
	$(GOBUILD_CGO) -o bin/upgrade upgrade/*.go

tpch-10:
	$(GOBUILD_CGO) -o bin/tpch-10 tpch-10/*.go

verify_upgrade:
	$(GOBUILD_CGO) -o bin/verify_upgrade verify_upgrade/*.go

prepare:
	$(GOBUILD) -o bin/prepare prepare/prepare/*.go

backup:
	$(GOBUILD) -o bin/backup prepare/backup/*.go

admin_check:
	$(GOBUILD) -o bin/admin_check check/admin_check/*.go

panic_check:
	$(GOBUILD) -o bin/panic_check panic_check_v2/*.go

lightning:
	$(GOBUILD) -o bin/lightning lightning/*.go

gorm_test:
	$(GOTEST) -c -o bin/gorm_test gorm_test/gorm/*.go

xorm_test:
	$(GOTEST) -c -o bin/xorm_test xorm_test/*.go

mysql_test:
	$(GOBUILD) -o bin/mysql_test mysql_test/*.go

tidb_test:
	$(GOBUILD_CGO) -o bin/tidb_test tidb_test/*.go

chaos_tidb:
	$(GOBUILD_CGO) -o bin/chaos_tidb chaos/tidb/main.go

chaos_txn_register:
	$(GOBUILD_CGO) -o bin/chaos_txn_register chaos/txn_register/main.go

chaos_rawkv_register:
	$(GOBUILD_CGO) -o bin/chaos_rawkv_register chaos/rawkv_register/main.go

stop-node-test:
	$(GOBUILD_CGO) -o bin/stop-node-test nemesis/custom/*.go

tikv_fuzz:
	@mkdir bin
	@cp fuzz/tikv.sh bin/tikv_fuzz
	@chmod +x bin/tikv_fuzz
	
gc_unsafe_destroy_range:
	$(GOBUILD_CGO) -o bin/gc_unsafe_destroy_range gc/gc_unsafe_destroy_range/*.go

codec_bytes:
	bash fuzz/tikv.sh codec_bytes bin

codec_number:
	bash fuzz/tikv.sh codec_number bin

coprocessor_codec_mysql_decimal:
	bash fuzz/tikv.sh coprocessor_codec_mysql_decimal bin

scan_out_of_bounds:
	$(GOBUILD_CGO) -o bin/scan_out_of_bounds logic/scan_out_of_bounds/*.go

rocksdb_stress:
	$(GOBUILD_CGO) -o bin/rocksdb_stress stress/rocksdb/*.go

titandb_stress:
	$(GOBUILD_CGO) -o bin/titandb_stress stress/titandb/*.go

pd_simulator:
	$(GOBUILD_CGO) -o bin/pd_simulator pd_simulator/*.go

consistency_check:
	$(GOBUILD_CGO) -o bin/consistency_check consistency_check/*.go

sysvars:
	$(GOBUILD_CGO) -o bin/sysvars sysvars/*.go

region_available:
	$(GOBUILD_CGO) -o bin/region_available region_available/*.go

update_conflicts:
	$(GOBUILD_CGO) -o bin/update_conflicts update_conflicts/*.go

pd_stability_test:
	$(GOBUILD_CGO) -o bin/pd_stability_test pd/stability_test/*.go

widetbl:
	$(GOBUILD) -o bin/widetbl widetbl/*.go

pd_nemesis:
	$(GOBUILD_CGO) -o bin/pd_nemesis pd/nemesis/*.go

hot_scheduler_test:
	$(GOBUILD_CGO) -o bin/hot_scheduler_test pd/hot_scheduler/*.go

tibug-52:
	$(GOBUILD) -o bin/tibug-52 once/cases/tibug-52/*.go

scale:
	$(GOBUILD_CGO) -o bin/scale scale/*.go

random_kill:
	$(GOBUILD_CGO) -o bin/random-kill random_kill/*.go

random_kill_auto_random:
	$(GOBUILD_CGO) -o bin/random_kill_auto_random random_kill_auto_random/*.go

once-pd-evict-leader-tibug-51:
	$(GOBUILD_CGO) -o bin/once-pd-evict-leader-tibug-51 once/cases/tibug-51/main.go

tikvclient:
	$(GOBUILD_CGO) -o bin/tikvclient tikvclient/*.go

titandb_downgrade:
	$(GOBUILD_CGO) -o bin/titandb_downgrade titandb_test/downgrade/*.go

threaded_raftstore_hotspot:
	$(GOBUILD_CGO) -o bin/threaded_raftstore_hotspot threaded-raftstore/hotspot/*.go

threaded_raftstore_frequent_scheduling:
	$(GOBUILD_CGO) -o bin/threaded_raftstore_frequent_scheduling threaded-raftstore/frequent-scheduling/*.go

follower_read:
	$(GOBUILD_CGO) -o bin/follower_read logic/follower_read/*.go
  
read_write_conflicts:
	$(GOBUILD_CGO) -o bin/read_write_conflicts read_write_conflicts/*.go

random_network_chaos:
	$(GOBUILD_CGO) -o bin/random_network_chaos nemesis/network/*.go

txn_keep_alive:
	$(GOBUILD_CGO) -o bin/txn_keep_alive transaction/txn_keep_alive/*.go

test:
	$(GOTEST) ./...

go_check:
	GO111MODULE=on go get github.com/golang/lint/golint
	@echo "vet"
	@go vet -all -shadow ./...
	@echo "golint"
	@ $(GOLINT)
	@echo "gofmt"
	@gofmt -s -l -w $(FILES) 2>&1 | $(GOCHECKER)

clean:
	@rm -rf bin/*

tibug-53:
	$(GOBUILD) -o bin/tibug-53 once/cases/tibug-53/*.go

tibug-59:
	$(GOBUILD) -o bin/tibug-59 once/cases/tibug-59/*.go

.PHONY: update clean nemesis randgen tpcc random_nemesis sqllogic \
sysbench panic_check verify_upgrade upgrade binlog tpch-10 dm-test tidb_test \
gorm_test stop-node-test lightning dm-demo mysql-replicate mysql_test sysvars \
chaos_tidb chaos_txn_register chaos_rawkv_register consistency_check xorm_test pd_simulator \
pd_stability_test prepare scale bench_large_table bench_sysbench region_available random_kill hot_scheduler_test \
scan_end_limit gc_unsafe_destroy_range tikvclient widetbl update_conflicts read_write_conflicts follower_read \
random_network_chaos tibug-52 tibug-53 tibug-59 txn_keep_alive random_kill_auto_random