Move images into contrib/images/. Replace "bad tag" cosmos-sdk/simapp with cosmos-sdk/simd-env. 'simapp' is a misnomer as the images serves only as host environment for the binaries that are in fact built by the developer on their machine. Remove the build-docker-local-simapp target altogether from the Makefile in favor of an inline conditional statement that causes the image to be rebuilt if and only if it had not been built before. simd binary won't run as root anymore as root privileges are dropped upon simd binary installation. Co-authored-by: Marko Baricevic <marbar3778@yahoo.com> Co-authored-by: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> Co-authored-by: Alessio Treglia <alessio@tendermint.com>
414 lines
16 KiB
Makefile
414 lines
16 KiB
Makefile
#!/usr/bin/make -f
|
|
|
|
PACKAGES_NOSIMULATION=$(shell go list ./... | grep -v '/simulation')
|
|
PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation')
|
|
VERSION := $(shell echo $(shell git describe) | sed 's/^v//')
|
|
COMMIT := $(shell git log -1 --format='%H')
|
|
LEDGER_ENABLED ?= true
|
|
BINDIR ?= $(GOPATH)/bin
|
|
BUILDDIR ?= $(CURDIR)/build
|
|
SIMAPP = ./simapp
|
|
MOCKS_DIR = $(CURDIR)/tests/mocks
|
|
HTTPS_GIT := https://github.com/cosmos/cosmos-sdk.git
|
|
DOCKER_BUF := docker run -v $(shell pwd):/workspace --workdir /workspace bufbuild/buf
|
|
|
|
export GO111MODULE = on
|
|
|
|
# process build tags
|
|
|
|
build_tags = netgo
|
|
ifeq ($(LEDGER_ENABLED),true)
|
|
ifeq ($(OS),Windows_NT)
|
|
GCCEXE = $(shell where gcc.exe 2> NUL)
|
|
ifeq ($(GCCEXE),)
|
|
$(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false)
|
|
else
|
|
build_tags += ledger
|
|
endif
|
|
else
|
|
UNAME_S = $(shell uname -s)
|
|
ifeq ($(UNAME_S),OpenBSD)
|
|
$(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988))
|
|
else
|
|
GCC = $(shell command -v gcc 2> /dev/null)
|
|
ifeq ($(GCC),)
|
|
$(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false)
|
|
else
|
|
build_tags += ledger
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifeq (cleveldb,$(findstring cleveldb,$(COSMOS_BUILD_OPTIONS)))
|
|
build_tags += gcc
|
|
endif
|
|
build_tags += $(BUILD_TAGS)
|
|
build_tags := $(strip $(build_tags))
|
|
|
|
whitespace :=
|
|
whitespace += $(whitespace)
|
|
comma := ,
|
|
build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags))
|
|
|
|
# process linker flags
|
|
|
|
ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=sim \
|
|
-X github.com/cosmos/cosmos-sdk/version.AppName=simd \
|
|
-X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \
|
|
-X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \
|
|
-X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)"
|
|
|
|
ifeq (cleveldb,$(findstring cleveldb,$(COSMOS_BUILD_OPTIONS)))
|
|
ldflags += -X github.com/cosmos/cosmos-sdk/types.DBBackend=cleveldb
|
|
endif
|
|
ifeq (,$(findstring nostrip,$(COSMOS_BUILD_OPTIONS)))
|
|
ldflags += -w -s
|
|
endif
|
|
ldflags += $(LDFLAGS)
|
|
ldflags := $(strip $(ldflags))
|
|
|
|
BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)'
|
|
# check for nostrip option
|
|
ifeq (,$(findstring nostrip,$(COSMOS_BUILD_OPTIONS)))
|
|
BUILD_FLAGS += -trimpath
|
|
endif
|
|
|
|
all: tools build lint test
|
|
|
|
# The below include contains the tools and runsim targets.
|
|
include contrib/devtools/Makefile
|
|
|
|
###############################################################################
|
|
### Build ###
|
|
###############################################################################
|
|
|
|
build: go.sum
|
|
go build -mod=readonly ./...
|
|
|
|
build-simd: go.sum
|
|
mkdir -p $(BUILDDIR)
|
|
go build -mod=readonly $(BUILD_FLAGS) -o $(BUILDDIR) ./simapp/simd
|
|
|
|
build-simd-linux: go.sum
|
|
LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build-simd
|
|
|
|
.PHONY: build build-simd build-simd-linux
|
|
|
|
mocks: $(MOCKS_DIR)
|
|
mockgen -source=client/account_retriever.go -package mocks -destination tests/mocks/account_retriever.go
|
|
mockgen -package mocks -destination tests/mocks/tendermint_tm_db_DB.go github.com/tendermint/tm-db DB
|
|
mockgen -source=types/module/module.go -package mocks -destination tests/mocks/types_module_module.go
|
|
mockgen -source=types/invariant.go -package mocks -destination tests/mocks/types_invariant.go
|
|
mockgen -source=types/router.go -package mocks -destination tests/mocks/types_router.go
|
|
mockgen -source=types/handler.go -package mocks -destination tests/mocks/types_handler.go
|
|
mockgen -package mocks -destination tests/mocks/grpc_server.go github.com/gogo/protobuf/grpc Server
|
|
.PHONY: mocks
|
|
|
|
$(MOCKS_DIR):
|
|
mkdir -p $(MOCKS_DIR)
|
|
|
|
distclean: clean
|
|
rm -rf \
|
|
gitian-build-darwin/ \
|
|
gitian-build-linux/ \
|
|
gitian-build-windows/ \
|
|
.gitian-builder-cache/
|
|
|
|
clean:
|
|
rm -rf $(BUILDDIR)/
|
|
|
|
.PHONY: distclean clean
|
|
|
|
###############################################################################
|
|
### Tools & Dependencies ###
|
|
###############################################################################
|
|
|
|
go-mod-cache: go.sum
|
|
@echo "--> Download go modules to local cache"
|
|
@go mod download
|
|
.PHONY: go-mod-cache
|
|
|
|
go.sum: go.mod
|
|
@echo "--> Ensure dependencies have not been modified"
|
|
@go mod verify
|
|
@go mod tidy
|
|
|
|
###############################################################################
|
|
### Documentation ###
|
|
###############################################################################
|
|
|
|
update-swagger-docs: statik
|
|
$(BINDIR)/statik -src=client/grpc-gateway -dest=client/grpc-gateway -f -m
|
|
@if [ -n "$(git status --porcelain)" ]; then \
|
|
echo "\033[91mSwagger docs are out of sync!!!\033[0m";\
|
|
exit 1;\
|
|
else \
|
|
echo "\033[92mSwagger docs are in sync\033[0m";\
|
|
fi
|
|
.PHONY: update-swagger-docs
|
|
|
|
godocs:
|
|
@echo "--> Wait a few seconds and visit http://localhost:6060/pkg/github.com/cosmos/cosmos-sdk/types"
|
|
godoc -http=:6060
|
|
|
|
build-docs:
|
|
@cd docs && \
|
|
while read p; do \
|
|
(git checkout $${p} && npm install && VUEPRESS_BASE="/$${p}/" npm run build) ; \
|
|
mkdir -p ~/output/$${p} ; \
|
|
cp -r .vuepress/dist/* ~/output/$${p}/ ; \
|
|
cp ~/output/$${p}/index.html ~/output ; \
|
|
done < versions ;
|
|
|
|
sync-docs:
|
|
cd ~/output && \
|
|
echo "role_arn = ${DEPLOYMENT_ROLE_ARN}" >> /root/.aws/config ; \
|
|
echo "CI job = ${CIRCLE_BUILD_URL}" >> version.html ; \
|
|
aws s3 sync . s3://${WEBSITE_BUCKET} --profile terraform --delete ; \
|
|
aws cloudfront create-invalidation --distribution-id ${CF_DISTRIBUTION_ID} --profile terraform --path "/*" ;
|
|
.PHONY: sync-docs
|
|
|
|
###############################################################################
|
|
### Tests & Simulation ###
|
|
###############################################################################
|
|
|
|
test: test-unit
|
|
test-all: test-unit test-ledger-mock test-race test-cover
|
|
|
|
test-ledger-mock:
|
|
@go test -mod=readonly `go list github.com/cosmos/cosmos-sdk/crypto` -tags='cgo ledger test_ledger_mock'
|
|
|
|
test-ledger: test-ledger-mock
|
|
@go test -mod=readonly -v `go list github.com/cosmos/cosmos-sdk/crypto` -tags='cgo ledger'
|
|
|
|
test-unit: test-unit-proto
|
|
|
|
test-unit-proto:
|
|
@VERSION=$(VERSION) go test -mod=readonly ./... -tags='ledger test_ledger_mock'
|
|
|
|
test-unit-amino:
|
|
@VERSION=$(VERSION) go test -mod=readonly ./... -tags='ledger test_ledger_mock test_amino'
|
|
|
|
test-race:
|
|
@VERSION=$(VERSION) go test -mod=readonly -race $(PACKAGES_NOSIMULATION)
|
|
|
|
.PHONY: test test-all test-ledger-mock test-ledger test-unit test-race
|
|
|
|
test-sim-nondeterminism:
|
|
@echo "Running non-determinism test..."
|
|
@go test -mod=readonly $(SIMAPP) -run TestAppStateDeterminism -Enabled=true \
|
|
-NumBlocks=100 -BlockSize=200 -Commit=true -Period=0 -v -timeout 24h
|
|
|
|
test-sim-custom-genesis-fast:
|
|
@echo "Running custom genesis simulation..."
|
|
@echo "By default, ${HOME}/.gaiad/config/genesis.json will be used."
|
|
@go test -mod=readonly $(SIMAPP) -run TestFullAppSimulation -Genesis=${HOME}/.gaiad/config/genesis.json \
|
|
-Enabled=true -NumBlocks=100 -BlockSize=200 -Commit=true -Seed=99 -Period=5 -v -timeout 24h
|
|
|
|
test-sim-import-export: runsim
|
|
@echo "Running application import/export simulation. This may take several minutes..."
|
|
@$(BINDIR)/runsim -Jobs=4 -SimAppPkg=$(SIMAPP) -ExitOnFail 50 5 TestAppImportExport
|
|
|
|
test-sim-after-import: runsim
|
|
@echo "Running application simulation-after-import. This may take several minutes..."
|
|
@$(BINDIR)/runsim -Jobs=4 -SimAppPkg=$(SIMAPP) -ExitOnFail 50 5 TestAppSimulationAfterImport
|
|
|
|
test-sim-custom-genesis-multi-seed: runsim
|
|
@echo "Running multi-seed custom genesis simulation..."
|
|
@echo "By default, ${HOME}/.gaiad/config/genesis.json will be used."
|
|
@$(BINDIR)/runsim -Genesis=${HOME}/.gaiad/config/genesis.json -SimAppPkg=$(SIMAPP) -ExitOnFail 400 5 TestFullAppSimulation
|
|
|
|
test-sim-multi-seed-long: runsim
|
|
@echo "Running long multi-seed application simulation. This may take awhile!"
|
|
@$(BINDIR)/runsim -Jobs=4 -SimAppPkg=$(SIMAPP) -ExitOnFail 500 50 TestFullAppSimulation
|
|
|
|
test-sim-multi-seed-short: runsim
|
|
@echo "Running short multi-seed application simulation. This may take awhile!"
|
|
@$(BINDIR)/runsim -Jobs=4 -SimAppPkg=$(SIMAPP) -ExitOnFail 50 10 TestFullAppSimulation
|
|
|
|
test-sim-benchmark-invariants:
|
|
@echo "Running simulation invariant benchmarks..."
|
|
@go test -mod=readonly $(SIMAPP) -benchmem -bench=BenchmarkInvariants -run=^$ \
|
|
-Enabled=true -NumBlocks=1000 -BlockSize=200 \
|
|
-Period=1 -Commit=true -Seed=57 -v -timeout 24h
|
|
|
|
.PHONY: \
|
|
test-sim-nondeterminism \
|
|
test-sim-custom-genesis-fast \
|
|
test-sim-import-export \
|
|
test-sim-after-import \
|
|
test-sim-custom-genesis-multi-seed \
|
|
test-sim-multi-seed-short \
|
|
test-sim-multi-seed-long \
|
|
test-sim-benchmark-invariants
|
|
|
|
SIM_NUM_BLOCKS ?= 500
|
|
SIM_BLOCK_SIZE ?= 200
|
|
SIM_COMMIT ?= true
|
|
|
|
test-sim-benchmark:
|
|
@echo "Running application benchmark for numBlocks=$(SIM_NUM_BLOCKS), blockSize=$(SIM_BLOCK_SIZE). This may take awhile!"
|
|
@go test -mod=readonly -benchmem -run=^$$ $(SIMAPP) -bench ^BenchmarkFullAppSimulation$$ \
|
|
-Enabled=true -NumBlocks=$(SIM_NUM_BLOCKS) -BlockSize=$(SIM_BLOCK_SIZE) -Commit=$(SIM_COMMIT) -timeout 24h
|
|
|
|
test-sim-profile:
|
|
@echo "Running application benchmark for numBlocks=$(SIM_NUM_BLOCKS), blockSize=$(SIM_BLOCK_SIZE). This may take awhile!"
|
|
@go test -mod=readonly -benchmem -run=^$$ $(SIMAPP) -bench ^BenchmarkFullAppSimulation$$ \
|
|
-Enabled=true -NumBlocks=$(SIM_NUM_BLOCKS) -BlockSize=$(SIM_BLOCK_SIZE) -Commit=$(SIM_COMMIT) -timeout 24h -cpuprofile cpu.out -memprofile mem.out
|
|
|
|
.PHONY: test-sim-profile test-sim-benchmark
|
|
|
|
test-cover:
|
|
@export VERSION=$(VERSION); bash -x contrib/test_cover.sh
|
|
.PHONY: test-cover
|
|
|
|
benchmark:
|
|
@go test -mod=readonly -bench=. $(PACKAGES_NOSIMULATION)
|
|
.PHONY: benchmark
|
|
|
|
###############################################################################
|
|
### Linting ###
|
|
###############################################################################
|
|
|
|
lint:
|
|
golangci-lint run --out-format=tab --issues-exit-code=0
|
|
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -name '*.pb.go' | xargs gofmt -d -s
|
|
.PHONY: lint
|
|
|
|
format:
|
|
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -path "./tests/mocks/*" -not -name '*.pb.go' | xargs gofmt -w -s
|
|
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -path "./tests/mocks/*" -not -name '*.pb.go' | xargs misspell -w
|
|
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/docs/statik/statik.go" -not -path "./tests/mocks/*" -not -name '*.pb.go' | xargs goimports -w -local github.com/cosmos/cosmos-sdk
|
|
.PHONY: format
|
|
|
|
###############################################################################
|
|
### Devdoc ###
|
|
###############################################################################
|
|
|
|
DEVDOC_SAVE = docker commit `docker ps -a -n 1 -q` devdoc:local
|
|
|
|
devdoc-init:
|
|
docker run -it -v "$(CURDIR):/go/src/github.com/cosmos/cosmos-sdk" -w "/go/src/github.com/cosmos/cosmos-sdk" tendermint/devdoc echo
|
|
# TODO make this safer
|
|
$(call DEVDOC_SAVE)
|
|
|
|
devdoc:
|
|
docker run -it -v "$(CURDIR):/go/src/github.com/cosmos/cosmos-sdk" -w "/go/src/github.com/cosmos/cosmos-sdk" devdoc:local bash
|
|
|
|
devdoc-save:
|
|
# TODO make this safer
|
|
$(call DEVDOC_SAVE)
|
|
|
|
devdoc-clean:
|
|
docker rmi -f $$(docker images -f "dangling=true" -q)
|
|
|
|
devdoc-update:
|
|
docker pull tendermint/devdoc
|
|
|
|
.PHONY: devdoc devdoc-clean devdoc-init devdoc-save devdoc-update
|
|
|
|
###############################################################################
|
|
### Protobuf ###
|
|
###############################################################################
|
|
|
|
proto-all: proto-tools proto-gen proto-lint proto-check-breaking proto-swagger-gen
|
|
|
|
proto-gen:
|
|
@./scripts/protocgen.sh
|
|
|
|
# This generates the SDK's custom wrapper for google.protobuf.Any. It should only be run manually when needed
|
|
proto-gen-any:
|
|
@./scripts/protocgen-any.sh
|
|
|
|
proto-swagger-gen:
|
|
@./scripts/protoc-swagger-gen.sh
|
|
|
|
proto-lint:
|
|
@buf check lint --error-format=json
|
|
|
|
proto-check-breaking:
|
|
@buf check breaking --against-input '.git#branch=master'
|
|
|
|
proto-lint-docker:
|
|
@$(DOCKER_BUF) check lint --error-format=json
|
|
.PHONY: proto-lint
|
|
|
|
proto-check-breaking-docker:
|
|
@$(DOCKER_BUF) check breaking --against-input $(HTTPS_GIT)#branch=master
|
|
.PHONY: proto-check-breaking-ci
|
|
|
|
TM_URL = https://raw.githubusercontent.com/tendermint/tendermint/v0.34.0-rc3/proto/tendermint
|
|
GOGO_PROTO_URL = https://raw.githubusercontent.com/regen-network/protobuf/cosmos
|
|
COSMOS_PROTO_URL = https://raw.githubusercontent.com/regen-network/cosmos-proto/master
|
|
CONFIO_URL = https://raw.githubusercontent.com/confio/ics23/v0.6.2
|
|
|
|
TM_CRYPTO_TYPES = third_party/proto/tendermint/crypto
|
|
TM_ABCI_TYPES = third_party/proto/tendermint/abci
|
|
TM_TYPES = third_party/proto/tendermint/types
|
|
TM_VERSION = third_party/proto/tendermint/version
|
|
TM_LIBS = third_party/proto/tendermint/libs/bits
|
|
|
|
GOGO_PROTO_TYPES = third_party/proto/gogoproto
|
|
COSMOS_PROTO_TYPES = third_party/proto/cosmos_proto
|
|
CONFIO_TYPES = third_party/proto/confio
|
|
|
|
proto-update-deps:
|
|
@mkdir -p $(GOGO_PROTO_TYPES)
|
|
@curl -sSL $(GOGO_PROTO_URL)/gogoproto/gogo.proto > $(GOGO_PROTO_TYPES)/gogo.proto
|
|
|
|
@mkdir -p $(COSMOS_PROTO_TYPES)
|
|
@curl -sSL $(COSMOS_PROTO_URL)/cosmos.proto > $(COSMOS_PROTO_TYPES)/cosmos.proto
|
|
|
|
## Importing of tendermint protobuf definitions currently requires the
|
|
## use of `sed` in order to build properly with cosmos-sdk's proto file layout
|
|
## (which is the standard Buf.build FILE_LAYOUT)
|
|
## Issue link: https://github.com/tendermint/tendermint/issues/5021
|
|
@mkdir -p $(TM_ABCI_TYPES)
|
|
@curl -sSL $(TM_URL)/abci/types.proto > $(TM_ABCI_TYPES)/types.proto
|
|
|
|
@mkdir -p $(TM_VERSION)
|
|
@curl -sSL $(TM_URL)/version/types.proto > $(TM_VERSION)/types.proto
|
|
|
|
@mkdir -p $(TM_TYPES)
|
|
@curl -sSL $(TM_URL)/types/types.proto > $(TM_TYPES)/types.proto
|
|
@curl -sSL $(TM_URL)/types/evidence.proto > $(TM_TYPES)/evidence.proto
|
|
@curl -sSL $(TM_URL)/types/params.proto > $(TM_TYPES)/params.proto
|
|
@curl -sSL $(TM_URL)/types/validator.proto > $(TM_TYPES)/validator.proto
|
|
|
|
@mkdir -p $(TM_CRYPTO_TYPES)
|
|
@curl -sSL $(TM_URL)/crypto/proof.proto > $(TM_CRYPTO_TYPES)/proof.proto
|
|
@curl -sSL $(TM_URL)/crypto/keys.proto > $(TM_CRYPTO_TYPES)/keys.proto
|
|
|
|
@mkdir -p $(TM_LIBS)
|
|
@curl -sSL $(TM_URL)/libs/bits/types.proto > $(TM_LIBS)/types.proto
|
|
|
|
@mkdir -p $(CONFIO_TYPES)
|
|
@curl -sSL $(CONFIO_URL)/proofs.proto > $(CONFIO_TYPES)/proofs.proto
|
|
## insert go package option into proofs.proto file
|
|
## Issue link: https://github.com/confio/ics23/issues/32
|
|
@sed -i '4ioption go_package = "github.com/confio/ics23/go";' $(CONFIO_TYPES)/proofs.proto
|
|
|
|
.PHONY: proto-all proto-gen proto-lint proto-check-breaking proto-update-deps
|
|
|
|
###############################################################################
|
|
### Localnet ###
|
|
###############################################################################
|
|
|
|
# Run a 4-node testnet locally
|
|
localnet-start: build-simd-linux localnet-stop
|
|
$(if $(shell docker inspect -f '{{ .Id }}' cosmossdk/simd-env 2>/dev/null),$(info found image cosmossdk/simd-env),$(MAKE) -C contrib/images simd-env)
|
|
if ! [ -f build/node0/simd/config/genesis.json ]; then docker run --rm \
|
|
--user $(shell id -u):$(shell id -g) \
|
|
-v $(BUILDDIR):/simd:Z \
|
|
-v /etc/group:/etc/group:ro \
|
|
-v /etc/passwd:/etc/passwd:ro \
|
|
-v /etc/shadow:/etc/shadow:ro \
|
|
cosmossdk/simd-env testnet --v 4 -o . --starting-ip-address 192.168.10.2 --keyring-backend=test ; fi
|
|
docker-compose up -d
|
|
|
|
localnet-stop:
|
|
docker-compose down
|
|
|
|
.PHONY: localnet-start localnet-stop
|