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