CXX      ?= g++
WINDRES  ?= windres
COMMON_FLAGS := -std=c++17 -Wall -Wextra -Wpedantic -DUNICODE -D_UNICODE -finput-charset=UTF-8 -Isrc
RELEASE_CXXFLAGS := -Os -DNDEBUG -ffunction-sections -fdata-sections -fno-ident
RELEASE_LDFLAGS  := -Wl,--gc-sections -Wl,--strip-all -static-libgcc -static-libstdc++
CXXFLAGS ?= $(COMMON_FLAGS) $(RELEASE_CXXFLAGS)
LDFLAGS  ?= $(RELEASE_LDFLAGS)

.PHONY: all tools studio clean rebuild

all: build tools

tools: installer_stub.exe uninstaller.exe minisetup-builder.exe minisetup-studio.exe

build: source/build

source/build:
	@mkdir -p source/build

source/build/installer_res.o: source/resource/installer.rc source/resource/installer.manifest source/resource/installer.ico | source/build
	$(WINDRES) -DUNICODE -D_UNICODE source/resource/installer.rc -O coff -o $@

source/build/uninstaller_res.o: source/resource/uninstaller.rc source/resource/uninstaller.manifest source/resource/uninstaller.ico | source/build
	$(WINDRES) -DUNICODE -D_UNICODE source/resource/uninstaller.rc -O coff -o $@

source/build/studio_res.o: source/resource/studio.rc source/resource/studio.manifest source/resource/studio.ico | source/build
	$(WINDRES) -DUNICODE -D_UNICODE source/resource/studio.rc -O coff -o $@

installer_stub.exe: source/installer.cpp source/include/common.hpp source/include/ui_theme.hpp source/include/password_crypto.hpp source/include/i18n.hpp source/build/installer_res.o | source/build
	$(CXX) $(CXXFLAGS) -municode -mwindows source/installer.cpp source/build/installer_res.o -o $@ $(LDFLAGS) -lbcrypt -lgdiplus -lsetupapi -lcomctl32 -lshell32 -lole32 -luuid -ladvapi32 -lgdi32 -lwinmm

uninstaller.exe: source/uninstaller.cpp source/include/common.hpp source/include/ui_theme.hpp source/include/i18n.hpp source/build/uninstaller_res.o | source/build
	$(CXX) $(CXXFLAGS) -municode -mwindows source/uninstaller.cpp source/build/uninstaller_res.o -o $@ $(LDFLAGS) -lgdiplus -lshell32 -ladvapi32

minisetup-studio.exe: source/studio.cpp source/include/common.hpp source/include/i18n.hpp source/build/studio_res.o | source/build
	$(CXX) $(CXXFLAGS) -municode -mwindows source/studio.cpp source/build/studio_res.o -o $@ $(LDFLAGS) -lgdiplus -lcomctl32 -lcomdlg32 -lshell32 -lole32 -luuid

studio: minisetup-studio.exe
	@echo MiniSetup Studio: minisetup-studio.exe

minisetup-builder.exe: source/builder.cpp source/include/common.hpp source/include/password_crypto.hpp | source/build
	$(CXX) $(CXXFLAGS) -municode source/builder.cpp -o $@ $(LDFLAGS) -lbcrypt

clean:
	@rm -rf dist package_work source/build *.exe

rebuild: clean build tools
