#!/usr/bin/env gmake -f

# Делаем бинарник с минимальным количеством всякой дополнительной метаинформации
BUILDOPTS=-ldflags="-s -w" -a -gcflags=all=-l -trimpath

FILELIST=config.go collection.go types.go globals.go lib.go event_parser.go commands.go redis.go settings-db-util.go \
main.go

BINARY=aleesa-jabber-go

# На windows имя бинарника может зависеть не только от платформы, но и от выранной цели, для linux-а суффикс .exe
# не нужен
ifeq ($(OS),Windows_NT)
ifeq ($(strip $(GOOS)),)
BINARY=aleesa-jabber-go.exe
endif
endif

# Если мы собраем бинарь под windows не на windows, то надо сделать бинарь с суффиксом .exe
ifeq ($(strip $(GOOS)),windows)
BINARY=aleesa-jabber-go.exe
endif

# Явно определяем символ новой строки, чтобы избежать неоднозначности на windows
define IFS

endef

# Используем классические таргеты, где первый встречаемый является таргетом по-умолчанию
all: clean build


build:
# Делаем из config.in файл config.go, путём замены v4 на содержимое файла version.txt
#	nlinit=`echo 'IFS="'; echo '"'`; eval "$$nlinit";
	$(file > config.go,$(subst v4,$(file < version.txt),$(file < config.in)))

# GNU Make видимо может вносить какие-то невидимые глазу коррективы в файл, когда читает его в переменную, а затем пишет
# его из этой переменной и поэтому полученный файл надо прогнать через gofmt, чтобы golagci-lint не выёбывался и не
# падал с неизвестной ошибкой
	gofmt -s -w config.go

# Ну и дальше просто билдим бинарник средствами гошки
ifeq ($(OS),Windows_NT)
# вариант с powershell на windows
ifeq ($(SHELL),sh.exe)
	SET CGO_ENABLED=0
	go build ${BUILDOPTS} -o ${BINARY} ${FILELIST}
else
# вариант с jetbrains golang на windows
	CGO_ENABLED=0
	go build ${BUILDOPTS} -o ${BINARY} ${FILELIST}
endif
# вариант с bash/git (windows) и bash (linux)
else
	CGO_ENABLED=0 go build ${BUILDOPTS} -o ${BINARY} ${FILELIST}
endif


# Удаляем автогенерённый config.go и бинарник
clean:
ifeq ($(OS),Windows_NT)
# вариант с jetbrains golang на windows, powershell на windows
ifeq ($(SHELL),sh.exe)
	if exist config.go del /F /S /Q config.go >nul
# git/bash на windows
else
	$(RM) config.go
endif
# bash на linux
else
	$(RM) config.go
endif
# удаляем бинарник средствами go
	go clean


# Служебный таргет, для целей разработки. Обновляет завендоренные либы, брутальным образом.
upgrade:
ifeq ($(OS),Windows_NT)
# вариант с jetbrains golang на windows или powershell на windows
ifeq ($(SHELL),sh.exe)
	if exist vendor del /F /S /Q vendor >nul
# вариант с git/bash на windows
else
	$(RM) -r vendor
endif
# вариант с bash на linux
else
	$(RM) -r vendor
endif
	go get -d -u -t ./...
	go mod tidy
	go mod vendor

# vim: set ft=make noet ai ts=4 sw=4 sts=4:
