CC := i686-w64-mingw32-gcc
CC64 := x86_64-w64-mingw32-gcc
HOST_CC ?= cc
CFLAGS ?= -O2 -g0 -std=gnu11 -Wall -Wextra -Werror -DWIN32_LEAN_AND_MEAN
LDFLAGS ?= -shared -static-libgcc -Wl,--no-insert-timestamp

all: d3d9.dll d3d9-x64.dll

NATIVE_CXX ?= g++
NATIVE_PACKAGES := gstreamer-1.0 gstreamer-webrtc-1.0 gstreamer-sdp-1.0 \
	libsoup-3.0 json-glib-1.0 x11 xfixes xtst zlib libzstd libwebp
NATIVE_CXXFLAGS ?= -O3 -g0 -std=c++20 -Wall -Wextra -Werror -pthread \
	-DGST_USE_UNSTABLE_API

d3d9.dll: d3d9_proxy.c w3cs_quality.c w3cs_quality.h w3cs_packed_position.c w3cs_packed_position.h w3cs_rain_quad.c w3cs_rain_quad.h w3cs_compact_draw.c w3cs_compact_draw.h w3cs_protocol.h w3cs_ring.h d3d9.def
	$(CC) $(CFLAGS) -o $@ d3d9_proxy.c w3cs_quality.c w3cs_packed_position.c w3cs_rain_quad.c w3cs_compact_draw.c d3d9.def $(LDFLAGS) -lkernel32

d3d9-x64.dll: d3d9_proxy.c w3cs_quality.c w3cs_quality.h w3cs_packed_position.c w3cs_packed_position.h w3cs_rain_quad.c w3cs_rain_quad.h w3cs_compact_draw.c w3cs_compact_draw.h w3cs_protocol.h w3cs_ring.h d3d9.def
	$(CC64) $(CFLAGS) -o $@ d3d9_proxy.c w3cs_quality.c w3cs_packed_position.c w3cs_rain_quad.c w3cs_compact_draw.c d3d9.def $(LDFLAGS) -lkernel32

w3cs-packed-position-test: w3cs_packed_position.c w3cs_packed_position.h w3cs_packed_position_test.c
	$(HOST_CC) -O2 -std=c11 -Wall -Wextra -Werror \
		w3cs_packed_position.c w3cs_packed_position_test.c -o $@

w3cs-compact-draw-test: w3cs_compact_draw.c w3cs_compact_draw.h w3cs_compact_draw_test.c
	$(HOST_CC) -O2 -std=c11 -Wall -Wextra -Werror \
		w3cs_compact_draw.c w3cs_compact_draw_test.c -o $@

w3cs-rain-quad-test: w3cs_rain_quad.c w3cs_rain_quad.h w3cs_rain_quad_test.c
	$(HOST_CC) -O2 -std=c11 -Wall -Wextra -Werror \
		w3cs_rain_quad.c w3cs_rain_quad_test.c -lm -o $@

w3cs-quality-test: w3cs_quality.c w3cs_quality.h w3cs_quality_test.c
	$(HOST_CC) -O2 -std=c11 -Wall -Wextra -Werror \
		w3cs_quality.c w3cs_quality_test.c -lm -o $@

w3cs-webrtc-relay: w3cs_webrtc_relay.cpp w3cs_webp_cache.cpp \
		w3cs_webp_cache.h w3cs_protocol.h w3cs_video_rate.h
	$(NATIVE_CXX) $(NATIVE_CXXFLAGS) w3cs_webrtc_relay.cpp \
		w3cs_webp_cache.cpp -o $@ \
		$$(pkg-config --cflags --libs $(NATIVE_PACKAGES))

w3cs-webp-cache-test: w3cs_webp_cache.cpp w3cs_webp_cache.h \
		w3cs_webp_cache_test.cpp
	$(NATIVE_CXX) $(NATIVE_CXXFLAGS) w3cs_webp_cache.cpp \
		w3cs_webp_cache_test.cpp -o $@ \
		$$(pkg-config --cflags --libs glib-2.0 libwebp)

w3cs-video-rate-test: w3cs_video_rate.h w3cs_video_rate_test.cpp
	$(NATIVE_CXX) $(NATIVE_CXXFLAGS) w3cs_video_rate_test.cpp -o $@

w3cs-webrtc-relay-webp-test: w3cs_webrtc_relay_webp_test.cpp \
		w3cs_webrtc_relay.cpp w3cs_webp_cache.cpp w3cs_webp_cache.h \
		w3cs_protocol.h w3cs_video_rate.h
	$(NATIVE_CXX) $(NATIVE_CXXFLAGS) w3cs_webrtc_relay_webp_test.cpp \
		w3cs_webp_cache.cpp -o $@ \
		$$(pkg-config --cflags --libs $(NATIVE_PACKAGES))

test: w3cs-quality-test w3cs-packed-position-test \
		w3cs-compact-draw-test w3cs-rain-quad-test \
		w3cs-webp-cache-test w3cs-video-rate-test \
		w3cs-webrtc-relay-webp-test
	./w3cs-quality-test
	./w3cs-packed-position-test
	./w3cs-compact-draw-test
	./w3cs-rain-quad-test
	./w3cs-webp-cache-test
	./w3cs-video-rate-test
	./w3cs-webrtc-relay-webp-test

clean:
	rm -f d3d9.dll d3d9-x64.dll w3cs-webrtc-relay \
		w3cs-quality-test w3cs-packed-position-test \
		w3cs-compact-draw-test w3cs-rain-quad-test w3cs-webp-cache-test \
		w3cs-video-rate-test w3cs-webrtc-relay-webp-test

.PHONY: all clean test
