#############################################################################
# build a wsltty installer package:
# configure ver=... and minttyver= in this makefile
# make targets:
# make [all]	build a distributable installer (default)
# make pkg	build an installer, bypassing the system checks
# make build	build the software (no installer)
# make install	install wsltty locally from build (no installer needed)
# make wsltty	build the software, using the local copy of mintty


# wsltty release
ver=3.4.4

# wsltty appx release - must have 4 parts!
verx=3.4.4.0


##############################
# mintty release version

minttyver=3.4.4

##############################

# wslbridge2 repository
repo=Biswa96/wslbridge2

# wslbridge2 master release version
wslbridgever=0.6

# wslbridge2 latest version
#archive=master
#wslbridgedir=wslbridge2-$(archive)

# wslbridge2 branch or commit version (from fix-window-resize branch) and dir
#commit=70e0dcea1db122d076ce1578f2a45280cc92d09f
#commit=8b6dd7ee2b3102d72248990c21764c5cf86c6612
#archive=$(commit)
#wslbridgedir=wslbridge2-$(archive)


# wslbridge2 fork repository and version
#repo=mintty/wslbridge2
#wslbridgever=0.5.1


# wslbridge2 release or fork archive and dir
archive=v$(wslbridgever)
wslbridgedir=wslbridge2-$(wslbridgever)


##############################

# mintty branch or commit version
#minttyver=master

# wslbridge branch or commit to build from source;
wslbridge=wslbridge-frontend wslbridge-backend

##############################
# build backend on a musl-libc-based distribution
# (reportedly not needed anymore but untested)
BuildDistr=-d Alpine

##############################
# Windows SDK version for appx
WINSDKKEY=/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Microsoft/.NET Framework Platform/Setup/Multi-Targeting Pack
WINSDKVER=`regtool list '$(WINSDKKEY)' | sed -e '$$ q' -e d`

#############################################################################
# default target

all:	all-$(notdir $(CURDIR))

all-wsltty:	check pkg

all-wsltty.appx:	appx

#############################################################################
# target checking and some defs

TARGET := $(shell $(CC) -dumpmachine)

ifeq ($(TARGET), i686-pc-cygwin)
  sys := cygwin32
else ifeq ($(TARGET), x86_64-pc-cygwin)
  sys := cygwin64
else ifeq ($(TARGET), i686-pc-msys)
  sys := msys32
else ifeq ($(TARGET), x86_64-pc-msys)
  sys := msys64
else
  $(error Target '$(TARGET)' not supported)
endif

wget=curl -R -L --connect-timeout 55 -O
wgeto=curl -R -L --connect-timeout 55

#############################################################################
# system check:
# - ensure the path name drag-and-drop adaptation works (-> Cygwin, not MSYS)
# - 64 Bit (x86_64) for more stable invocation (avoid fork issues)

arch:=$(shell uname -m)

check:	# checkarch
	echo Building for:
	echo $(arch) | grep .
	# checking suitable host environment; run `make pkg` to bypass
	# check cygwin (vs msys) for proper drag-and-drop paths:
	uname | grep CYGWIN

checkarch:
	# check 32 bit to ensure 32-Bit Windows support, just in case:
	#uname -m | grep i686
	# check 64 bit to provide 64-Bit stability support:
	#uname -m | grep x86_64

#############################################################################
# patch version information for appx package configuration

fix-verx:
	echo patching $(WINSDKVER) into Launcher config
	cd Launcher; sed -i~ -e "/<supportedRuntime / s,Version=v[.0-9]*,Version=$(WINSDKVER)," app.config
	echo patched app.config
	cd Launcher; sed -i~ -e "/<TargetFrameworkVersion>/ s,v[.0-9]*,$(WINSDKVER)," Launcher.csproj
	echo patched Launcher.csproj
	echo patching $(verx) into app config
	sed -i~ -e '/<Identity / s,Version="[.0-9]*",Version="$(verx)",' AppxManifest.xml
	echo patched AppxManifest.xml

#############################################################################
# clear binaries

clean:
	rm -fr $(wslbridgedir)/bin
	rm -fr bin

#############################################################################
# generation

wslbridge:	$(wslbridge)

$(wslbridgedir).zip:
	$(wgeto) https://github.com/$(repo)/archive/$(archive).zip -o $(wslbridgedir).zip

wslbridge-source:	$(wslbridgedir).zip
	unzip -o $(wslbridgedir).zip
	cp $(wslbridgedir)/LICENSE LICENSE.wslbridge2
	# patch
	cd $(wslbridgedir); patch -p1 < ../0001-notify-size-change-inband.patch

wslbridge-frontend:	wslbridge-source
	echo ------------- Compiling wslbridge2 frontend
	mkdir -p bin
	# frontend build
	cd $(wslbridgedir)/src; make -f Makefile.frontend RELEASE=1
	# extract binaries
	cp $(wslbridgedir)/bin/wslbridge2.exe bin/

windir=$(shell cd "${WINDIR}"; pwd)

wslbridge-backend:	wslbridge-source
	echo ------------- Compiling wslbridge2 backend
	#uname -m | grep x86_64
	mkdir -p bin
	# provide dependencies for backend build
	PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe -u root $(BuildDistr) $(shell env | grep http_proxy=) apk add make g++ linux-headers < /dev/null
	# invoke backend build
	cd $(wslbridgedir)/src; PATH="$(windir)/Sysnative:${PATH}" cmd /C wsl.exe $(BuildDistr) make -f Makefile.backend RELEASE=1 < /dev/null
	# extract binaries
	cp $(wslbridgedir)/bin/wslbridge2-backend bin/

mintty-get:
	$(wgeto) https://github.com/mintty/mintty/archive/$(minttyver).zip -o mintty-$(minttyver).zip
	unzip -o mintty-$(minttyver).zip
	cp mintty-$(minttyver)/icon/terminal.ico mintty.ico

wslbuild=LDFLAGS="-static -static-libgcc -s"
appxbuild=$(wslbuild) CCOPT=-DWSLTTY_APPX
wslversion=VERSION_SUFFIX="– wsltty $(ver)" WSLTTY_VERSION="$(ver)"
appxversion=VERSION_SUFFIX="– wsltty appx $(verx)" WSLTTY_VERSION="$(verx)"

mintty-build:
	# ensure rebuild of version-specific check and message
	rm -f mintty-$(minttyver)/bin/*/windialog.o
	# build mintty
	cd mintty-$(minttyver)/src; make $(wslbuild) $(wslversion)
	mkdir -p bin
	cp mintty-$(minttyver)/bin/mintty.exe bin/
	strip bin/mintty.exe

mintty-build-appx:
	# ensure rebuild of version-specific check and message
	rm -f mintty-$(minttyver)/bin/*/windialog.o
	# build mintty
	cd mintty-$(minttyver)/src; make $(appxbuild) $(appxversion)
	mkdir -p bin
	cp mintty-$(minttyver)/bin/mintty.exe bin/
	strip bin/mintty.exe

mintty-pkg:
	cp mintty-$(minttyver)/LICENSE LICENSE.mintty
	cd mintty-$(minttyver)/lang; zoo a lang *.po; mv lang.zoo ../../
	cd mintty-$(minttyver)/themes; zoo a themes *[!~]; mv themes.zoo ../../
	cd mintty-$(minttyver)/sounds; zoo a sounds *.wav *.WAV *.md; mv sounds.zoo ../../
	# add charnames.txt to support "Character Info"
	cd mintty-$(minttyver)/src; sh ./mknames
	cp mintty-$(minttyver)/src/charnames.txt .

