.PHONY: statusgo statusd-prune all test clean help .PHONY: statusgo-android statusgo-ios RELEASE_TAG := v$(shell cat VERSION) RELEASE_BRANCH := develop RELEASE_DIR := /tmp/release-$(RELEASE_TAG) PRE_RELEASE := "1" RELEASE_TYPE := $(shell if [ $(PRE_RELEASE) = "0" ] ; then echo release; else echo pre-release ; fi) GOLANGCI_BINARY=golangci-lint ifeq ($(OS),Windows_NT) # is Windows_NT on XP, 2000, 7, Vista, 10... detected_OS := Windows else detected_OS := $(strip $(shell uname)) endif ifeq ($(detected_OS),Darwin) GOBIN_SHARED_LIB_EXT := dylib else ifeq ($(detected_OS),Windows) # on Windows need `--export-all-symbols` flag else expected symbols will not be found in libstatus.dll GOBIN_SHARED_LIB_CGO_LDFLAGS := CGO_LDFLAGS="-Wl,--export-all-symbols" GOBIN_SHARED_LIB_EXT := dll else GOBIN_SHARED_LIB_EXT := so endif help: ##@other Show this help @perl -e '$(HELP_FUN)' $(MAKEFILE_LIST) CGO_CFLAGS = -I/$(JAVA_HOME)/include -I/$(JAVA_HOME)/include/darwin GOBIN = $(dir $(realpath $(firstword $(MAKEFILE_LIST))))build/bin GOPATH ?= $(HOME)/go GIT_COMMIT = $(shell git rev-parse --short HEAD) AUTHOR ?= $(shell git config user.email || echo $$USER) ENABLE_METRICS ?= true BUILD_FLAGS ?= $(shell echo "-ldflags='\ -X github.com/status-im/status-go/params.Version=$(RELEASE_TAG:v%=%) \ -X github.com/status-im/status-go/params.GitCommit=$(GIT_COMMIT) \ -X github.com/status-im/status-go/vendor/github.com/ethereum/go-ethereum/metrics.EnabledStr=$(ENABLE_METRICS)'") BUILD_FLAGS_MOBILE ?= $(shell echo "-ldflags='\ -X github.com/status-im/status-go/params.Version=$(RELEASE_TAG:v%=%) \ -X github.com/status-im/status-go/params.GitCommit=$(GIT_COMMIT)'") networkid ?= StatusChain gotest_extraflags = DOCKER_IMAGE_NAME ?= statusteam/status-go BOOTNODE_IMAGE_NAME ?= statusteam/bootnode STATUSD_PRUNE_IMAGE_NAME ?= statusteam/statusd-prune DOCKER_IMAGE_CUSTOM_TAG ?= $(RELEASE_TAG) DOCKER_TEST_WORKDIR = /go/src/github.com/status-im/status-go/ DOCKER_TEST_IMAGE = golang:1.13 # This is a code for automatic help generator. # It supports ANSI colors and categories. # To add new item into help output, simply add comments # starting with '##'. To add category, use @category. GREEN := $(shell echo "\e[32m") WHITE := $(shell echo "\e[37m") YELLOW := $(shell echo "\e[33m") RESET := $(shell echo "\e[0m") HELP_FUN = \ %help; \ while(<>) { push @{$$help{$$2 // 'options'}}, [$$1, $$3] if /^([a-zA-Z0-9\-]+)\s*:.*\#\#(?:@([a-zA-Z\-]+))?\s(.*)$$/ }; \ print "Usage: make [target]\n\n"; \ for (sort keys %help) { \ print "${WHITE}$$_:${RESET}\n"; \ for (@{$$help{$$_}}) { \ $$sep = " " x (32 - length $$_->[0]); \ print " ${YELLOW}$$_->[0]${RESET}$$sep${GREEN}$$_->[1]${RESET}\n"; \ }; \ print "\n"; \ } statusgo: ##@build Build status-go as statusd server go build -mod=vendor -i -o $(GOBIN)/statusd -v -tags '$(BUILD_TAGS)' $(BUILD_FLAGS) ./cmd/statusd @echo "Compilation done." @echo "Run \"build/bin/statusd -h\" to view available commands." statusd-prune: ##@statusd-prune Build statusd-prune go build -o $(GOBIN)/statusd-prune -v ./cmd/statusd-prune @echo "Compilation done." @echo "Run \"build/bin/statusd-prune -h\" to view available commands." statusd-prune-docker-image: ##@statusd-prune Build statusd-prune docker image @echo "Building docker image for ststusd-prune..." docker build --file _assets/build/Dockerfile-prune . \ --label "commit=$(GIT_COMMIT)" \ --label "author=$(AUTHOR)" \ -t $(BOOTNODE_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) \ -t $(STATUSD_PRUNE_IMAGE_NAME):latest bootnode: ##@build Build discovery v5 bootnode using status-go deps go build -i -o $(GOBIN)/bootnode -v -tags '$(BUILD_TAGS)' $(BUILD_FLAGS) ./cmd/bootnode/ @echo "Compilation done." node-canary: ##@build Build P2P node canary using status-go deps go build -i -o $(GOBIN)/node-canary -v -tags '$(BUILD_TAGS)' $(BUILD_FLAGS) ./cmd/node-canary/ @echo "Compilation done." statusgo-cross: statusgo-android statusgo-ios @echo "Full cross compilation done." @ls -ld $(GOBIN)/statusgo-* statusgo-android: ##@cross-compile Build status-go for Android @echo "Building status-go for Android..." gomobile init gomobile bind -v -target=android -ldflags="-s -w" $(BUILD_FLAGS_MOBILE) -o build/bin/statusgo.aar github.com/status-im/status-go/mobile @echo "Android cross compilation done in build/bin/statusgo.aar" statusgo-ios: ##@cross-compile Build status-go for iOS @echo "Building status-go for iOS..." gomobile init gomobile bind -v -target=ios -ldflags="-s -w" $(BUILD_FLAGS_MOBILE) -o build/bin/Statusgo.framework github.com/status-im/status-go/mobile @echo "iOS framework cross compilation done in build/bin/Statusgo.framework" statusgo-library: ##@cross-compile Build status-go as static library for current platform ## cmd/library/README.md explains the magic incantation behind this mkdir -p $(GOBIN)/statusgo-lib go run cmd/library/*.go > $(GOBIN)/statusgo-lib/main.go @echo "Building static library..." go build -buildmode=c-archive -o $(GOBIN)/libstatus.a $(BUILD_FLAGS) $(GOBIN)/statusgo-lib @echo "Static library built:" @ls -la $(GOBIN)/libstatus.* statusgo-shared-library: ##@cross-compile Build status-go as shared library for current platform ## cmd/library/README.md explains the magic incantation behind this mkdir -p $(GOBIN)/statusgo-lib go run cmd/library/*.go > $(GOBIN)/statusgo-lib/main.go @echo "Building shared library..." $(GOBIN_SHARED_LIB_CGO_LDFLAGS) go build -buildmode=c-shared -o $(GOBIN)/libstatus.$(GOBIN_SHARED_LIB_EXT) $(BUILD_FLAGS) $(GOBIN)/statusgo-lib @echo "Shared library built:" @ls -la $(GOBIN)/libstatus.* docker-image: ##@docker Build docker image (use DOCKER_IMAGE_NAME to set the image name) @echo "Building docker image..." docker build --file _assets/build/Dockerfile . \ --build-arg "build_tags=$(BUILD_TAGS)" \ --build-arg "build_flags=$(BUILD_FLAGS)" \ --label "commit=$(GIT_COMMIT)" \ --label "author=$(AUTHOR)" \ -t $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) \ -t $(DOCKER_IMAGE_NAME):latest bootnode-image: @echo "Building docker image for bootnode..." docker build --file _assets/build/Dockerfile-bootnode . \ --build-arg "build_tags=$(BUILD_TAGS)" \ --build-arg "build_flags=$(BUILD_FLAGS)" \ --label "commit=$(GIT_COMMIT)" \ --label "author=$(AUTHOR)" \ -t $(BOOTNODE_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) \ -t $(BOOTNODE_IMAGE_NAME):latest push-docker-images: docker-image bootnode-image docker push $(BOOTNODE_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) docker push $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) clean-docker-images: docker rmi -f $(shell docker image ls --filter="reference=$(DOCKER_IMAGE_NAME)" --quiet) # See https://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html to understand this magic. push-docker-images-latest: GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD) push-docker-images-latest: GIT_LOCAL = $(shell git rev-parse @) push-docker-images-latest: GIT_REMOTE = $(shell git fetch -q && git rev-parse remotes/origin/develop || echo 'NO_DEVELOP') push-docker-images-latest: docker-image bootnode-image @echo "Pushing latest docker images..." @echo "Checking git branch..." ifneq ("$(GIT_BRANCH)", "develop") $(error You should only use develop branch to push the latest tag!) exit 1 endif ifneq ("$(GIT_LOCAL)", "$(GIT_REMOTE)") $(error The local git commit does not match the remote origin!) exit 1 endif docker push $(BOOTNODE_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) docker push $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_CUSTOM_TAG) install-os-dependencies: _assets/scripts/install_deps.sh setup-dev: lint-install mock-install modvendor-install gen-install tidy install-os-dependencies ##@other Prepare project for development setup-build: lint-install release-install gomobile-install ##@other Prepare project for build setup: setup-build setup-dev tidy ##@other Prepare project for development and building generate: ##@other Regenerate assets and other auto-generated stuff go generate ./static ./static/mailserver_db_migrations ./t ./multiaccounts/... ./appdatabase/... ./protocol/... prepare-release: clean-release mkdir -p $(RELEASE_DIR) mv build/bin/statusgo.aar $(RELEASE_DIR)/status-go-android.aar zip -r build/bin/Statusgo.framework.zip build/bin/Statusgo.framework mv build/bin/Statusgo.framework.zip $(RELEASE_DIR)/status-go-ios.zip zip -r $(RELEASE_DIR)/status-go-desktop.zip . -x *.git* ${MAKE} clean clean-release: rm -rf $(RELEASE_DIR) lint-fix: find . \ -name '*.go' \ -and -not -name '*.pb.go' \ -and -not -name 'bindata*' \ -and -not -name 'migrations.go' \ -and -not -wholename '*/vendor/*' \ -exec goimports \ -local 'github.com/ethereum/go-ethereum,github.com/status-im/status-go,github.com/status-im/markdown' \ -w {} \; $(MAKE) vendor check-existing-release: @git ls-remote --exit-code origin "$(RELEASE_TAG)" >/dev/null || exit 0; \ echo "$(YELLOW)Release tag already exists: $(RELEASE_TAG)$(RESET)"; \ echo "Remove the tag/release if you want to re-create it."; \ exit 1; release: check-existing-release @read -p "Are you sure you want to create a new GitHub $(RELEASE_TYPE) against $(RELEASE_BRANCH) branch? (y/n): " REPLY; \ if [ $$REPLY = "y" ]; then \ latest_tag=$$(git describe --tags `git rev-list --tags --max-count=1`); \ comparison="$$latest_tag..HEAD"; \ if [ -z "$$latest_tag" ]; then comparison=""; fi; \ changelog=$$(git log $$comparison --oneline --no-merges --format="* %h %s"); \ github-release \ $(shell if [ $(PRE_RELEASE) != "0" ] ; then echo "-prerelease" ; fi) \ "status-im/status-go" \ "$(RELEASE_TAG)" \ "$(RELEASE_BRANCH)" \ "$(changelog)" \ "$(RELEASE_DIR)/*" ; \ else \ echo "Aborting." && exit 1; \ fi gomobile-install: xtools-install go get golang.org/x/mobile/cmd/gomobile release-install: go get -u github.com/c4milo/github-release gen-install: go get github.com/kevinburke/go-bindata/go-bindata@v3.13.0 go get github.com/golang/protobuf/protoc-gen-go@v1.3.4 xtools-install: # special fix for gomobile issues go get golang.org/x/tools/go/packages modvendor-install: # a tool to vendor non-go files # TODO: switch to original repo when https://github.com/goware/modvendor/pull/13 is merged GO111MODULE=off go get -u github.com/adambabik/modvendor mock-install: ##@other Install mocking tools # keep in sync with go.mod and github.com/golang/mock go get github.com/golang/mock/mockgen@v1.4.1 mock: ##@other Regenerate mocks mockgen -package=fake -destination=transactions/fake/mock.go -source=transactions/fake/txservice.go mockgen -package=status -destination=services/status/account_mock.go -source=services/status/service.go mockgen -package=peer -destination=services/peer/discoverer_mock.go -source=services/peer/service.go docker-test: ##@tests Run tests in a docker container with golang. docker run --privileged --rm -it -v "$(shell pwd):$(DOCKER_TEST_WORKDIR)" -w "$(DOCKER_TEST_WORKDIR)" $(DOCKER_TEST_IMAGE) go test ${ARGS} test: test-unit ##@tests Run basic, short tests during development test-unit: UNIT_TEST_PACKAGES = $(shell go list ./... | \ grep -v /vendor | \ grep -v /t/e2e | \ grep -v /t/benchmarks | \ grep -v /transactions/fake ) test-unit: ##@tests Run unit and integration tests go test -v -failfast $(UNIT_TEST_PACKAGES) $(gotest_extraflags) cd ./waku && go test -v -failfast ./... $(gotest_extraflags) test-unit-race: gotest_extraflags=-race test-unit-race: test-unit ##@tests Run unit and integration tests with -race flag test-e2e: ##@tests Run e2e tests # order: reliability then alphabetical # TODO(tiabc): make a single command out of them adding `-p 1` flag. test-e2e-race: gotest_extraflags=-race test-e2e-race: test-e2e ##@tests Run e2e tests with -race flag canary-test: node-canary # TODO: uncomment that! #_assets/scripts/canary_test_mailservers.sh ./config/cli/fleet-eth.prod.json lint-install: @# The following installs a specific version of golangci-lint, which is appropriate for a CI server to avoid different results from build to build curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | BINARY=$(GOLANGCI_BINARY) bash -s -- -d -b $(GOPATH)/bin v1.33.0 lint: @echo "lint" @golangci-lint --exclude=SA1019 run ./... --deadline=5m ci: lint canary-test test-unit test-e2e ##@tests Run all linters and tests at once ci-race: lint canary-test test-unit test-e2e-race ##@tests Run all linters and tests at once + race clean: ##@other Cleanup rm -fr build/bin/* mailserver-config.json git clean -xf deep-clean: clean rm -Rdf .ethereumtest/StatusChain tidy: go mod tidy vendor: go mod tidy go mod vendor modvendor -copy="**/*.c **/*.h" -v .PHONY: vendor update-fleet-config: ##@other Update fleets configuration from fleets.status.im ./_assets/scripts/update-fleet-config.sh @echo "Updating static assets..." @go generate ./static @echo "Done" run-bootnode-systemd: ##@Easy way to run a bootnode locally with Docker Compose @cd _assets/systemd/bootnode && $(MAKE) run-bootnode-docker: ##@Easy way to run a bootnode locally with Docker Compose @cd _assets/compose/bootnode && $(MAKE) run-mailserver-systemd: ##@Easy Run a mailserver locally with systemd @cd _assets/systemd/mailserver && $(MAKE) run-mailserver-docker: ##@Easy Run a mailserver locally with Docker Compose @cd _assets/compose/mailserver && $(MAKE) clean-bootnode-systemd: ##@Easy Clean your systemd service for running a bootnode @cd _assets/systemd/bootnode && $(MAKE) clean clean-bootnode-docker: ##@Easy Clean your Docker container running a bootnode @cd _assets/compose/bootnode && $(MAKE) clean clean-mailserver-systemd: ##@Easy Clean your systemd service for running a mailserver @cd _assets/systemd/mailserver && $(MAKE) clean clean-mailserver-docker: ##@Easy Clean your Docker container running a mailserver @cd _assets/compose/mailserver && $(MAKE) clean migration: DEFAULT_MIGRATION_PATH := appdatabase/migrations/sql migration: touch $(DEFAULT_MIGRATION_PATH)/$(shell date +%s)_$(D).up.sql migration-protocol: DEFAULT_PROTOCOL_PATH := protocol/migrations/sqlite migration-protocol: touch $(DEFAULT_PROTOCOL_PATH)/$(shell date +%s)_$(D).up.sql