VERSION := 1.0.3
GOFLAGS_L := -ldflags='-s -w -X main.Version=v$(VERSION)' -buildvcs=false -gcflags='-trimpath=$(CURDIR)' -asmflags='-trimpath=$(CURDIR)'
GOFLAGS_W := -ldflags='-s -w -X main.Version=v$(VERSION) -H windowsgui' -buildvcs=false --tags=windowsqtstatic -gcflags='-trimpath=$(CURDIR)' -asmflags='-trimpath=$(CURDIR)'
SHELL := /bin/bash
# Allow overriding DOCKER with e.g. sudo docker
DOCKER := docker
GO := go
MIQT_UIC := miqt-uic
MIQT_RCC := miqt-rcc
GO_WINRES := go-winres
SOURCES := $(wildcard *.go *.ui *.qrc) resources.go resources.rcc mainwindow_ui.go itemwindow_ui.go rsrc_windows_amd64.syso

.PHONY: all
all: build/qbolt build/qbolt.exe
	
.PHONY: dist
dist: build/qbolt-${VERSION}-windows-x86_64.zip build/qbolt-${VERSION}-debian12-x86_64.tar.xz

.PHONY: clean
clean:
	rm -f qbolt
	rm -rf build
	mkdir -p build
	touch build/.create_dir
	rm -f windows-manifest.json
	rm -f rsrc_windows_amd64.syso
	rm -f resources.go
	rm -f resources.rcc
	
# Generated files
	
resources.rcc resources.go: resources.qrc
	$(MIQT_RCC) -Qt6 -Input resources.qrc
	
mainwindow_ui.go: mainwindow.ui
	$(MIQT_UIC) -Qt6 -InFile mainwindow.ui -OutFile mainwindow_ui.go
	# workaround upstream issue https://github.com/mappu/miqt/issues/201
	sed -i '/SetObjectName/d' mainwindow_ui.go
	# workaround upstream issue https://github.com/mappu/miqt/issues/202
	sed -i 's/menuFile.QWidget.AddAction.ui.menuConvert/menuFile.AddMenu(ui.menuConvert/' mainwindow_ui.go

itemwindow_ui.go: itemwindow.ui
	$(MIQT_UIC) -Qt6 -InFile itemwindow.ui -OutFile itemwindow_ui.go
	sed -i '/SetObjectName/d' itemwindow_ui.go
	
windows-manifest.json: windows-manifest.template.json Makefile
	cat windows-manifest.template.json | sed -re 's_%VERSION%_$(VERSION)_' > windows-manifest.json
	
rsrc_windows_amd64.syso: windows-manifest.json
	$(GO_WINRES) make --in windows-manifest.json
	rm rsrc_windows_386.syso || true # we do not build x86_32
	
# Linux release
	
build/qbolt: $(SOURCES)
	CGO_CFLAGS='-Os -ffunction-sections -fdata-sections -flto=auto' CGO_CXXFLAGS='-Os -ffunction-sections -fdata-sections -flto=auto' CGO_LDFLAGS='-Wl,--gc-sections -flto=auto -fwhole-program' $(GO) build $(GOFLAGS_L) -o build/qbolt
	upx build/qbolt

build/qbolt-${VERSION}-debian12-x86_64.tar.xz: build/qbolt
	XZ_OPTS=-9e tar caf build/qbolt-${VERSION}-debian12-x86_64.tar.xz -C build qbolt --owner=0 --group=0
	
# Windows release (docker)

build/qbolt.exe: $(SOURCES)
	# -flto causes internal compiler error
	$(DOCKER) run --rm --id $$(id -u):$$(id -g) -v $(CURDIR):/src -w /src miqt/winqt6static:latest /bin/sh -c "CGO_CFLAGS='-Os -ffunction-sections -fdata-sections' CGO_CXXFLAGS='-Os -ffunction-sections -fdata-sections' CGO_LDFLAGS='-Wl,--gc-sections -fwhole-program' go build $(GOFLAGS_W) -o build/qbolt.exe"
	# Must be stripped before upx'ing - @ref https://github.com/msys2/MSYS2-packages/issues/454
	# However this removes the rsrc, loses the icon and causes a Defender detection
	# strip build/qbolt.exe
	# upx build/qbolt.exe

build/qbolt-${VERSION}-windows-x86_64.zip: build/qbolt.exe
	zip -9 -j build/qbolt-${VERSION}-windows-x86_64.zip build/qbolt.exe