mintty-appx:
	mkdir -p usr/share/mintty
	cd usr/share/mintty; mkdir -p lang themes sounds info
	cp mintty-$(minttyver)/lang/*.po usr/share/mintty/lang/
	cp mintty-$(minttyver)/themes/*[!~] usr/share/mintty/themes/
	cp mintty-$(minttyver)/sounds/*.wav usr/share/mintty/sounds/
	cp mintty-$(minttyver)/sounds/*.WAV usr/share/mintty/sounds/
	# add charnames.txt to support "Character Info"
	cd mintty-$(minttyver)/src; sh ./mknames
	cp mintty-$(minttyver)/src/charnames.txt usr/share/mintty/info/

cygwin:	# mkshortcutexe
	mkdir -p bin
	cp /bin/cygwin1.dll bin/
	cp /bin/cygwin-console-helper.exe bin/
	cp /bin/dash.exe bin/
	cp /bin/regtool.exe bin/
	cp /bin/zoo.exe bin/

mkshortcutexe:	bin/mkshortcut.exe

bin/mkshortcut.exe:	mkshortcut.c
	echo mksh
	gcc -o bin/mkshortcut mkshortcut.c -lpopt -lole32 /usr/lib/w32api/libuuid.a
	cp /bin/cygpopt-0.dll bin/
	cp /bin/cygiconv-2.dll bin/
	cp /bin/cygintl-8.dll bin/

appx-bin:
	mkdir -p bin
	cp /bin/cygwin1.dll bin/
	cp /bin/cygwin-console-helper.exe bin/

CAB=wsltty-$(ver)-$(arch)

copcab:	ver
	mkdir -p $(CAB)
	cp bin/cygwin1.dll $(CAB)/
	cp bin/cygwin-console-helper.exe $(CAB)/
	cp bin/dash.exe $(CAB)/
	cp bin/regtool.exe $(CAB)/
	cp bin/mintty.exe $(CAB)/
	cp bin/zoo.exe $(CAB)/
	cp lang.zoo $(CAB)/
	cp themes.zoo $(CAB)/
	cp sounds.zoo $(CAB)/
	cp charnames.txt $(CAB)/
	cp bin/wslbridge2.exe $(CAB)/
	cp bin/wslbridge2-backend $(CAB)/
	cp mkshortcut.vbs $(CAB)/
	#cp bin/mkshortcut.exe $(CAB)/
	#cp bin/cygpopt-0.dll $(CAB)/
	#cp bin/cygiconv-2.dll $(CAB)/
	#cp bin/cygintl-8.dll $(CAB)/
	cp LICENSE.* $(CAB)/
	cp VERSION $(CAB)/
	cp *.lnk $(CAB)/
	cp *.ico $(CAB)/
	cp *.url $(CAB)/
	cp *.bat $(CAB)/
	cp config-distros.sh $(CAB)/
	cp mkshortcut.vbs $(CAB)/

cop:	copcab
	mkdir -p rel
	cp -fl $(CAB)/* rel/

installer:	cop
	# prepare build of installer
	rm -f rel/$(CAB)-install.exe
	sed -e "s,%version%,$(ver)," -e "s,%arch%,$(arch)," makewinx.cfg > rel/wsltty.SED
	# build installer
	cd rel; iexpress /n wsltty.SED
	# build cab archive
	lcab -r $(CAB) rel/$(CAB).cab

install:	cop installbat

installbat:
	cd rel; cmd /C install

ver:
	echo $(ver) > VERSION

mintty:	mintty-get mintty-build

mintty-usr:	mintty-get mintty-appx

# local wsltty build target:
wsltty:	wslbridge cygwin mintty-build mintty-pkg

# build software without installer:
build:	wslbridge cygwin mintty-get mintty-build mintty-pkg

# standalone wsltty package build target:
pkg:	wslbridge cygwin mintty-get mintty-build mintty-pkg installer

# appx package contents target:
wsltty-appx:	wslbridge appx-bin mintty-get mintty-build-appx mintty-appx

# appx package target:
appx:	wsltty-appx fix-verx
	sh ./build.sh

#############################################################################
# end