# Simple Makefile for MSYS2 / MinGW-w64 (mingw64)
# Builds usb_bandwidth_test.exe and usb_bandwidth_test.dll into ./build

CXX ?= g++
CXXFLAGS ?= -std=c++11 -O2 -Wall
LDFLAGS ?= -lusb-1.0

OUTDIR := build

# usb30 variant (used by Python as preferred DLL)
EXE30 := $(OUTDIR)/usb30_bw_test.exe
DLL30 := $(OUTDIR)/usb30_bw_test.dll
EXE30_SRC := usb30_bw_test.cpp
DLL30_SRC := usb30_bw_test.cpp

# If your MSYS2 is installed elsewhere, set MSYS2_ROOT when invoking make, e.g.
# make MSYS2_ROOT=D:/msys64
# default to /c/msys64 which is common in MSYS2 mingw64 shell
MSYS2_ROOT ?= /d/msys64

# Prefer a local libusb folder if present (e.g. ./libusb-1.0 or ./libusb-1.0.27)
ifneq (,$(wildcard ./libusb/include/libusb.h))
LIBUSB_LOCAL = ./libusb
else ifneq (,$(wildcard ./libusb-1.0.27/include/libusb.h))
LIBUSB_LOCAL = ./libusb-1.0.27
else
LIBUSB_LOCAL =
endif

ifneq ($(LIBUSB_LOCAL),)
CXXFLAGS += -I$(LIBUSB_LOCAL)/include
LDFLAGS += -L$(LIBUSB_LOCAL)/lib
endif

.PHONY: all clean


all: $(OUTDIR) $(EXE30) $(DLL30) copy_runtime

$(OUTDIR):
	mkdir -p $(OUTDIR)


# Build usb30_bw_test EXE/DLL (both use same source for exe/dll)
$(EXE30): $(EXE30_SRC) | $(OUTDIR)
	$(CXX) $(CXXFLAGS) $(EXE30_SRC) -o $(EXE30) $(LDFLAGS)

$(DLL30): $(DLL30_SRC) | $(OUTDIR)
	$(CXX) -shared $(CXXFLAGS) $(DLL30_SRC) -o $(DLL30) $(LDFLAGS)

# Copy runtime DLLs from MSYS2 mingw64 (adjust MSYS2_ROOT if necessary)
copy_runtime:
	# If a local libusb exists in the project, copy it first
	cp ./libusb-1.0.dll $(OUTDIR) 2>/dev/null || true; \

	# Copy MinGW runtime DLLs from likely MSYS2 locations
	if [ -d "$(MSYS2_ROOT)/mingw64/bin" ]; then \
		cp "$(MSYS2_ROOT)/mingw64/bin/libstdc++-6.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "$(MSYS2_ROOT)/mingw64/bin/libgcc_s_seh-1.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "$(MSYS2_ROOT)/mingw64/bin/libwinpthread-1.dll" $(OUTDIR) 2>/dev/null || true; \
	elif [ -d "/c/msys64/mingw64/bin" ]; then \
		cp "/c/msys64/mingw64/bin/libstdc++-6.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "/c/msys64/mingw64/bin/libgcc_s_seh-1.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "/c/msys64/mingw64/bin/libwinpthread-1.dll" $(OUTDIR) 2>/dev/null || true; \
	elif [ -d "/d/msys64/mingw64/bin" ]; then \
		cp "/d/msys64/mingw64/bin/libstdc++-6.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "/d/msys64/mingw64/bin/libgcc_s_seh-1.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "/d/msys64/mingw64/bin/libwinpthread-1.dll" $(OUTDIR) 2>/dev/null || true; \
	elif [ -d "C:/msys64/mingw64/bin" ]; then \
		cp "C:/msys64/mingw64/bin/libstdc++-6.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "C:/msys64/mingw64/bin/libgcc_s_seh-1.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "C:/msys64/mingw64/bin/libwinpthread-1.dll" $(OUTDIR) 2>/dev/null || true; \
	elif [ -d "D:/msys64/mingw64/bin" ]; then \
		cp "D:/msys64/mingw64/bin/libstdc++-6.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "D:/msys64/mingw64/bin/libgcc_s_seh-1.dll" $(OUTDIR) 2>/dev/null || true; \
		cp "D:/msys64/mingw64/bin/libwinpthread-1.dll" $(OUTDIR) 2>/dev/null || true; \
	fi

clean:
	rm -rf $(OUTDIR)
