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