diff --git a/Makefile b/Makefile index 3cd9d33953..813937c111 100644 --- a/Makefile +++ b/Makefile @@ -45,27 +45,25 @@ EXECUTABLES = go docker git K := $(foreach exec,$(EXECUTABLES),\ $(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH: Check dependencies"))) +# SUBDIRS are components that have their own Makefiles that we can invoke +SUBDIRS = gotools +SUBDIRS:=$(strip $(SUBDIRS)) + # Make our baseimage depend on any changes to images/base or scripts/provision BASEIMAGE_RELEASE = $(shell cat ./images/base/release) BASEIMAGE_DEPS = $(shell git ls-files images/base scripts/provision) -GOTOOLS = golint govendor goimports protoc-gen-go ginkgo gomega -GOTOOLS_BIN = $(patsubst %,$(GOPATH)/bin/%, $(GOTOOLS)) - PROJECT_FILES = $(shell git ls-files) IMAGES = base src ccenv peer membersrvc -# go tool->path mapping -go.fqp.govendor := github.com/kardianos/govendor -go.fqp.golint := github.com/golang/lint/golint -go.fqp.goimports := golang.org/x/tools/cmd/goimports -go.fqp.ginkgo := github.com/onsi/ginkgo/ginkgo -go.fqp.gomega := github.com/onsi/gomega - all: peer membersrvc checks checks: linter unit-test behave +.PHONY: $(SUBDIRS) +$(SUBDIRS): + cd $@ && $(MAKE) + .PHONY: peer peer: build/bin/peer peer-image: build/image/peer/.dummy @@ -93,8 +91,6 @@ behave: behave-deps @echo "Running behave tests" @cd bddtests; behave $(BEHAVE_OPTS) -gotools: $(GOTOOLS_BIN) - linter: gotools @echo "LINT: Running code checks.." @echo "Running go vet" @@ -109,22 +105,6 @@ linter: gotools @echo "Running goimports" @./scripts/goimports.sh -# Special override for protoc-gen-go since we want to use the version vendored with the project -gotool.protoc-gen-go: - mkdir -p $(GOPATH)/src/github.com/golang/protobuf/ - cp -r $(GOPATH)/src/github.com/hyperledger/fabric/vendor/github.com/golang/protobuf/ $(GOPATH)/src/github.com/golang/ - go install github.com/golang/protobuf/protoc-gen-go - rm -rf $(GOPATH)/src/github.com/golang/protobuf - -# Default rule for gotools uses the name->path map for a generic 'go get' style build -gotool.%: - $(eval TOOL = ${subst gotool.,,${@}}) - go get ${go.fqp.${TOOL}} - -$(GOPATH)/bin/%: - $(eval TOOL = ${subst $(GOPATH)/bin/,,${@}}) - $(MAKE) gotool.$(TOOL) - # We (re)build protoc-gen-go from within docker context so that # we may later inject the binary into a different docker environment # This is necessary since we cannot guarantee that binaries built @@ -227,11 +207,14 @@ node-sdk: node-sdk-unit-tests: node-sdk @./sdk/node/bin/run-unit-tests.sh +.PHONY: $(SUBDIRS:=-clean) +$(SUBDIRS:=-clean): + cd $(patsubst %-clean,%,$@) && $(MAKE) clean + .PHONY: clean -clean: images-clean +clean: images-clean $(filter-out gotools-clean, $(SUBDIRS:=-clean)) -@rm -rf build ||: .PHONY: dist-clean -dist-clean: clean +dist-clean: clean gotools-clean -@rm -rf /var/hyperledger/* ||: - -@rm -f $(GOTOOLS_BIN) ||: diff --git a/gotools/Makefile b/gotools/Makefile new file mode 100644 index 0000000000..1d318f2b53 --- /dev/null +++ b/gotools/Makefile @@ -0,0 +1,50 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +GOTOOLS = golint govendor goimports protoc-gen-go ginkgo gomega +GOTOOLS_BIN = $(patsubst %,$(GOPATH)/bin/%, $(GOTOOLS)) + +# go tool->path mapping +go.fqp.govendor := github.com/kardianos/govendor +go.fqp.golint := github.com/golang/lint/golint +go.fqp.goimports := golang.org/x/tools/cmd/goimports +go.fqp.ginkgo := github.com/onsi/ginkgo/ginkgo +go.fqp.gomega := github.com/onsi/gomega + +all: $(GOTOOLS_BIN) + +# Special override for protoc-gen-go since we want to use the version vendored with the project +gotool.protoc-gen-go: + mkdir -p $(GOPATH)/src/github.com/golang/protobuf/ + cp -r $(GOPATH)/src/github.com/hyperledger/fabric/vendor/github.com/golang/protobuf/ $(GOPATH)/src/github.com/golang/ + go install github.com/golang/protobuf/protoc-gen-go + rm -rf $(GOPATH)/src/github.com/golang/protobuf + +# Default rule for gotools uses the name->path map for a generic 'go get' style build +gotool.%: + $(eval TOOL = ${subst gotool.,,${@}}) + @echo "Building $(TOOL)" + go get ${go.fqp.${TOOL}} + +$(GOPATH)/bin/%: + $(eval TOOL = ${subst $(GOPATH)/bin/,,${@}}) + @$(MAKE) gotool.$(TOOL) + +.PHONY: clean +clean: + -@rm -f $(GOTOOLS_BIN) ||: