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