1# To include this protoc/make snippet, copy this to the top of your Makefile: 2# 3# default: build 4# 5# genproto.mk: 6# @docker pull lightstep/gogoprotoc:latest 7# @-docker rm -v lightstep-get-genproto-mk 8# @docker create --name lightstep-get-genproto-mk lightstep/gogoprotoc:latest 9# @docker cp lightstep-get-genproto-mk:/genproto.mk genproto.mk 10# @docker rm -v lightstep-get-genproto-mk 11# 12# include genproto.mk 13 14GOLANG = golang 15PBUF = protobuf 16GOGO = gogo 17ROOT = $(PWD)/../../.. 18TMPNAME = tmpgen 19TMPDIR = $(PWD)/$(TMPNAME) 20 21# List of standard protoc options 22PROTOC_OPTS = plugins=grpc 23 24# These flags manage mapping the google-standard protobuf types (e.g., Timestamp) 25# into the annotated versions supplied with Gogo. The trailing `,` matters. 26GOGO_OPTS = Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types, 27 28define protos_to_gogo_targets 29$(foreach proto,$(1),$(GOLANG)-$(GOGO)-$(basename $(proto))) 30endef 31 32define protos_to_protobuf_targets 33$(foreach proto,$(1),$(GOLANG)-$(PBUF)-$(basename $(proto))) 34endef 35 36define gen_gogo_target 37$(call gen_protoc_target,$(1),$(GOLANG)/$(GOGO)/$(basename $(1))pb/$(basename $(1)).pb.go,$(GOGO),--gogofaster_out=$(GOGO_OPTS)$(PROTOC_OPTS)) 38endef 39 40define gen_protobuf_target 41$(call gen_protoc_target,$(1),$(GOLANG)/$(PBUF)/$(basename $(1))pb/$(basename $(1)).pb.go,$(PBUF),--go_out=$(PROTOC_OPTS)) 42endef 43 44define protoc_targets_to_link_targets 45$(foreach target,$(1),$(target)-link) 46endef 47 48define gen_protoc_link 49@mkdir -p "$(subst -,/,$(subst -link,,$(2)))pb" 50@echo "// DO NOT EDIT; THIS FILE IS AUTOGENERATED FROM ../../../$(1)" > $(subst -,/,$(subst -link,,$(2)))pb/$(1) 51@sed -E 's@import "github.com/lightstep/([^/]+)/(.*).proto"@import "github.com/lightstep/\1/$(GOLANG)/$(3)/\2pb/\2.proto"@g' < $(1) >> $(subst -,/,$(subst -link,,$(2)))pb/$(1) 52endef 53 54# $(1) = .proto input 55# $(2) = .pb.go output 56# $(3) = gogo or protobuf 57# $(4) = protoc-output spec 58# 59# Note: the --proto_path include "." below references the 60# docker image's $(ROOT)/src. /input is mapped to the 61# host's $(ROOT)/src. 62define gen_protoc_target 63 @echo compiling $(1) [$(3)] 64 @mkdir -p $(TMPDIR) 65 @sed -E 's@import "github.com/lightstep/([^/]+)/(.*).proto"@import "github.com/lightstep/\1/$(GOLANG)/$(3)/\2pb/\2.proto"@g' < $(1) > $(TMPDIR)/$(1) 66 @docker run --rm \ 67 -v $(ROOT):/input:ro \ 68 -v $(TMPDIR):/output \ 69 lightstep/gogoprotoc:latest \ 70 protoc \ 71 -I./github.com/google/googleapis \ 72 $(4):/output \ 73 --proto_path=/input:. \ 74 /input/$(PKG_PREFIX)/$(TMPNAME)/$(1) 75 @mkdir -p $(GOLANG)/$(3)/$(basename $(1))pb/$(basename $(1))pbfakes 76 @sed 's@package $(basename $(1))pb@package $(basename $(1))pb // import "$(PKG_PREFIX)/golang/$(3)/$(basename $(1))pb"@' < $(TMPDIR)/$(PKG_PREFIX)/$(TMPNAME)/$(basename $(1)).pb.go > $(GOLANG)/$(3)/$(basename $(1))pb/$(basename $(1)).pb.go 77 @rm $(TMPDIR)/$(PKG_PREFIX)/$(TMPNAME)/$(basename $(1)).pb.go 78 @rm $(TMPDIR)/$(1) 79endef 80 81define clean_protoc_targets 82 @rm -rf $(foreach target,$(1),$(subst -,/,$(target)pb)) 83endef 84 85# generate_fake: runs counterfeiter in docker container to generate fake classes 86# $(1) output file path 87# $(2) input file path 88# $(3) class name 89define generate_fake 90 @docker run --rm \ 91 -v $(ROOT):/usergo/src \ 92 lightstep/gobuild:latest \ 93 /bin/bash -c "cd /usergo/src/$(PKG_PREFIX) && counterfeiter -o $(1) $(2) $(3)" 94endef 95