From 124009613eb7039be10e161b9c91fd8f9840c5ac Mon Sep 17 00:00:00 2001 From: eleksir Date: Sun, 9 Nov 2025 12:50:10 +0300 Subject: [PATCH] [WIP] Make Makefile crossplatform --- Makefile | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++----- TODO.org | 4 +-- 2 files changed, 95 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 616ae2b..116a683 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,109 @@ #!/usr/bin/env gmake -f GOOPTS=CGO_ENABLED=0 -BUILDOPTS=-ldflags="-s -w" -a -gcflags=all=-l -trimpath +BUILDOPTS=-ldflags="-s -w" -a -gcflags=all=-l -trimpath -buildvcs=false +MYNAME1=aleesa-telegram-go +BINARY1=${MYNAME1} +UNIX_BINARY1=${MYNAME1} +WINDOWS_BINARY1=${MYNAME1}.exe +MYNAME2=settings-migrator +BINARY2=${MYNAME2} +UNIX_BINARY2=${MYNAME2} +WINDOWS_BINARY2=${MYNAME2}.exe +RMCMD=rm -rf + +# On windows binary name can depend not only on platform selected, but target too, we need no .exe suffix for linux bin. +ifeq ($(OS),Windows_NT) +ifdef GOOS +ifeq ($(GOOS),windows) +BINARY1=${WINDOWS_BINARY1} +BINARY2=${WINDOWS_BINARY2} +else # not ifeq ($(GOOS),windows) +BINARY1=${MYNAME1} +BINARY2=${MYNAME2} +endif # ifeq ($(GOOS),windows) +else # not ifdef GOOS +BINARY1=${WINDOWS_BINARY1} +BINARY2=${WINDOWS_BINARY2} +endif # ifdef GOOS +ifeq ($(SHELL), sh.exe) +RMCMD=DEL /Q /F +endif +endif + +# Set newline symbol explicitly to aboud undefined behaviour in windows. +define IFS + +endef + all: clean build + build: - ${GOOPTS} go build ${BUILDOPTS} -o aleesa-telegram-go ./cmd/aleesa-telegram-go +ifeq ($(OS),Windows_NT) +# Looks like on windows gnu make explicitly set SHELL to sh.exe, if it was not set. +ifeq ($(SHELL), sh.exe) +# # Vanilla cmd.exe / powershell. + SET "CGO_ENABLED=0" + go build ${BUILDOPTS} -o ${BINARY1} ./cmd/${MYNAME1} +else ifeq (,$(findstring(Git/usr/bin/sh.exe, $(SHELL)))) +# # git-bash + CGO_ENABLED=0 go build ${BUILDOPTS} -o ${BINARY1} ./cmd/${MYNAME1} +else # not ifeq (,$(findstring(Git/usr/bin/sh.exe, $(SHELL)))) +# # Some other shell. +# # TODO: handle it. + $(info "-- Dunno how to handle this shell: ${SHELL}") +endif # ifeq (,$(findstring(Git/usr/bin/sh.exe, $(SHELL)))) +else # not ($(OS),Windows_NT) + CGO_ENABLED=0 go build ${BUILDOPTS} -o ${BINARY1} ./cmd/${MYNAME1} +endif # ifeq ($(OS),Windows_NT) + clean: - rm -rf aleesa-telegram-go - rm -rf settings-migrator +ifeq ($(OS),Windows_NT) +ifeq ($(SHELL),sh.exe) +# # Vanilla cmd.exe / powershell. + if exist ${WINDOWS_BINARY1} ${RMCMD} ${WINDOWS_BINARY1} + if exist ${UNIX_BINARY1} ${RMCMD} ${UNIX_BINARY1} + if exist ${WINDOWS_BINARY2} ${RMCMD} ${WINDOWS_BINARY2} + if exist ${UNIX_BINARY2} ${RMCMD} ${UNIX_BINARY2} +else # not ifeq ($(SHELL),sh.exe) + ${RMCMD} ./${WINDOWS_BINARY1} + ${RMCMD} ./${UNIX_BINARY1} + ${RMCMD} ./${WINDOWS_BINARY2} + ${RMCMD} ./${UNIX_BINARY2} +endif # ifeq ($(SHELL),sh.exe) +else # not ifeq ($(OS),Windows_NT) + ${RMCMD} ./${UNIX_BINARY1} + ${RMCMD} ./${UNIX_BINARY2} +endif + upgrade: - rm -rf vendor - go get -d -u -t ./... + go get -u ./... go mod tidy go mod vendor -migrator: - ${GOOPTS} go build ${BUILDOPTS} -o settings-migrator ./cmd/settings-migrator + +# Build settings-migrator binary. +${MYNAME2}: clean +ifeq ($(OS),Windows_NT) +# Looks like on windows gnu make explicitly set SHELL to sh.exe, if it was not set. +ifeq ($(SHELL), sh.exe) +# # Vanilla cmd.exe / powershell. + SET "CGO_ENABLED=0" + go build ${BUILDOPTS} -o ${WINDOWS_BINARY2} ./cmd/${MYNAME2} +else ifeq (,$(findstring(Git/usr/bin/sh.exe, $(SHELL)))) +# # git-bash + CGO_ENABLED=0 go build ${BUILDOPTS} -o ${WINDOWS_BINARY2} ./cmd/${MYNAME2} +else # not ifeq (,$(findstring(Git/usr/bin/sh.exe, $(SHELL)))) +# # Some other shell. +# # TODO: handle it. + $(info "-- Dunno how to handle this shell: ${SHELL}") +endif # ifeq (,$(findstring(Git/usr/bin/sh.exe, $(SHELL)))) +else # not ($(OS),Windows_NT) + CGO_ENABLED=0 go build ${BUILDOPTS} -o ${UNIX_BINARY2} ./cmd/${MYNAME2} +endif # ifeq ($(OS),Windows_NT) # vim: set ft=make noet ai ts=4 sw=4 sts=4: diff --git a/TODO.org b/TODO.org index 311b2bd..46f071e 100644 --- a/TODO.org +++ b/TODO.org @@ -66,8 +66,8 @@ - [ ] Написать перловый скрипт, сохраняющий настройки чатов в settings.json - [ ] Написать гошную программу для импорта настроек из settings.json в базу гошного бота -* TODO Усложнить Makefile [0/1] - - [ ] сделать его его кроссплатформенным, по примеру других гошных приложений +* DONE Усложнить Makefile [1/1] + - [X] сделать его его кроссплатформенным, по примеру других гошных приложений # -*- mode: org; -*- # vim: ft=org