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