1next_version :=  $(shell cat build_version.txt)
2tag := $(shell git describe --exact-match --tags 2>git_describe_error.tmp; rm -f git_describe_error.tmp)
3branch := $(shell git rev-parse --abbrev-ref HEAD)
4commit := $(shell git rev-parse --short=8 HEAD)
5glibc_version := 2.17
6
7ifdef NIGHTLY
8	version := $(next_version)
9	rpm_version := nightly
10	rpm_iteration := 0
11	deb_version := nightly
12	deb_iteration := 0
13	tar_version := nightly
14else ifeq ($(tag),)
15	version := $(next_version)
16	rpm_version := $(version)~$(commit)-0
17	rpm_iteration := 0
18	deb_version := $(version)~$(commit)-0
19	deb_iteration := 0
20	tar_version := $(version)~$(commit)
21else ifneq ($(findstring -rc,$(tag)),)
22	version := $(word 1,$(subst -, ,$(tag)))
23	version := $(version:v%=%)
24	rc := $(word 2,$(subst -, ,$(tag)))
25	rpm_version := $(version)-0.$(rc)
26	rpm_iteration := 0.$(subst rc,,$(rc))
27	deb_version := $(version)~$(rc)-1
28	deb_iteration := 0
29	tar_version := $(version)~$(rc)
30else
31	version := $(tag:v%=%)
32	rpm_version := $(version)-1
33	rpm_iteration := 1
34	deb_version := $(version)-1
35	deb_iteration := 1
36	tar_version := $(version)
37endif
38
39MAKEFLAGS += --no-print-directory
40GOOS ?= $(shell go env GOOS)
41GOARCH ?= $(shell go env GOARCH)
42HOSTGO := env -u GOOS -u GOARCH -u GOARM -- go
43
44LDFLAGS := $(LDFLAGS) -X main.commit=$(commit) -X main.branch=$(branch) -X main.goos=$(GOOS) -X main.goarch=$(GOARCH)
45ifneq ($(tag),)
46	LDFLAGS += -X main.version=$(version)
47endif
48
49# Go built-in race detector works only for 64 bits architectures.
50ifneq ($(GOARCH), 386)
51	race_detector := -race
52endif
53
54
55GOFILES ?= $(shell git ls-files '*.go')
56GOFMT ?= $(shell gofmt -l -s $(filter-out plugins/parsers/influx/machine.go, $(GOFILES)))
57
58prefix ?= /usr/local
59bindir ?= $(prefix)/bin
60sysconfdir ?= $(prefix)/etc
61localstatedir ?= $(prefix)/var
62pkgdir ?= build/dist
63
64.PHONY: all
65all:
66	@$(MAKE) deps
67	@$(MAKE) telegraf
68
69.PHONY: help
70help:
71	@echo 'Targets:'
72	@echo '  all        - download dependencies and compile telegraf binary'
73	@echo '  deps       - download dependencies'
74	@echo '  telegraf   - compile telegraf binary'
75	@echo '  test       - run short unit tests'
76	@echo '  fmt        - format source files'
77	@echo '  tidy       - tidy go modules'
78	@echo '  check-deps - check docs/LICENSE_OF_DEPENDENCIES.md'
79	@echo '  clean      - delete build artifacts'
80	@echo ''
81	@echo 'Package Targets:'
82	@$(foreach dist,$(dists),echo "  $(dist)";)
83
84.PHONY: deps
85deps:
86	go mod download
87
88.PHONY: telegraf
89telegraf:
90	go build -ldflags "$(LDFLAGS)" ./cmd/telegraf
91
92# Used by dockerfile builds
93.PHONY: go-install
94go-install:
95	go install -mod=mod -ldflags "-w -s $(LDFLAGS)" ./cmd/telegraf
96
97.PHONY: test
98test:
99	go test -short $(race_detector) ./...
100
101.PHONY: fmt
102fmt:
103	@gofmt -s -w $(filter-out plugins/parsers/influx/machine.go, $(GOFILES))
104
105.PHONY: fmtcheck
106fmtcheck:
107	@if [ ! -z "$(GOFMT)" ]; then \
108		echo "[ERROR] gofmt has found errors in the following files:"  ; \
109		echo "$(GOFMT)" ; \
110		echo "" ;\
111		echo "Run make fmt to fix them." ; \
112		exit 1 ;\
113	fi
114
115.PHONY: test-windows
116test-windows:
117	go test -short $(race_detector) ./plugins/inputs/ping/...
118	go test -short $(race_detector) ./plugins/inputs/win_perf_counters/...
119	go test -short $(race_detector) ./plugins/inputs/win_services/...
120	go test -short $(race_detector) ./plugins/inputs/procstat/...
121	go test -short $(race_detector) ./plugins/inputs/ntpq/...
122	go test -short $(race_detector) ./plugins/processors/port_name/...
123
124.PHONY: vet
125vet:
126	@echo 'go vet $$(go list ./... | grep -v ./plugins/parsers/influx)'
127	@go vet $$(go list ./... | grep -v ./plugins/parsers/influx) ; if [ $$? -ne 0 ]; then \
128		echo ""; \
129		echo "go vet has found suspicious constructs. Please remediate any reported errors"; \
130		echo "to fix them before submitting code for review."; \
131		exit 1; \
132	fi
133
134.PHONY: tidy
135tidy:
136	go mod verify
137	go mod tidy
138	@if ! git diff --quiet go.mod go.sum; then \
139		echo "please run go mod tidy and check in changes"; \
140		exit 1; \
141	fi
142
143.PHONY: check
144check: fmtcheck vet
145	@$(MAKE) --no-print-directory tidy
146
147.PHONY: test-all
148test-all: fmtcheck vet
149	go test $(race_detector) ./...
150
151.PHONY: check-deps
152check-deps:
153	./scripts/check-deps.sh
154
155.PHONY: clean
156clean:
157	rm -f telegraf
158	rm -f telegraf.exe
159	rm -rf build
160
161.PHONY: docker-image
162docker-image:
163	docker build -f scripts/buster.docker -t "telegraf:$(commit)" .
164
165plugins/parsers/influx/machine.go: plugins/parsers/influx/machine.go.rl
166	ragel -Z -G2 $^ -o $@
167
168.PHONY: plugin-%
169plugin-%:
170	@echo "Starting dev environment for $${$(@)} input plugin..."
171	@docker-compose -f plugins/inputs/$${$(@)}/dev/docker-compose.yml up
172
173.PHONY: ci-1.15
174ci-1.15:
175	docker build -t quay.io/influxdb/telegraf-ci:1.15.2 - < scripts/ci-1.15.docker
176	docker push quay.io/influxdb/telegraf-ci:1.15.2
177
178.PHONY: ci-1.14
179ci-1.14:
180	docker build -t quay.io/influxdb/telegraf-ci:1.14.9 - < scripts/ci-1.14.docker
181	docker push quay.io/influxdb/telegraf-ci:1.14.9
182
183.PHONY: install
184install: $(buildbin)
185	@mkdir -pv $(DESTDIR)$(bindir)
186	@mkdir -pv $(DESTDIR)$(sysconfdir)
187	@mkdir -pv $(DESTDIR)$(localstatedir)
188	@if [ $(GOOS) != "windows" ]; then mkdir -pv $(DESTDIR)$(sysconfdir)/logrotate.d; fi
189	@if [ $(GOOS) != "windows" ]; then mkdir -pv $(DESTDIR)$(localstatedir)/log/telegraf; fi
190	@if [ $(GOOS) != "windows" ]; then mkdir -pv $(DESTDIR)$(sysconfdir)/telegraf/telegraf.d; fi
191	@cp -fv $(buildbin) $(DESTDIR)$(bindir)
192	@if [ $(GOOS) != "windows" ]; then cp -fv etc/telegraf.conf $(DESTDIR)$(sysconfdir)/telegraf/telegraf.conf$(conf_suffix); fi
193	@if [ $(GOOS) != "windows" ]; then cp -fv etc/logrotate.d/telegraf $(DESTDIR)$(sysconfdir)/logrotate.d; fi
194	@if [ $(GOOS) = "windows" ]; then cp -fv etc/telegraf_windows.conf $(DESTDIR)/telegraf.conf; fi
195	@if [ $(GOOS) = "linux" ]; then scripts/check-dynamic-glibc-versions.sh $(buildbin) $(glibc_version); fi
196	@if [ $(GOOS) = "linux" ]; then mkdir -pv $(DESTDIR)$(prefix)/lib/telegraf/scripts; fi
197	@if [ $(GOOS) = "linux" ]; then cp -fv scripts/telegraf.service $(DESTDIR)$(prefix)/lib/telegraf/scripts; fi
198	@if [ $(GOOS) = "linux" ]; then cp -fv scripts/init.sh $(DESTDIR)$(prefix)/lib/telegraf/scripts; fi
199
200# Telegraf build per platform.  This improves package performance by sharing
201# the bin between deb/rpm/tar packages over building directly into the package
202# directory.
203$(buildbin):
204	@mkdir -pv $(dir $@)
205	go build -o $(dir $@) -ldflags "$(LDFLAGS)" ./cmd/telegraf
206
207debs := telegraf_$(deb_version)_amd64.deb
208debs += telegraf_$(deb_version)_arm64.deb
209debs += telegraf_$(deb_version)_armel.deb
210debs += telegraf_$(deb_version)_armhf.deb
211debs += telegraf_$(deb_version)_i386.deb
212debs += telegraf_$(deb_version)_mips.deb
213debs += telegraf_$(deb_version)_mipsel.deb
214debs += telegraf_$(deb_version)_s390x.deb
215
216rpms += telegraf-$(rpm_version).aarch64.rpm
217rpms += telegraf-$(rpm_version).armel.rpm
218rpms += telegraf-$(rpm_version).armv6hl.rpm
219rpms += telegraf-$(rpm_version).i386.rpm
220rpms += telegraf-$(rpm_version).s390x.rpm
221rpms += telegraf-$(rpm_version).x86_64.rpm
222
223tars += telegraf-$(tar_version)_darwin_amd64.tar.gz
224tars += telegraf-$(tar_version)_freebsd_amd64.tar.gz
225tars += telegraf-$(tar_version)_freebsd_i386.tar.gz
226tars += telegraf-$(tar_version)_linux_amd64.tar.gz
227tars += telegraf-$(tar_version)_linux_arm64.tar.gz
228tars += telegraf-$(tar_version)_linux_armel.tar.gz
229tars += telegraf-$(tar_version)_linux_armhf.tar.gz
230tars += telegraf-$(tar_version)_linux_i386.tar.gz
231tars += telegraf-$(tar_version)_linux_mips.tar.gz
232tars += telegraf-$(tar_version)_linux_mipsel.tar.gz
233tars += telegraf-$(tar_version)_linux_s390x.tar.gz
234tars += telegraf-$(tar_version)_static_linux_amd64.tar.gz
235
236zips += telegraf-$(tar_version)_windows_amd64.zip
237zips += telegraf-$(tar_version)_windows_i386.zip
238
239dists := $(debs) $(rpms) $(tars) $(zips)
240
241.PHONY: package
242package: $(dists)
243
244rpm_amd64 := amd64
245rpm_386 := i386
246rpm_s390x := s390x
247rpm_arm5 := armel
248rpm_arm6 := armv6hl
249rpm_arm647 := aarch64
250rpm_arch = $(rpm_$(GOARCH)$(GOARM))
251
252.PHONY: $(rpms)
253$(rpms):
254	@$(MAKE) install
255	@mkdir -p $(pkgdir)
256	fpm --force \
257		--log info \
258		--architecture $(rpm_arch) \
259		--input-type dir \
260		--output-type rpm \
261		--vendor InfluxData \
262		--url https://github.com/influxdata/telegraf \
263		--license MIT \
264		--maintainer support@influxdb.com \
265		--config-files /etc/telegraf/telegraf.conf \
266		--config-files /etc/logrotate.d/telegraf \
267		--after-install scripts/rpm/post-install.sh \
268		--before-install scripts/rpm/pre-install.sh \
269		--after-remove scripts/rpm/post-remove.sh \
270		--description "Plugin-driven server agent for reporting metrics into InfluxDB." \
271		--depends coreutils \
272		--depends shadow-utils \
273		--rpm-posttrans scripts/rpm/post-install.sh \
274		--name telegraf \
275		--version $(version) \
276		--iteration $(rpm_iteration) \
277        --chdir $(DESTDIR) \
278		--package $(pkgdir)/$@
279
280deb_amd64 := amd64
281deb_386 := i386
282deb_s390x := s390x
283deb_arm5 := armel
284deb_arm6 := armhf
285deb_arm647 := arm64
286deb_mips := mips
287deb_mipsle := mipsel
288deb_arch = $(deb_$(GOARCH)$(GOARM))
289
290.PHONY: $(debs)
291$(debs):
292	@$(MAKE) install
293	@mkdir -pv $(pkgdir)
294	fpm --force \
295		--log info \
296		--architecture $(deb_arch) \
297		--input-type dir \
298		--output-type deb \
299		--vendor InfluxData \
300		--url https://github.com/influxdata/telegraf \
301		--license MIT \
302		--maintainer support@influxdb.com \
303		--config-files /etc/telegraf/telegraf.conf.sample \
304		--config-files /etc/logrotate.d/telegraf \
305		--after-install scripts/deb/post-install.sh \
306		--before-install scripts/deb/pre-install.sh \
307		--after-remove scripts/deb/post-remove.sh \
308		--before-remove scripts/deb/pre-remove.sh \
309		--description "Plugin-driven server agent for reporting metrics into InfluxDB." \
310		--name telegraf \
311		--version $(version) \
312		--iteration $(deb_iteration) \
313		--chdir $(DESTDIR) \
314		--package $(pkgdir)/$@
315
316.PHONY: $(zips)
317$(zips):
318	@$(MAKE) install
319	@mkdir -p $(pkgdir)
320	(cd $(dir $(DESTDIR)) && zip -r - ./*) > $(pkgdir)/$@
321
322.PHONY: $(tars)
323$(tars):
324	@$(MAKE) install
325	@mkdir -p $(pkgdir)
326	tar --owner 0 --group 0 -czvf $(pkgdir)/$@ -C $(dir $(DESTDIR)) .
327
328.PHONY: upload-nightly
329upload-nightly:
330	aws s3 sync $(pkgdir) s3://dl.influxdata.com/telegraf/nightlies/ \
331		--exclude "*" \
332		--include "*.tar.gz" \
333		--include "*.deb" \
334		--include "*.rpm" \
335		--include "*.zip" \
336		--acl public-read
337
338%amd64.deb %x86_64.rpm %linux_amd64.tar.gz: export GOOS := linux
339%amd64.deb %x86_64.rpm %linux_amd64.tar.gz: export GOARCH := amd64
340
341%static_linux_amd64.tar.gz: export cgo := -nocgo
342%static_linux_amd64.tar.gz: export CGO_ENABLED := 0
343
344%i386.deb %i386.rpm %linux_i386.tar.gz: export GOOS := linux
345%i386.deb %i386.rpm %linux_i386.tar.gz: export GOARCH := 386
346
347%armel.deb %armel.rpm %linux_armel.tar.gz: export GOOS := linux
348%armel.deb %armel.rpm %linux_armel.tar.gz: export GOARCH := arm
349%armel.deb %armel.rpm %linux_armel.tar.gz: export GOARM := 5
350
351%armhf.deb %armv6hl.rpm %linux_armhf.tar.gz: export GOOS := linux
352%armhf.deb %armv6hl.rpm %linux_armhf.tar.gz: export GOARCH := arm
353%armhf.deb %armv6hl.rpm %linux_armhf.tar.gz: export GOARM := 6
354
355%arm64.deb %aarch64.rpm %linux_arm64.tar.gz: export GOOS := linux
356%arm64.deb %aarch64.rpm %linux_arm64.tar.gz: export GOARCH := arm64
357%arm64.deb %aarch64.rpm %linux_arm64.tar.gz: export GOARM := 7
358
359%mips.deb %linux_mips.tar.gz: export GOOS := linux
360%mips.deb %linux_mips.tar.gz: export GOARCH := mips
361
362%mipsel.deb %linux_mipsel.tar.gz: export GOOS := linux
363%mipsel.deb %linux_mipsel.tar.gz: export GOARCH := mipsle
364
365%s390x.deb %s390x.rpm %linux_s390x.tar.gz: export GOOS := linux
366%s390x.deb %s390x.rpm %linux_s390x.tar.gz: export GOARCH := s390x
367
368%freebsd_amd64.tar.gz: export GOOS := freebsd
369%freebsd_amd64.tar.gz: export GOARCH := amd64
370
371%freebsd_i386.tar.gz: export GOOS := freebsd
372%freebsd_i386.tar.gz: export GOARCH := 386
373
374%windows_amd64.zip: export GOOS := windows
375%windows_amd64.zip: export GOARCH := amd64
376
377%darwin_amd64.tar.gz: export GOOS := darwin
378%darwin_amd64.tar.gz: export GOARCH := amd64
379
380%windows_i386.zip: export GOOS := windows
381%windows_i386.zip: export GOARCH := 386
382
383%windows_i386.zip %windows_amd64.zip: export prefix =
384%windows_i386.zip %windows_amd64.zip: export bindir = $(prefix)
385%windows_i386.zip %windows_amd64.zip: export sysconfdir = $(prefix)
386%windows_i386.zip %windows_amd64.zip: export localstatedir = $(prefix)
387%windows_i386.zip %windows_amd64.zip: export EXEEXT := .exe
388
389%.deb: export pkg := deb
390%.deb: export prefix := /usr
391%.deb: export conf_suffix := .sample
392%.deb: export sysconfdir := /etc
393%.deb: export localstatedir := /var
394%.rpm: export pkg := rpm
395%.rpm: export prefix := /usr
396%.rpm: export sysconfdir := /etc
397%.rpm: export localstatedir := /var
398%.tar.gz: export pkg := tar
399%.tar.gz: export prefix := /usr
400%.tar.gz: export sysconfdir := /etc
401%.tar.gz: export localstatedir := /var
402%.zip: export pkg := zip
403%.zip: export prefix := /
404
405%.deb %.rpm %.tar.gz %.zip: export DESTDIR = build/$(GOOS)-$(GOARCH)$(GOARM)$(cgo)-$(pkg)/telegraf-$(version)
406%.deb %.rpm %.tar.gz %.zip: export buildbin = build/$(GOOS)-$(GOARCH)$(GOARM)$(cgo)/telegraf$(EXEEXT)
407%.deb %.rpm %.tar.gz %.zip: export LDFLAGS = -w -s
408