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