/
Makefile
226 lines (176 loc) · 4.7 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
##
## Config
##
BAZEL ?= bazel
BAZEL_ARGS ?=
BAZEL_CMD_ARGS ?=
GO ?= go
GO_TEST_OPTS ?= -test.timeout=20s
GOPATH ?= $(HOME)/go
IBAZEL ?= ibazel --run_output_interactive=false --run_output
USE_IBAZEL ?= false
BAZEL_WRAPPER ?= $(BAZEL)
ifeq ($(USE_IBAZEL),true)
BAZEL_WRAPPER=$(IBAZEL)
endif
##
## Functions
##
bazel = $(BAZEL_WRAPPER) $(BAZEL_ARGS) $(1) $(BAZEL_CMD_ARGS) $(2)
check-program = $(foreach exec,$(1),$(if $(shell PATH="$(PATH)" which $(exec)),,$(error "No $(exec) in PATH")))
##
## General rules
##
.PHONY: install
install: go.install
.PHONY: build
build: bazel.build
.PHONY: run
run: bazel.daemon
.PHONY: dev
dev: ibazel.daemon
.PHONY: test
test: unittest lint tidy
.PHONY: lint
lint: go.lint
.PHONY: autotest
autotest: ibazel.unittest
.PHONY: unittest
unittest: go.unittest
.PHONY: generate
generate: pb.generate
.PHONY: tidy
tidy: pb.generate
$(call check-program, $(GO))
GO111MODULE=on $(GO) mod tidy
.PHONY: docker.build
docker.build: pb.generate
$(call check-program, docker)
docker build -t bertytech/berty .
.PHONY: clean
clean: pb.clean bazel.clean
rm -rf vendor/
.PHONY: fclean
fclean: clean bazel.fclean
.PHONY: re
re: clean build
##
## Go rules (without bazel)
##
.PHONY: go.lint
go.lint: pb.generate
$(call check-program, golangci-lint)
golangci-lint run --timeout=120s --verbose ./...
.PHONY: nobazel.unittest
go.unittest: pb.generate
$(call check-program, $(GO))
GO111MODULE=on $(GO) test $(GO_TEST_OPTS) -cover -coverprofile=coverage.txt -covermode=atomic -race ./...
.PHONY: go.install
go.install: pb.generate
$(call check-program, $(GO))
GO111MODULE=on $(GO) install -v ./cmd/...
##
## Bazel rules
##
SAMPLE_GAZELLE_GENERATED_FILE ?= pkg/bertyprotocol/BUILD.bazel # should be the path of a git-ignored bazel-generated file
VENDOR_BAZEL_OVERRIDEN_FILES = vendor/github.com/libp2p/go-openssl/BUILD.bazel
.PHONY: bazel.lint
bazel.lint: pb.generate
$(call check-program, $(BAZEL))
$(BAZEL_WRAPPER) $(BAZEL_ARGS) run //:golangcilint
.PHONY: bazel.build
bazel.build: bazel.generate
$(call check-program, $(BAZEL))
$(call bazel, build, //...)
.PHONY: bazel.daemon
bazel.daemon: bazel.generate
$(call check-program, $(BAZEL))
$(call bazel, run, //cmd/berty -- daemon)
.PHONY: bazel.banner
bazel.banner: bazel.generate
$(call check-program, $(BAZEL))
$(call bazel, run, //cmd/berty -- banner)
.PHONY: bazel.unittest
bazel.unittest: bazel.generate
$(call check-program, $(BAZEL))
$(call bazel, test, --test_output=streamed //...)
.PHONY: bazel.generate
bazel.generate: pb.generate $(SAMPLE_GAZELLE_GENERATED_FILE)
.PHONY: bazel.clean
bazel.clean:
rm -rf {internal,cmd,pkg}/**/BUILD.bazel
.PHONY: bazel.clean
bazel.fclean:
$(call check-program, $(BAZEL))
$(BAZEL) clean --expunge
rm -rf {internal,cmd,pkg}/**/BUILD.bazel
##
## ibazel
##
.PHONY: ibazel.daemon
ibazel.daemon: bazel.generate
USE_IBAZEL=true make bazel.daemon
.PHONY: ibazel.build
ibazel.build: bazel.generate
USE_IBAZEL=true make bazel.build
.PHONY: ibazel.banner
ibazel.banner: bazel.generate
USE_IBAZEL=true make bazel.banner
.PHONY: ibazel.unittest
ibazel.unittest: bazel.generate
USE_IBAZEL=true make bazel.unittest
##
## Deps
##
vendor/github.com/libp2p/go-openssl/BUILD.bazel: $(abspath ../build/bazel/com_github_libp2p_go_openssl.BUILD.bzl) vendor
cp $< $@
$(SAMPLE_GAZELLE_GENERATED_FILE): WORKSPACE vendor $(VENDOR_BAZEL_OVERRIDEN_FILES)
$(call check-program, $(BAZEL))
$(BAZEL) $(BAZEL_ARGS) run $(BAZEL_CMD_ARGS) //:gazelle
vendor: go.mod
$(call check-program, $(GO))
GO111MODULE=on $(GO) mod vendor
touch $@
##
## Code gen
##
PROTOS_SRC := $(wildcard ../api/*.proto) $(wildcard ../api/go-internal/*.proto)
GEN_SRC := $(PROTOS_SRC) Makefile
GEN_SUM := gen.sum
.PHONY: pb.clean
pb.clean:
rm -f gen.sum $(wildcard */*/*.pb.go) $(wildcard */*/*pb_test.go)
.PHONY: pb.generate
pb.generate: gen.sum
$(GEN_SUM): $(GEN_SRC)
$(call check-program, shasum docker $(GO))
shasum $(GEN_SRC) | sort -k 2 > $(GEN_SUM).tmp
@diff -q $(GEN_SUM).tmp $(GEN_SUM) || ( \
uid=`id -u`; \
set -xe; \
$(GO) mod vendor; \
docker run \
--user="$$uid" \
--volume="$(PWD)/..:/go/src/berty.tech" \
--workdir="/go/src/berty.tech/go" \
--entrypoint="sh" \
--rm \
bertytech/protoc:21 \
-xec 'make generate_local'; \
$(MAKE) tidy \
)
PROTOC_OPTS = -I ../go/vendor/github.com/grpc-ecosystem/grpc-gateway:../api:../go/vendor:/protobuf
.PHONY: generate_local
generate_local:
$(call check-program, goimports shasum protoc)
@set -e; for proto in $(PROTOS_SRC); do ( set -xe; \
protoc $(PROTOC_OPTS) --gogo_out="plugins=grpc:$(GOPATH)/src" "$$proto" \
); done
goimports -w ./pkg ./cmd ./internal
shasum $(GEN_SRC) | sort -k 2 > $(GEN_SUM).tmp
mv $(GEN_SUM).tmp $(GEN_SUM)
##
## Dev
##
print-%:
@echo $*: $($*)