github.com/yacovm/fabric@v2.0.0-alpha.0.20191128145320-c5d4087dc723+incompatible/Makefile (about)

     1  # Copyright IBM Corp All Rights Reserved.
     2  # Copyright London Stock Exchange Group All Rights Reserved.
     3  #
     4  # SPDX-License-Identifier: Apache-2.0
     5  #
     6  # -------------------------------------------------------------
     7  # This makefile defines the following targets
     8  #
     9  #   - all (default) - builds all targets and runs all non-integration tests/checks
    10  #   - checks - runs all non-integration tests/checks
    11  #   - desk-check - runs linters and verify to test changed packages
    12  #   - configtxgen - builds a native configtxgen binary
    13  #   - configtxlator - builds a native configtxlator binary
    14  #   - cryptogen  -  builds a native cryptogen binary
    15  #   - idemixgen  -  builds a native idemixgen binary
    16  #   - peer - builds a native fabric peer binary
    17  #   - orderer - builds a native fabric orderer binary
    18  #   - release - builds release packages for the host platform
    19  #   - release-all - builds release packages for all target platforms
    20  #   - publish-images - publishes release docker images to nexus3 or docker hub.
    21  #   - unit-test - runs the go-test based unit tests
    22  #   - verify - runs unit tests for only the changed package tree
    23  #   - profile - runs unit tests for all packages in coverprofile mode (slow)
    24  #   - gotools - installs go tools like golint
    25  #   - linter - runs all code checks
    26  #   - check-deps - check for vendored dependencies that are no longer used
    27  #   - license - checks go source files for Apache license header
    28  #   - native - ensures all native binaries are available
    29  #   - docker[-clean] - ensures all docker images are available[/cleaned]
    30  #   - docker-list - generates a list of docker images that 'make docker' produces
    31  #   - peer-docker[-clean] - ensures the peer container is available[/cleaned]
    32  #   - orderer-docker[-clean] - ensures the orderer container is available[/cleaned]
    33  #   - tools-docker[-clean] - ensures the tools container is available[/cleaned]
    34  #   - protos - generate all protobuf artifacts based on .proto files
    35  #   - clean - cleans the build area
    36  #   - clean-all - superset of 'clean' that also removes persistent state
    37  #   - dist-clean - clean release packages for all target platforms
    38  #   - unit-test-clean - cleans unit test state (particularly from docker)
    39  #   - basic-checks - performs basic checks like license, spelling, trailing spaces and linter
    40  #   - docker-thirdparty - pulls thirdparty images (kafka,zookeeper,couchdb)
    41  #   - docker-tag-latest - re-tags the images made by 'make docker' with the :latest tag
    42  #   - docker-tag-stable - re-tags the images made by 'make docker' with the :stable tag
    43  #   - help-docs - generate the command reference docs
    44  
    45  ALPINE_VER ?= 3.10
    46  BASE_VERSION = 2.0.0
    47  PREV_VERSION = 2.0.0-alpha
    48  BASEIMAGE_RELEASE = 0.4.16
    49  
    50  # 3rd party image version
    51  # These versions are also set in the runners in ./integration/runners/
    52  COUCHDB_VER ?= 2.3
    53  KAFKA_VER ?= 5.3.1
    54  ZOOKEEPER_VER ?= 5.3.1
    55  
    56  # Disable implicit rules
    57  .SUFFIXES:
    58  MAKEFLAGS += --no-builtin-rules
    59  
    60  BUILD_DIR ?= build
    61  
    62  EXTRA_VERSION ?= $(shell git rev-parse --short HEAD)
    63  PROJECT_VERSION=$(BASE_VERSION)-snapshot-$(EXTRA_VERSION)
    64  
    65  PKGNAME = github.com/hyperledger/fabric
    66  ARCH=$(shell go env GOARCH)
    67  MARCH=$(shell go env GOOS)-$(shell go env GOARCH)
    68  
    69  # defined in common/metadata/metadata.go
    70  METADATA_VAR = Version=$(BASE_VERSION)
    71  METADATA_VAR += CommitSHA=$(EXTRA_VERSION)
    72  METADATA_VAR += BaseDockerLabel=$(BASE_DOCKER_LABEL)
    73  METADATA_VAR += DockerNamespace=$(DOCKER_NS)
    74  METADATA_VAR += BaseDockerNamespace=$(BASE_DOCKER_NS)
    75  
    76  GO_VER = $(shell grep "GO_VER" ci.properties |cut -d'=' -f2-)
    77  GO_TAGS ?=
    78  
    79  RELEASE_EXES = orderer $(TOOLS_EXES)
    80  RELEASE_IMAGES = baseos ccenv orderer peer tools
    81  RELEASE_PLATFORMS = darwin-amd64 linux-amd64 linux-ppc64le linux-s390x windows-amd64
    82  TOOLS_EXES = configtxgen configtxlator cryptogen discover idemixgen peer
    83  
    84  pkgmap.configtxgen    := $(PKGNAME)/cmd/configtxgen
    85  pkgmap.configtxlator  := $(PKGNAME)/cmd/configtxlator
    86  pkgmap.cryptogen      := $(PKGNAME)/cmd/cryptogen
    87  pkgmap.discover       := $(PKGNAME)/cmd/discover
    88  pkgmap.idemixgen      := $(PKGNAME)/cmd/idemixgen
    89  pkgmap.orderer        := $(PKGNAME)/cmd/orderer
    90  pkgmap.peer           := $(PKGNAME)/cmd/peer
    91  
    92  .DEFAULT_GOAL := all
    93  
    94  include docker-env.mk
    95  include gotools.mk
    96  
    97  .PHONY: all
    98  all: check-go-version native docker checks
    99  
   100  .PHONY: checks
   101  checks: basic-checks unit-test integration-test
   102  
   103  .PHONY: basic-checks
   104  basic-checks: check-go-version license spelling references trailing-spaces linter check-metrics-doc filename-spaces
   105  
   106  .PHONY: desk-checks
   107  desk-check: checks verify
   108  
   109  .PHONY: help-docs
   110  help-docs: native
   111  	@scripts/generateHelpDocs.sh
   112  
   113  .PHONY: spelling
   114  spelling:
   115  	@scripts/check_spelling.sh
   116  
   117  .PHONY: references
   118  references:
   119  	@scripts/check_references.sh
   120  
   121  .PHONY: license
   122  license:
   123  	@scripts/check_license.sh
   124  
   125  .PHONY: trailing-spaces
   126  trailing-spaces:
   127  	@scripts/check_trailingspaces.sh
   128  
   129  .PHONY: gotools
   130  gotools: gotools-install
   131  
   132  .PHONY: check-go-version
   133  check-go-version:
   134  	@scripts/check_go_version.sh
   135  
   136  .PHONY: integration-test
   137  integration-test: gotool.ginkgo ccenv-docker baseos-docker docker-thirdparty
   138  	./scripts/run-integration-tests.sh
   139  
   140  .PHONY: unit-test
   141  unit-test: unit-test-clean docker-thirdparty ccenv-docker baseos-docker
   142  	./scripts/run-unit-tests.sh
   143  
   144  .PHONY: unit-tests
   145  unit-tests: unit-test
   146  
   147  # Pull thirdparty docker images based on the latest baseimage release version
   148  # Also pull ccenv-1.4 for compatibility test to ensure pre-2.0 installed chaincodes
   149  # can be built by a peer configured to use the ccenv-1.4 as the builder image.
   150  .PHONY: docker-thirdparty
   151  docker-thirdparty:
   152  	docker pull couchdb:${COUCHDB_VER}
   153  	docker pull confluentinc/cp-zookeeper:${ZOOKEEPER_VER}
   154  	docker pull confluentinc/cp-kafka:${KAFKA_VER}
   155  	docker pull hyperledger/fabric-ccenv:1.4
   156  
   157  .PHONY: verify
   158  verify: export JOB_TYPE=VERIFY
   159  verify: unit-test
   160  
   161  .PHONY: profile
   162  profile: export JOB_TYPE=PROFILE
   163  profile: unit-test
   164  
   165  .PHONY: linter
   166  linter: check-deps gotools
   167  	@echo "LINT: Running code checks.."
   168  	./scripts/golinter.sh
   169  
   170  .PHONY: check-deps
   171  check-deps: gotools
   172  	@echo "DEP: Checking for dependency issues.."
   173  	./scripts/check_deps.sh
   174  
   175  .PHONY: check-metrics-docs
   176  check-metrics-doc: gotools
   177  	@echo "METRICS: Checking for outdated reference documentation.."
   178  	./scripts/metrics_doc.sh check
   179  
   180  .PHONY: generate-metrics-docs
   181  generate-metrics-doc: gotools
   182  	@echo "Generating metrics reference documentation..."
   183  	./scripts/metrics_doc.sh generate
   184  
   185  .PHONY: protos
   186  protos: gotools
   187  	@echo "Compiling non-API protos..."
   188  	./scripts/compile_protos.sh
   189  
   190  .PHONY: changelog
   191  changelog:
   192  	./scripts/changelog.sh v$(PREV_VERSION) v$(BASE_VERSION)
   193  
   194  .PHONY: native
   195  native: $(RELEASE_EXES)
   196  
   197  .PHONY: $(RELEASE_EXES)
   198  $(RELEASE_EXES): %: $(BUILD_DIR)/bin/%
   199  
   200  $(BUILD_DIR)/bin/%: GO_LDFLAGS = $(METADATA_VAR:%=-X $(PKGNAME)/common/metadata.%)
   201  $(BUILD_DIR)/bin/%:
   202  	@echo "Building $@"
   203  	@mkdir -p $(@D)
   204  	GOBIN=$(abspath $(@D)) go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   205  	@touch $@
   206  
   207  .PHONY: docker
   208  docker: $(RELEASE_IMAGES:%=%-docker)
   209  
   210  .PHONY: $(RELEASE_IMAGES:%=%-docker)
   211  $(RELEASE_IMAGES:%=%-docker): %-docker: $(BUILD_DIR)/images/%/$(DUMMY)
   212  
   213  $(BUILD_DIR)/images/peer/$(DUMMY): BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
   214  $(BUILD_DIR)/images/orderer/$(DUMMY): BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
   215  
   216  $(BUILD_DIR)/images/%/$(DUMMY):
   217  	@echo "Building Docker image $(DOCKER_NS)/fabric-$*"
   218  	@mkdir -p $(@D)
   219  	$(DBUILD) -f images/$*/Dockerfile \
   220  		--build-arg GO_VER=$(GO_VER) \
   221  		--build-arg ALPINE_VER=$(ALPINE_VER) \
   222  		$(BUILD_ARGS) \
   223  		-t $(DOCKER_NS)/fabric-$* .
   224  	docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(BASE_VERSION)
   225  	docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)
   226  	@touch $@
   227  
   228  # builds release packages for the host platform
   229  .PHONY: release
   230  release: check-go-version $(MARCH:%=release/%)
   231  
   232  # builds release packages for all target platforms
   233  .PHONY: release-all
   234  release-all: check-go-version $(RELEASE_PLATFORMS:%=release/%)
   235  
   236  .PHONY: $(RELEASE_PLATFORMS:%=release/%)
   237  $(RELEASE_PLATFORMS:%=release/%): GO_LDFLAGS = $(METADATA_VAR:%=-X $(PKGNAME)/common/metadata.%)
   238  $(RELEASE_PLATFORMS:%=release/%): release/%: $(foreach exe,$(RELEASE_EXES),release/%/bin/$(exe))
   239  
   240  # explicit targets for all platform executables
   241  $(foreach platform, $(RELEASE_PLATFORMS), $(RELEASE_EXES:%=release/$(platform)/bin/%)):
   242  	$(eval platform = $(patsubst release/%/bin,%,$(@D)))
   243  	$(eval GOOS = $(word 1,$(subst -, ,$(platform))))
   244  	$(eval GOARCH = $(word 2,$(subst -, ,$(platform))))
   245  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   246  	mkdir -p $(@D)
   247  	GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $@ -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   248  
   249  .PHONY: dist
   250  dist: dist-clean dist/$(MARCH)
   251  
   252  .PHONY: dist-all
   253  dist-all: dist-clean $(RELEASE_PLATFORMS:%=dist/%)
   254  dist/%: release/%
   255  	mkdir -p release/$(@F)/config
   256  	cp -r sampleconfig/*.yaml release/$(@F)/config
   257  	cd release/$(@F) && tar -czvf hyperledger-fabric-$(@F).$(PROJECT_VERSION).tar.gz *
   258  
   259  .PHONY: docker-list
   260  docker-list: $(RELEASE_IMAGES:%=%-docker-list)
   261  %-docker-list:
   262  	@echo $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)
   263  
   264  .PHONY: docker-clean
   265  docker-clean: $(RELEASE_IMAGES:%=%-docker-clean)
   266  %-docker-clean:
   267  	-@for image in "$$(docker images --quiet --filter=reference='$(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)')"; do \
   268  		[ -z "$$image" ] || docker rmi -f $$image; \
   269  	done
   270  	-@rm -rf $(BUILD_DIR)/images/$* || true
   271  
   272  .PHONY: docker-tag-latest
   273  docker-tag-latest: $(RELEASE_IMAGES:%=%-docker-tag-latest)
   274  %-docker-tag-latest:
   275  	docker tag $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG) $(DOCKER_NS)/fabric-$*:latest
   276  
   277  .PHONY: docker-tag-stable
   278  docker-tag-stable: $(RELEASE_IMAGES:%=%-docker-tag-stable)
   279  %-docker-tag-stable:
   280  	docker tag $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG) $(DOCKER_NS)/fabric-$*:stable
   281  
   282  .PHONY: publish-images
   283  publish-images: $(RELEASE_IMAGES:%=%-publish-images)
   284  %-publish-images:
   285  	@docker login $(DOCKER_HUB_USERNAME) $(DOCKER_HUB_PASSWORD)
   286  	@docker push $(DOCKER_NS)/fabric-$*:$(PROJECT_VERSION)
   287  
   288  .PHONY: clean
   289  clean: docker-clean unit-test-clean release-clean
   290  	-@rm -rf $(BUILD_DIR)
   291  
   292  .PHONY: clean-all
   293  clean-all: clean gotools-clean dist-clean
   294  	-@rm -rf /var/hyperledger/*
   295  	-@rm -rf docs/build/
   296  
   297  .PHONY: dist-clean
   298  dist-clean:
   299  	-@for platform in $(RELEASE_PLATFORMS) ""; do \
   300  		[ -z "$$platform" ] || rm -rf release/$${platform}/hyperledger-fabric-$${platform}.$(PROJECT_VERSION).tar.gz; \
   301  	done
   302  
   303  .PHONY: release-clean
   304  release-clean: $(RELEASE_PLATFORMS:%=%-release-clean)
   305  %-release-clean:
   306  	-@rm -rf release/$*
   307  
   308  .PHONY: unit-test-clean
   309  unit-test-clean:
   310  
   311  .PHONY: filename-spaces
   312  spaces:
   313  	@scripts/check_file_name_spaces.sh