NAME_PREFIX = rsp
EXE_TARGETS = exe86
DLL_TARGETS = dll86
ARCH86 = x86
ARCH64 = x64
EXE_NAME86 = $(NAME_PREFIX)-$(ARCH86).exe
EXE_NAME64 = $(NAME_PREFIX)-$(ARCH64).exe
DLL_NAME86 = $(NAME_PREFIX)-$(ARCH86).dll
DLL_NAME64 = $(NAME_PREFIX)-$(ARCH64).dll
EXE_LIBS = -luser32 -lkernel32 -lshell32
FLAGS = -s -Os -Wall -Wextra -Wno-unused-parameter
EXE_FLAGS = $(FLAGS) -mwindows -nodefaultlibs -nostartfiles -nostdlib
EXE_FLAGS86 = $(EXE_FLAGS) -m32 -e__start
EXE_FLAGS64 = $(EXE_FLAGS) -m64 -e_start
DLL_FLAGS = $(FLAGS) -shared -Wl,--kill-at

.PHONY: all clean

all: clean dll exe

allfat: clean dll exefat

clean:
    rd /s /q bin obj

all86: dll86 exe86

all64: dll64 exe64

exe: exe86 exe64

exefat: exe86fat exe64fat

exe86fat: prebuild preexe
    windres -i exe.rc -o obj\exe-$(ARCH86).coff -O coff -F pe-i386
    gcc -o bin\$(EXE_NAME86) exe.c obj\exe-$(ARCH86).coff $(EXE_FLAGS86) $(EXE_LIBS)

exe86: prebuild
    gcc -o bin\$(EXE_NAME86) exe.c $(EXE_FLAGS86) $(EXE_LIBS)
    copy exe.manifest bin\$(EXE_NAME86).manifest

exe64fat: prebuild preexe
    windres -i exe.rc -o obj\exe-$(ARCH64).coff -O coff -F pe-x86-64
    gcc -o bin\$(EXE_NAME64) exe.c obj\exe-$(ARCH64).coff $(EXE_FLAGS64) $(EXE_LIBS)
    
exe64: prebuild
    gcc -o bin\$(EXE_NAME64) exe.c $(EXE_FLAGS64) $(EXE_LIBS)
    copy exe.manifest bin\$(EXE_NAME64).manifest

dll: dll86 dll64

dll86: prebuild
    gcc -m32 -o bin\$(DLL_NAME86) dll.c $(DLL_FLAGS)

dll64: prebuild
    gcc -m64 -o bin\$(DLL_NAME64) dll.c $(DLL_FLAGS)

preexe:
    if not exist obj md obj

prebuild:
    if not exist bin md bin
