github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/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 tests/checks
    10  #   - checks - runs all 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  #   - peer - builds a native fabric peer binary
    16  #   - orderer - builds a native fabric orderer binary
    17  #   - release - builds release packages for the host platform
    18  #   - release-all - builds release packages for all target platforms
    19  #   - unit-test - runs the go-test based unit tests
    20  #   - verify - runs unit tests for only the changed package tree
    21  #   - test-cmd - generates a "go test" string suitable for manual customization
    22  #   - behave - runs the behave test
    23  #   - docker-thirdparty - pulls thirdparty images (kafka,zookeeper,couchdb)
    24  #   - behave-deps - ensures pre-requisites are available for running behave manually
    25  #   - gotools - installs go tools like golint
    26  #   - linter - runs all code checks
    27  #   - license - checks go sourrce files for Apache license header
    28  #   - native - ensures all native binaries are available
    29  #   - docker[-clean] - ensures all docker images are available[/cleaned]
    30  #   - peer-docker[-clean] - ensures the peer container is available[/cleaned]
    31  #   - orderer-docker[-clean] - ensures the orderer container is available[/cleaned]
    32  #   - tools-docker[-clean] - ensures the tools container is available[/cleaned]
    33  #   - protos - generate all protobuf artifacts based on .proto files
    34  #   - clean - cleans the build area
    35  #   - clean-all - superset of 'clean' that also removes persistent state
    36  #   - dist-clean - clean release packages for all target platforms
    37  #   - unit-test-clean - cleans unit test state (particularly from docker)
    38  #   - basic-checks - performs basic checks like license, spelling and linter
    39  
    40  PROJECT_NAME   = hyperledger/fabric
    41  BASE_VERSION = 1.0.7
    42  PREV_VERSION = 1.0.6
    43  IS_RELEASE = false
    44  
    45  ifneq ($(IS_RELEASE),true)
    46  EXTRA_VERSION ?= snapshot-$(shell git rev-parse --short HEAD)
    47  PROJECT_VERSION=$(BASE_VERSION)-$(EXTRA_VERSION)
    48  else
    49  PROJECT_VERSION=$(BASE_VERSION)
    50  endif
    51  
    52  PKGNAME = github.com/$(PROJECT_NAME)
    53  CGO_FLAGS = CGO_CFLAGS=" "
    54  ARCH=$(shell uname -m)
    55  MARCH=$(shell go env GOOS)-$(shell go env GOARCH)
    56  CHAINTOOL_RELEASE=1.0.0
    57  BASEIMAGE_RELEASE=0.3.2
    58  
    59  # defined in common/metadata/metadata.go
    60  METADATA_VAR = Version=$(PROJECT_VERSION)
    61  METADATA_VAR += BaseVersion=$(BASEIMAGE_RELEASE)
    62  METADATA_VAR += BaseDockerLabel=$(BASE_DOCKER_LABEL)
    63  METADATA_VAR += DockerNamespace=$(DOCKER_NS)
    64  METADATA_VAR += BaseDockerNamespace=$(BASE_DOCKER_NS)
    65  
    66  GO_LDFLAGS = $(patsubst %,-X $(PKGNAME)/common/metadata.%,$(METADATA_VAR))
    67  
    68  GO_TAGS ?=
    69  
    70  CHAINTOOL_URL ?= https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/chaintool-$(CHAINTOOL_RELEASE)/hyperledger-fabric-chaintool-$(CHAINTOOL_RELEASE).jar
    71  
    72  export GO_LDFLAGS
    73  
    74  EXECUTABLES = go docker git curl
    75  K := $(foreach exec,$(EXECUTABLES),\
    76  	$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH: Check dependencies")))
    77  
    78  GOSHIM_DEPS = $(shell ./scripts/goListFiles.sh $(PKGNAME)/core/chaincode/shim)
    79  JAVASHIM_DEPS =  $(shell git ls-files core/chaincode/shim/java)
    80  PROTOS = $(shell git ls-files *.proto | grep -v vendor)
    81  # No sense rebuilding when non production code is changed
    82  PROJECT_FILES = $(shell git ls-files  | grep -v ^test | grep -v ^unit-test | \
    83  	grep -v ^bddtests | grep -v ^docs | grep -v _test.go$ | grep -v .md$ | \
    84  	grep -v ^.git | grep -v ^examples | grep -v ^devenv | grep -v .png$ | \
    85  	grep -v ^LICENSE )
    86  RELEASE_TEMPLATES = $(shell git ls-files | grep "release/templates")
    87  IMAGES = peer orderer ccenv javaenv buildenv testenv zookeeper kafka couchdb tools
    88  RELEASE_PLATFORMS = windows-amd64 darwin-amd64 linux-amd64 linux-ppc64le linux-s390x
    89  RELEASE_PKGS = configtxgen cryptogen configtxlator peer orderer
    90  
    91  pkgmap.cryptogen      := $(PKGNAME)/common/tools/cryptogen
    92  pkgmap.configtxgen    := $(PKGNAME)/common/configtx/tool/configtxgen
    93  pkgmap.configtxlator  := $(PKGNAME)/common/tools/configtxlator
    94  pkgmap.peer           := $(PKGNAME)/peer
    95  pkgmap.orderer        := $(PKGNAME)/orderer
    96  pkgmap.block-listener := $(PKGNAME)/examples/events/block-listener
    97  pkgmap.cryptogen      := $(PKGNAME)/common/tools/cryptogen
    98  
    99  include docker-env.mk
   100  
   101  all: native docker checks
   102  
   103  checks: license spelling linter unit-test behave
   104  
   105  basic-checks: license spelling linter
   106  
   107  desk-check: license spelling linter verify behave
   108  
   109  .PHONY: spelling
   110  spelling:
   111  	@scripts/check_spelling.sh
   112  
   113  .PHONY: license
   114  license:
   115  	@scripts/check_license.sh
   116  
   117  .PHONY: gotools
   118  gotools:
   119  	mkdir -p build/bin
   120  	cd gotools && $(MAKE) install BINDIR=$(GOPATH)/bin
   121  
   122  .PHONY: gotools-clean
   123  gotools-clean:
   124  	cd gotools && $(MAKE) clean
   125  
   126  # This is a legacy target left to satisfy existing CI scripts
   127  membersrvc-image:
   128  	@echo "membersrvc has been removed from this build"
   129  
   130  .PHONY: peer
   131  peer: build/bin/peer
   132  peer-docker: build/image/peer/$(DUMMY)
   133  
   134  .PHONY: orderer
   135  orderer: build/bin/orderer
   136  orderer-docker: build/image/orderer/$(DUMMY)
   137  
   138  .PHONY: configtxgen
   139  configtxgen: GO_TAGS+= nopkcs11
   140  configtxgen: GO_LDFLAGS=-X $(pkgmap.$(@F))/metadata.Version=$(PROJECT_VERSION)
   141  configtxgen: build/bin/configtxgen
   142  
   143  configtxlator: GO_LDFLAGS=-X $(pkgmap.$(@F))/metadata.Version=$(PROJECT_VERSION)
   144  configtxlator: build/bin/configtxlator
   145  
   146  cryptogen: GO_LDFLAGS=-X $(pkgmap.$(@F))/metadata.Version=$(PROJECT_VERSION)
   147  cryptogen: build/bin/cryptogen
   148  
   149  tools-docker: build/image/tools/$(DUMMY)
   150  
   151  javaenv: build/image/javaenv/$(DUMMY)
   152  
   153  buildenv: build/image/buildenv/$(DUMMY)
   154  
   155  build/image/testenv/$(DUMMY): build/image/buildenv/$(DUMMY)
   156  testenv: build/image/testenv/$(DUMMY)
   157  
   158  couchdb: build/image/couchdb/$(DUMMY)
   159  
   160  kafka: build/image/kafka/$(DUMMY)
   161  
   162  zookeeper: build/image/zookeeper/$(DUMMY)
   163  
   164  unit-test: unit-test-clean peer-docker testenv docker-thirdparty
   165  	cd unit-test && docker-compose up --abort-on-container-exit --force-recreate && docker-compose down
   166  
   167  unit-tests: unit-test
   168  
   169  verify: unit-test-clean peer-docker testenv docker-thirdparty
   170  	cd unit-test && JOB_TYPE=VERIFY docker-compose up --abort-on-container-exit --force-recreate && docker-compose down
   171  
   172  # Generates a string to the terminal suitable for manual augmentation / re-issue, useful for running tests by hand
   173  test-cmd:
   174  	@echo "go test -ldflags \"$(GO_LDFLAGS)\""
   175  
   176  docker: $(patsubst %,build/image/%/$(DUMMY), $(IMAGES))
   177  native: peer orderer configtxgen cryptogen configtxlator
   178  
   179  behave-deps: docker peer build/bin/block-listener configtxgen cryptogen
   180  behave: behave-deps
   181  	@echo "Running behave tests"
   182  	@cd bddtests; behave $(BEHAVE_OPTS)
   183  
   184  behave-peer-chaincode: build/bin/peer peer-docker orderer-docker
   185  	@cd peer/chaincode && behave
   186  
   187  linter: buildenv
   188  	@echo "LINT: Running code checks.."
   189  	@$(DRUN) $(DOCKER_NS)/fabric-buildenv:$(DOCKER_TAG) ./scripts/golinter.sh
   190  
   191   # Pull thirdparty docker images based on the latest baseimage release version
   192  .PHONY: docker-thirdparty
   193  docker-thirdparty:
   194  	docker pull $(BASE_DOCKER_NS)/fabric-couchdb:$(ARCH)-$(PREV_VERSION)
   195  	docker tag $(BASE_DOCKER_NS)/fabric-couchdb:$(ARCH)-$(PREV_VERSION) $(DOCKER_NS)/fabric-couchdb
   196  	docker pull $(BASE_DOCKER_NS)/fabric-zookeeper:$(ARCH)-$(PREV_VERSION)
   197  	docker tag $(BASE_DOCKER_NS)/fabric-zookeeper:$(ARCH)-$(PREV_VERSION) $(DOCKER_NS)/fabric-zookeeper
   198  	docker pull $(BASE_DOCKER_NS)/fabric-kafka:$(ARCH)-$(PREV_VERSION)
   199  	docker tag $(BASE_DOCKER_NS)/fabric-kafka:$(ARCH)-$(PREV_VERSION) $(DOCKER_NS)/fabric-kafka
   200  
   201  %/chaintool: Makefile
   202  	@echo "Installing chaintool"
   203  	@mkdir -p $(@D)
   204  	curl -fL $(CHAINTOOL_URL) > $@
   205  	chmod +x $@
   206  
   207  # We (re)build a package within a docker context but persist the $GOPATH/pkg
   208  # directory so that subsequent builds are faster
   209  build/docker/bin/%: $(PROJECT_FILES)
   210  	$(eval TARGET = ${patsubst build/docker/bin/%,%,${@}})
   211  	@echo "Building $@"
   212  	@mkdir -p build/docker/bin build/docker/$(TARGET)/pkg
   213  	@$(DRUN) \
   214  		-v $(abspath build/docker/bin):/opt/gopath/bin \
   215  		-v $(abspath build/docker/$(TARGET)/pkg):/opt/gopath/pkg \
   216  		$(BASE_DOCKER_NS)/fabric-baseimage:$(BASE_DOCKER_TAG) \
   217  		go install -ldflags "$(DOCKER_GO_LDFLAGS)" $(pkgmap.$(@F))
   218  	@touch $@
   219  
   220  build/bin:
   221  	mkdir -p $@
   222  
   223  changelog:
   224  	./scripts/changelog.sh v$(PREV_VERSION) v$(BASE_VERSION)
   225  
   226  build/docker/gotools/bin/protoc-gen-go: build/docker/gotools
   227  
   228  build/docker/gotools: gotools/Makefile
   229  	@mkdir -p $@/bin $@/obj
   230  	@$(DRUN) \
   231  		-v $(abspath $@):/opt/gotools \
   232  		-w /opt/gopath/src/$(PKGNAME)/gotools \
   233  		$(BASE_DOCKER_NS)/fabric-baseimage:$(BASE_DOCKER_TAG) \
   234  		make install BINDIR=/opt/gotools/bin OBJDIR=/opt/gotools/obj
   235  
   236  # Both peer and peer-docker depend on ccenv and javaenv (all docker env images it supports).
   237  build/bin/peer: build/image/ccenv/$(DUMMY) build/image/javaenv/$(DUMMY)
   238  build/image/peer/$(DUMMY): build/image/ccenv/$(DUMMY) build/image/javaenv/$(DUMMY)
   239  
   240  build/bin/%: $(PROJECT_FILES)
   241  	@mkdir -p $(@D)
   242  	@echo "$@"
   243  	$(CGO_FLAGS) GOBIN=$(abspath $(@D)) go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   244  	@echo "Binary available as $@"
   245  	@touch $@
   246  
   247  # payload definitions'
   248  build/image/ccenv/payload:      build/docker/gotools/bin/protoc-gen-go \
   249  				build/bin/chaintool \
   250  				build/goshim.tar.bz2
   251  build/image/javaenv/payload:    build/javashim.tar.bz2 \
   252  				build/protos.tar.bz2 \
   253  				settings.gradle
   254  build/image/peer/payload:       build/docker/bin/peer \
   255  				build/sampleconfig.tar.bz2
   256  build/image/orderer/payload:    build/docker/bin/orderer \
   257  				build/sampleconfig.tar.bz2
   258  build/image/buildenv/payload:   build/gotools.tar.bz2 \
   259  				build/docker/gotools/bin/protoc-gen-go
   260  build/image/testenv/payload:    build/docker/bin/orderer \
   261  				build/docker/bin/peer \
   262  				build/sampleconfig.tar.bz2 \
   263  				images/testenv/install-softhsm2.sh
   264  build/image/zookeeper/payload:  images/zookeeper/docker-entrypoint.sh
   265  build/image/kafka/payload:      images/kafka/docker-entrypoint.sh \
   266  				images/kafka/kafka-run-class.sh
   267  build/image/couchdb/payload:	images/couchdb/docker-entrypoint.sh \
   268  				images/couchdb/local.ini \
   269  				images/couchdb/vm.args
   270  build/image/tools/payload:      build/docker/bin/cryptogen \
   271  	                        build/docker/bin/configtxgen \
   272  	                        build/docker/bin/configtxlator \
   273  				build/docker/bin/peer \
   274  				build/sampleconfig.tar.bz2
   275  
   276  build/image/%/payload:
   277  	mkdir -p $@
   278  	cp $^ $@
   279  
   280  .PRECIOUS: build/image/%/Dockerfile
   281  
   282  build/image/%/Dockerfile: images/%/Dockerfile.in
   283  	@cat $< \
   284  		| sed -e 's/_BASE_NS_/$(BASE_DOCKER_NS)/g' \
   285  		| sed -e 's/_NS_/$(DOCKER_NS)/g' \
   286  		| sed -e 's/_BASE_TAG_/$(BASE_DOCKER_TAG)/g' \
   287  		| sed -e 's/_TAG_/$(DOCKER_TAG)/g' \
   288  		> $@
   289  	@echo LABEL $(BASE_DOCKER_LABEL).version=$(PROJECT_VERSION) \\>>$@
   290  	@echo "     " $(BASE_DOCKER_LABEL).base.version=$(BASEIMAGE_RELEASE)>>$@
   291  
   292  build/image/%/$(DUMMY): Makefile build/image/%/payload build/image/%/Dockerfile
   293  	$(eval TARGET = ${patsubst build/image/%/$(DUMMY),%,${@}})
   294  	@echo "Building docker $(TARGET)-image"
   295  	$(DBUILD) -t $(DOCKER_NS)/fabric-$(TARGET) $(@D)
   296  	docker tag $(DOCKER_NS)/fabric-$(TARGET) $(DOCKER_NS)/fabric-$(TARGET):$(DOCKER_TAG)
   297  	@touch $@
   298  
   299  build/gotools.tar.bz2: build/docker/gotools
   300  	(cd $</bin && tar -jc *) > $@
   301  
   302  build/goshim.tar.bz2: $(GOSHIM_DEPS)
   303  	@echo "Creating $@"
   304  	@tar -jhc -C $(GOPATH)/src $(patsubst $(GOPATH)/src/%,%,$(GOSHIM_DEPS)) > $@
   305  
   306  build/sampleconfig.tar.bz2: $(shell find sampleconfig -type f)
   307  	(cd sampleconfig && tar -jc *) > $@
   308  
   309  build/javashim.tar.bz2: $(JAVASHIM_DEPS)
   310  build/protos.tar.bz2: $(PROTOS)
   311  
   312  build/%.tar.bz2:
   313  	@echo "Creating $@"
   314  	@tar -jc $^ > $@
   315  
   316  # builds release packages for the host platform
   317  release: $(patsubst %,release/%, $(MARCH))
   318  
   319  # builds release packages for all target platforms
   320  release-all: $(patsubst %,release/%, $(RELEASE_PLATFORMS))
   321  
   322  release/%: GO_LDFLAGS=-X $(pkgmap.$(@F))/metadata.Version=$(PROJECT_VERSION)
   323  
   324  release/windows-amd64: GOOS=windows
   325  release/windows-amd64: GO_TAGS+= nopkcs11
   326  release/windows-amd64: $(patsubst %,release/windows-amd64/bin/%, $(RELEASE_PKGS)) release/windows-amd64/install
   327  
   328  release/darwin-amd64: GOOS=darwin
   329  release/darwin-amd64: GO_TAGS+= nopkcs11
   330  release/darwin-amd64: $(patsubst %,release/darwin-amd64/bin/%, $(RELEASE_PKGS)) release/darwin-amd64/install
   331  
   332  release/linux-amd64: GOOS=linux
   333  release/linux-amd64: GO_TAGS+= nopkcs11
   334  release/linux-amd64: $(patsubst %,release/linux-amd64/bin/%, $(RELEASE_PKGS)) release/linux-amd64/install
   335  
   336  release/%-amd64: DOCKER_ARCH=x86_64
   337  release/%-amd64: GOARCH=amd64
   338  release/linux-%: GOOS=linux
   339  
   340  release/linux-ppc64le: GOARCH=ppc64le
   341  release/linux-ppc64le: DOCKER_ARCH=ppc64le
   342  release/linux-ppc64le: GO_TAGS+= nopkcs11
   343  release/linux-ppc64le: $(patsubst %,release/linux-ppc64le/bin/%, $(RELEASE_PKGS)) release/linux-ppc64le/install
   344  
   345  release/linux-s390x: GOARCH=s390x
   346  release/linux-s390x: DOCKER_ARCH=s390x
   347  release/linux-s390x: GO_TAGS+= nopkcs11
   348  release/linux-s390x: $(patsubst %,release/linux-s390x/bin/%, $(RELEASE_PKGS)) release/linux-s390x/install
   349  
   350  release/%/bin/configtxlator: $(PROJECT_FILES)
   351  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   352  	mkdir -p $(@D)
   353  	$(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   354  
   355  release/%/bin/configtxgen: $(PROJECT_FILES)
   356  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   357  	mkdir -p $(@D)
   358  	$(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   359  
   360  release/%/bin/cryptogen: $(PROJECT_FILES)
   361  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   362  	mkdir -p $(@D)
   363  	$(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   364  
   365  release/%/bin/orderer: GO_LDFLAGS = $(patsubst %,-X $(PKGNAME)/common/metadata.%,$(METADATA_VAR))
   366  
   367  release/%/bin/orderer: $(PROJECT_FILES)
   368  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   369  	mkdir -p $(@D)
   370  	$(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   371  
   372  release/%/bin/peer: GO_LDFLAGS = $(patsubst %,-X $(PKGNAME)/common/metadata.%,$(METADATA_VAR))
   373  
   374  release/%/bin/peer: $(PROJECT_FILES)
   375  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   376  	mkdir -p $(@D)
   377  	$(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   378  
   379  release/%/install: $(PROJECT_FILES)
   380  	mkdir -p $(@D)/bin
   381  	@cat $(@D)/../templates/get-docker-images.in \
   382  		| sed -e 's/_NS_/$(DOCKER_NS)/g' \
   383  		| sed -e 's/_ARCH_/$(DOCKER_ARCH)/g' \
   384  		| sed -e 's/_VERSION_/$(PROJECT_VERSION)/g' \
   385  		| sed -e 's/_BASE_DOCKER_TAG_/$(BASE_DOCKER_TAG)/g' \
   386  		> $(@D)/bin/get-docker-images.sh
   387  		@chmod +x $(@D)/bin/get-docker-images.sh
   388  	@cat $(@D)/../templates/get-byfn.in \
   389  		| sed -e 's/_VERSION_/$(PROJECT_VERSION)/g' \
   390  		> $(@D)/bin/get-byfn.sh
   391  		@chmod +x $(@D)/bin/get-byfn.sh
   392  
   393  .PHONY: dist
   394  dist: dist-clean release
   395  	cd release/$(MARCH) && tar -czvf hyperledger-fabric-$(MARCH).$(PROJECT_VERSION).tar.gz *
   396  
   397  dist-all: dist-clean release-all $(patsubst %,dist/%, $(RELEASE_PLATFORMS))
   398  
   399  dist/windows-amd64:
   400  	cd release/windows-amd64 && tar -czvf hyperledger-fabric-windows-amd64.$(PROJECT_VERSION).tar.gz *
   401  
   402  dist/darwin-amd64:
   403  	cd release/darwin-amd64 && tar -czvf hyperledger-fabric-darwin-amd64.$(PROJECT_VERSION).tar.gz *
   404  
   405  dist/linux-amd64:
   406  	cd release/linux-amd64 && tar -czvf hyperledger-fabric-linux-amd64.$(PROJECT_VERSION).tar.gz *
   407  
   408  dist/linux-ppc64le:
   409  	cd release/linux-ppc64le && tar -czvf hyperledger-fabric-linux-ppc64le.$(PROJECT_VERSION).tar.gz *
   410  
   411  dist/linux-s390x:
   412  	cd release/linux-s390x && tar -czvf hyperledger-fabric-linux-s390x.$(PROJECT_VERSION).tar.gz *
   413  
   414  .PHONY: protos
   415  protos: buildenv
   416  	@$(DRUN) $(DOCKER_NS)/fabric-buildenv:$(DOCKER_TAG) ./scripts/compile_protos.sh
   417  
   418  %-docker-clean:
   419  	$(eval TARGET = ${patsubst %-docker-clean,%,${@}})
   420  	-docker images -q $(DOCKER_NS)/fabric-$(TARGET) | xargs -I '{}' docker rmi -f '{}'
   421  	-@rm -rf build/image/$(TARGET) ||:
   422  
   423  docker-clean: $(patsubst %,%-docker-clean, $(IMAGES))
   424  
   425  .PHONY: clean
   426  clean: docker-clean unit-test-clean release-clean
   427  	-@rm -rf build ||:
   428  
   429  .PHONY: clean-all
   430  clean-all: clean gotools-clean dist-clean release-clean unit-test-clean
   431  	-@rm -rf /var/hyperledger/* ||:
   432  
   433  .PHONY: dist-clean
   434  dist-clean:
   435  	-@rm -rf release/windows-amd64/hyperledger-fabric-windows-amd64.$(PROJECT_VERSION).tar.gz ||:
   436  	-@rm -rf release/darwin-amd64/hyperledger-fabric-darwin-amd64.$(PROJECT_VERSION).tar.gz ||:
   437  	-@rm -rf release/linux-amd64/hyperledger-fabric-linux-amd64.$(PROJECT_VERSION).tar.gz ||:
   438  	-@rm -rf release/linux-ppc64le/hyperledger-fabric-linux-ppc64le.$(PROJECT_VERSION).tar.gz ||:
   439  	-@rm -rf release/linux-s390x/hyperledger-fabric-linux-s390x.$(PROJECT_VERSION).tar.gz ||:
   440  
   441  %-release-clean:
   442  	$(eval TARGET = ${patsubst %-release-clean,%,${@}})
   443  	-@rm -rf release/$(TARGET)
   444  
   445  release-clean: $(patsubst %,%-release-clean, $(RELEASE_PLATFORMS))
   446  
   447  .PHONY: unit-test-clean
   448  unit-test-clean:
   449  	cd unit-test && docker-compose down