github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/Makefile (about) 1 # Copyright IBM Corp All Rights Reserved. 2 # Copyright London Stock Exchange Group All Rights Reserved. 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 # 16 # ------------------------------------------------------------- 17 # This makefile defines the following targets 18 # 19 # - all (default) - builds all targets and runs all tests/checks 20 # - checks - runs all tests/checks 21 # - configtxgen - builds a native configtxgen binary 22 # - cryptogen - builds a native cryptogen binary 23 # - peer - builds a native fabric peer binary 24 # - orderer - builds a native fabric orderer binary 25 # - release - builds release packages for the host platform 26 # - release-all - builds release packages for all target platforms 27 # - unit-test - runs the go-test based unit tests 28 # - test-cmd - generates a "go test" string suitable for manual customization 29 # - behave - runs the behave test 30 # - behave-deps - ensures pre-requisites are available for running behave manually 31 # - gotools - installs go tools like golint 32 # - linter - runs all code checks 33 # - native - ensures all native binaries are available 34 # - docker[-clean] - ensures all docker images are available[/cleaned] 35 # - peer-docker[-clean] - ensures the peer container is available[/cleaned] 36 # - orderer-docker[-clean] - ensures the orderer container is available[/cleaned] 37 # - protos - generate all protobuf artifacts based on .proto files 38 # - clean - cleans the build area 39 # - dist-clean - superset of 'clean' that also removes persistent state 40 # - unit-test-clean - cleans unit test state (particularly from docker) 41 42 PROJECT_NAME = hyperledger/fabric 43 BASE_VERSION = 1.0.0 44 IS_RELEASE = false 45 46 ifneq ($(IS_RELEASE),true) 47 EXTRA_VERSION ?= snapshot-$(shell git rev-parse --short HEAD) 48 PROJECT_VERSION=$(BASE_VERSION)-$(EXTRA_VERSION) 49 else 50 PROJECT_VERSION=$(BASE_VERSION) 51 endif 52 53 PKGNAME = github.com/$(PROJECT_NAME) 54 CGO_FLAGS = CGO_CFLAGS=" " 55 ARCH=$(shell uname -m) 56 CHAINTOOL_RELEASE=v0.10.3 57 BASEIMAGE_RELEASE=$(shell cat ./.baseimage-release) 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://github.com/hyperledger/fabric-chaintool/releases/download/$(CHAINTOOL_RELEASE)/chaintool 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 PROJECT_FILES = $(shell git ls-files) 82 IMAGES = peer orderer ccenv javaenv buildenv testenv zookeeper kafka couchdb 83 RELEASE_PLATFORMS = windows-amd64 darwin-amd64 linux-amd64 linux-ppc64le linux-s390x 84 RELEASE_PKGS = configtxgen cryptogen 85 86 pkgmap.cryptogen := $(PKGNAME)/common/tools/cryptogen 87 pkgmap.configtxgen := $(PKGNAME)/common/configtx/tool/configtxgen 88 pkgmap.peer := $(PKGNAME)/peer 89 pkgmap.orderer := $(PKGNAME)/orderer 90 pkgmap.block-listener := $(PKGNAME)/examples/events/block-listener 91 pkgmap.cryptogen := $(PKGNAME)/common/tools/cryptogen 92 93 include docker-env.mk 94 95 all: native docker checks 96 97 checks: linter unit-test behave 98 99 .PHONY: gotools 100 gotools: 101 mkdir -p build/bin 102 cd gotools && $(MAKE) install BINDIR=$(GOPATH)/bin 103 104 gotools-clean: 105 cd gotools && $(MAKE) clean 106 107 # This is a legacy target left to satisfy existing CI scripts 108 membersrvc-image: 109 @echo "membersrvc has been removed from this build" 110 111 .PHONY: peer 112 peer: build/bin/peer 113 peer-docker: build/image/peer/$(DUMMY) 114 115 .PHONY: orderer 116 orderer: build/bin/orderer 117 orderer-docker: build/image/orderer/$(DUMMY) 118 119 .PHONY: configtxgen 120 configtxgen: GO_TAGS+= nopkcs11 121 configtxgen: build/bin/configtxgen 122 123 cryptogen: build/bin/cryptogen 124 125 javaenv: build/image/javaenv/$(DUMMY) 126 127 buildenv: build/image/buildenv/$(DUMMY) 128 129 build/image/testenv/$(DUMMY): build/image/buildenv/$(DUMMY) 130 testenv: build/image/testenv/$(DUMMY) 131 132 couchdb: build/image/couchdb/$(DUMMY) 133 134 unit-test: unit-test-clean peer-docker testenv couchdb 135 cd unit-test && docker-compose up --abort-on-container-exit --force-recreate && docker-compose down 136 137 unit-tests: unit-test 138 139 # Generates a string to the terminal suitable for manual augmentation / re-issue, useful for running tests by hand 140 test-cmd: 141 @echo "go test -ldflags \"$(GO_LDFLAGS)\"" 142 143 docker: $(patsubst %,build/image/%/$(DUMMY), $(IMAGES)) 144 native: peer orderer configtxgen cryptogen 145 146 BEHAVE_ENVIRONMENTS = kafka orderer orderer-1-kafka-1 orderer-1-kafka-3 147 BEHAVE_ENVIRONMENT_TARGETS = $(patsubst %,bddtests/environments/%, $(BEHAVE_ENVIRONMENTS)) 148 .PHONY: behave-environments $(BEHAVE_ENVIRONMENT_TARGETS) 149 behave-environments: $(BEHAVE_ENVIRONMENT_TARGETS) 150 $(BEHAVE_ENVIRONMENT_TARGETS): 151 @docker-compose --file $@/docker-compose.yml build 152 153 behave-deps: docker peer build/bin/block-listener behave-environments 154 behave: behave-deps 155 @echo "Running behave tests" 156 @cd bddtests; behave $(BEHAVE_OPTS) 157 158 behave-peer-chaincode: build/bin/peer peer-docker orderer-docker 159 @cd peer/chaincode && behave 160 161 linter: buildenv 162 @echo "LINT: Running code checks.." 163 @$(DRUN) $(DOCKER_NS)/fabric-buildenv:$(DOCKER_TAG) ./scripts/golinter.sh 164 165 %/chaintool: Makefile 166 @echo "Installing chaintool" 167 @mkdir -p $(@D) 168 curl -L $(CHAINTOOL_URL) > $@ 169 chmod +x $@ 170 171 # We (re)build a package within a docker context but persist the $GOPATH/pkg 172 # directory so that subsequent builds are faster 173 build/docker/bin/%: $(PROJECT_FILES) 174 $(eval TARGET = ${patsubst build/docker/bin/%,%,${@}}) 175 @echo "Building $@" 176 @mkdir -p build/docker/bin build/docker/$(TARGET)/pkg 177 @$(DRUN) \ 178 -v $(abspath build/docker/bin):/opt/gopath/bin \ 179 -v $(abspath build/docker/$(TARGET)/pkg):/opt/gopath/pkg \ 180 $(BASE_DOCKER_NS)/fabric-baseimage:$(BASE_DOCKER_TAG) \ 181 go install -ldflags "$(DOCKER_GO_LDFLAGS)" $(pkgmap.$(@F)) 182 @touch $@ 183 184 build/bin: 185 mkdir -p $@ 186 187 build/docker/gotools/bin/protoc-gen-go: build/docker/gotools 188 189 build/docker/gotools: gotools/Makefile 190 @mkdir -p $@/bin $@/obj 191 @$(DRUN) \ 192 -v $(abspath $@):/opt/gotools \ 193 -w /opt/gopath/src/$(PKGNAME)/gotools \ 194 $(BASE_DOCKER_NS)/fabric-baseimage:$(BASE_DOCKER_TAG) \ 195 make install BINDIR=/opt/gotools/bin OBJDIR=/opt/gotools/obj 196 197 # Both peer and peer-docker depend on ccenv and javaenv (all docker env images it supports). 198 build/bin/peer: build/image/ccenv/$(DUMMY) build/image/javaenv/$(DUMMY) 199 build/image/peer/$(DUMMY): build/image/ccenv/$(DUMMY) build/image/javaenv/$(DUMMY) 200 201 build/bin/%: $(PROJECT_FILES) 202 @mkdir -p $(@D) 203 @echo "$@" 204 $(CGO_FLAGS) GOBIN=$(abspath $(@D)) go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F)) 205 @echo "Binary available as $@" 206 @touch $@ 207 208 # payload definitions' 209 build/image/ccenv/payload: build/docker/gotools/bin/protoc-gen-go \ 210 build/bin/chaintool \ 211 build/goshim.tar.bz2 212 build/image/javaenv/payload: build/javashim.tar.bz2 \ 213 build/protos.tar.bz2 \ 214 settings.gradle 215 build/image/peer/payload: build/docker/bin/peer \ 216 build/sampleconfig.tar.bz2 217 build/image/orderer/payload: build/docker/bin/orderer \ 218 build/sampleconfig.tar.bz2 219 build/image/buildenv/payload: build/gotools.tar.bz2 \ 220 build/docker/gotools/bin/protoc-gen-go 221 build/image/testenv/payload: build/docker/bin/orderer \ 222 build/docker/bin/peer \ 223 build/sampleconfig.tar.bz2 \ 224 images/testenv/install-softhsm2.sh 225 build/image/zookeeper/payload: images/zookeeper/docker-entrypoint.sh 226 build/image/kafka/payload: images/kafka/docker-entrypoint.sh \ 227 images/kafka/kafka-run-class.sh 228 build/image/couchdb/payload: images/couchdb/docker-entrypoint.sh \ 229 images/couchdb/local.ini \ 230 images/couchdb/vm.args 231 232 build/image/%/payload: 233 mkdir -p $@ 234 cp $^ $@ 235 236 .PRECIOUS: build/image/%/Dockerfile 237 238 build/image/%/Dockerfile: images/%/Dockerfile.in 239 @cat $< \ 240 | sed -e 's/_BASE_NS_/$(BASE_DOCKER_NS)/g' \ 241 | sed -e 's/_NS_/$(DOCKER_NS)/g' \ 242 | sed -e 's/_BASE_TAG_/$(BASE_DOCKER_TAG)/g' \ 243 | sed -e 's/_TAG_/$(DOCKER_TAG)/g' \ 244 > $@ 245 @echo LABEL $(BASE_DOCKER_LABEL).version=$(PROJECT_VERSION) \\>>$@ 246 @echo " " $(BASE_DOCKER_LABEL).base.version=$(BASEIMAGE_RELEASE)>>$@ 247 248 build/image/%/$(DUMMY): Makefile build/image/%/payload build/image/%/Dockerfile 249 $(eval TARGET = ${patsubst build/image/%/$(DUMMY),%,${@}}) 250 @echo "Building docker $(TARGET)-image" 251 $(DBUILD) -t $(DOCKER_NS)/fabric-$(TARGET) $(@D) 252 docker tag $(DOCKER_NS)/fabric-$(TARGET) $(DOCKER_NS)/fabric-$(TARGET):$(DOCKER_TAG) 253 @touch $@ 254 255 build/gotools.tar.bz2: build/docker/gotools 256 (cd $</bin && tar -jc *) > $@ 257 258 build/goshim.tar.bz2: $(GOSHIM_DEPS) 259 @echo "Creating $@" 260 @tar -jhc -C $(GOPATH)/src $(patsubst $(GOPATH)/src/%,%,$(GOSHIM_DEPS)) > $@ 261 262 build/sampleconfig.tar.bz2: 263 (cd sampleconfig && tar -jc *) > $@ 264 265 build/javashim.tar.bz2: $(JAVASHIM_DEPS) 266 build/protos.tar.bz2: $(PROTOS) 267 268 build/%.tar.bz2: 269 @echo "Creating $@" 270 @tar -jc $^ > $@ 271 272 # builds release packages for the host platform 273 release: $(patsubst %,release/%, $(shell go env GOOS)-$(shell go env GOARCH)) 274 275 # builds release packages for all target platforms 276 release-all: $(patsubst %,release/%, $(RELEASE_PLATFORMS)) 277 278 release/windows-amd64: GOOS=windows 279 release/windows-amd64: GO_TAGS+= nopkcs11 280 release/windows-amd64: $(patsubst %,release/windows-amd64/bin/%, $(RELEASE_PKGS)) release/windows-amd64/install 281 282 release/darwin-amd64: GOOS=darwin 283 release/darwin-amd64: GO_TAGS+= nopkcs11 284 release/darwin-amd64: $(patsubst %,release/darwin-amd64/bin/%, $(RELEASE_PKGS)) release/darwin-amd64/install 285 286 release/linux-amd64: GOOS=linux 287 release/linux-amd64: GO_TAGS+= nopkcs11 288 release/linux-amd64: $(patsubst %,release/linux-amd64/bin/%, $(RELEASE_PKGS)) release/linux-amd64/install 289 290 release/%-amd64: DOCKER_ARCH=x86_64 291 release/%-amd64: GOARCH=amd64 292 release/linux-%: GOOS=linux 293 294 release/linux-ppc64le: GOARCH=ppc64le 295 release/linux-ppc64le: DOCKER_ARCH=ppc64le 296 release/linux-ppc64le: GO_TAGS+= nopkcs11 297 release/linux-ppc64le: $(patsubst %,release/linux-ppc64le/bin/%, $(RELEASE_PKGS)) release/linux-ppc64le/install 298 299 release/linux-s390x: GOARCH=s390x 300 release/linux-s390x: DOCKER_ARCH=s390x 301 release/linux-s390x: GO_TAGS+= nopkcs11 302 release/linux-s390x: $(patsubst %,release/linux-s390x/bin/%, $(RELEASE_PKGS)) release/linux-s390x/install 303 304 release/%/bin/configtxgen: $(PROJECT_FILES) 305 @echo "Building $@ for $(GOOS)-$(GOARCH)" 306 mkdir -p $(@D) 307 $(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F)) 308 309 release/%/bin/cryptogen: $(PROJECT_FILES) 310 @echo "Building $@ for $(GOOS)-$(GOARCH)" 311 mkdir -p $(@D) 312 $(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F)) 313 314 release/%/install: $(PROJECT_FILES) 315 mkdir -p $@ 316 @cat $@/../../templates/get-docker-images.in \ 317 | sed -e 's/_NS_/$(DOCKER_NS)/g' \ 318 | sed -e 's/_ARCH_/$(DOCKER_ARCH)/g' \ 319 | sed -e 's/_VERSION_/$(PROJECT_VERSION)/g' \ 320 > $@/get-docker-images.sh 321 @chmod +x $@/get-docker-images.sh 322 323 .PHONY: protos 324 protos: buildenv 325 @$(DRUN) $(DOCKER_NS)/fabric-buildenv:$(DOCKER_TAG) ./scripts/compile_protos.sh 326 327 %-docker-clean: 328 $(eval TARGET = ${patsubst %-docker-clean,%,${@}}) 329 -docker images -q $(DOCKER_NS)/fabric-$(TARGET) | xargs -I '{}' docker rmi -f '{}' 330 -@rm -rf build/image/$(TARGET) ||: 331 332 docker-clean: $(patsubst %,%-docker-clean, $(IMAGES)) 333 334 .PHONY: clean 335 clean: docker-clean unit-test-clean 336 -@rm -rf build ||: 337 338 .PHONY: dist-clean 339 dist-clean: clean gotools-clean 340 -@rm -rf /var/hyperledger/* ||: 341 342 %-release-clean: 343 $(eval TARGET = ${patsubst %-release-clean,%,${@}}) 344 -@rm -rf release/$(TARGET) 345 346 release-clean: $(patsubst %,%-release-clean, $(RELEASE_PLATFORMS)) 347 348 .PHONY: unit-test-clean 349 unit-test-clean: 350 cd unit-test && docker-compose down