# $Id: Makefile.mingw,v 1.36 2024/01/04 01:29:56 nanard Exp $ # Miniupnp project. # http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/ # (c) 2005-2024 Thomas Bernard # This Makefile is made for MinGW # # To cross compile on a *nix machine : # make -f Makefile.mingw DLLWRAP=mingw32-dllwrap CC=mingw32-gcc AR=mingw32-ar WINDRES=mingw32-windres # SRCDIR = src INCDIR = include CC ?= gcc SETUP_COMPILER_FLAG?= DLLWRAP = dllwrap WINDRES = windres SH = /bin/sh ZIP = zip ifeq ($(OS),Windows_NT) RM = del else RM = rm -f endif CFLAGS ?= -Os CFLAGS += -Wall CFLAGS += -W -Wstrict-prototypes CPPFLAGS += -DNDEBUG -D_WIN32_WINNT=0x501 CPPFLAGS += -Iinclude CPPFLAGS += -I. # -liphlpapi is needed for GetBestRoute() and GetIpAddrTable() LDLIBS = -lws2_32 -liphlpapi PYTHON=\utils\python25\python OBJS=miniwget.o minixml.o igd_desc_parse.o minisoap.o \ minissdpc.o \ miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \ connecthostport.o portlistingparse.o receivedata.o \ upnpdev.o addr_is_reserved.o OBJSDLL=$(addprefix dll-, $(OBJS)) winres.o BINARIES=upnpc-static.exe upnpc-shared.exe \ upnp-listdevices-static.exe upnp-listdevices-shared.exe \ miniupnpc.dll libminiupnpc.a \ testminixml.exe ifneq ($(GITHUB_SHA),) COMMITREF=$(GITHUB_SHA) else ifneq ($(CI_COMMIT_SHORT_SHA),) COMMITREF=$(CI_COMMIT_SHORT_SHA) else COMMITREF=$(shell git rev-parse --short HEAD) endif endif DISTFILE:=$(shell echo "miniupnpc-bin-win32-`cat VERSION`-$(COMMITREF).zip") LIBDIR ?= lib # install directories ifeq ($(strip $(PREFIX)),) INSTALLPREFIX ?= /usr else INSTALLPREFIX ?= $(PREFIX) endif .PHONY: all dist clean all: $(BINARIES) dist: $(DISTFILE) clean: $(RM) miniupnpcstrings.h $(RM) *.o $(RM) *.exe $(RM) miniupnpc.dll miniupnpc.lib miniupnpc.dll.def $(RM) libminiupnpc.a $(RM) $(DISTFILE) $(DISTFILE): $(BINARIES) $(ZIP) $@ *.exe *.dll *.lib *.def *.a LICENSE README Changelog.txt libminiupnpc.a: $(OBJS) $(AR) cr $@ $? pythonmodule: libminiupnpc.a $(PYTHON) setupmingw32.py build $(SETUP_COMPILER_FLAG) $(PYTHON) setupmingw32.py install --skip-build $(PYTHON) setupmingw32.py bdist_wheel --skip-build miniupnpc.dll: miniupnpc.def $(OBJSDLL) $(DLLWRAP) -k --driver-name $(CC) \ --def miniupnpc.def \ --output-def miniupnpc.dll.def \ --implib miniupnpc.lib -o $@ \ $(OBJSDLL) $(LDLIBS) miniupnpc.lib: miniupnpc.dll %.o: $(SRCDIR)/%.c $(CC) $(CFLAGS) $(CPPFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $< dll-%.o: $(SRCDIR)/%.c $(CC) $(CFLAGS) $(CPPFLAGS) -DMINIUPNP_EXPORTS -c -o $@ $< %-shared.o: $(SRCDIR)/%.c $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< # --enable-stdcall-fixup %-static.exe: %.o libminiupnpc.a $(CC) -static -o $@ $^ $(LDLIBS) %-shared.exe: %-shared.o miniupnpc.lib $(CC) -o $@ $^ $(LDLIBS) upnp-listdevices-static.exe: listdevices.o libminiupnpc.a $(CC) -static -o $@ $^ $(LDLIBS) upnp-listdevices-shared.exe: listdevices-shared.o miniupnpc.lib $(CC) -o $@ $^ $(LDLIBS) # To make miniupnpcstrings.h from miniupnpcstrings.h.in we either # use a custom executable (if running make under windows) or use # sed (if cross compiling from another platform). ifeq ($(OS),Windows_NT) wingenminiupnpcstrings.exe: wingenminiupnpcstrings.c $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings.exe VERSION .\wingenminiupnpcstrings.exe $< $@ rc_version.h rc_version.h: miniupnpcstrings.h else miniupnpcstrings.h: miniupnpcstrings.h.in VERSION sed 's|OS_STRING ".*"|OS_STRING "Windows/Mingw32"|' $< | \ sed 's|MINIUPNPC_VERSION_STRING ".*"|MINIUPNPC_VERSION_STRING "$(shell cat VERSION)"|' > $@ rc_version.h: VERSION echo "#define LIBMINIUPNPC_DOTTED_VERSION \"$(shell cat VERSION)\"" > $@.tmp echo "#define LIBMINIUPNPC_MAJOR_VERSION $(shell cat VERSION|cut -d. -f1)" >> $@.tmp echo "#define LIBMINIUPNPC_MINOR_VERSION $(shell cat VERSION|cut -d. -f2)" >> $@.tmp echo "#define LIBMINIUPNPC_MICRO_VERSION $(shell cat VERSION|cut -d. -f3)" >> $@.tmp mv $@.tmp $@ endif miniupnpc.pc: VERSION $(RM) $@ echo "prefix=$(INSTALLPREFIX)" >> $@ echo "exec_prefix=\$${prefix}" >> $@ echo "libdir=\$${exec_prefix}/$(LIBDIR)" >> $@ echo "includedir=\$${prefix}/include" >> $@ echo "" >> $@ echo "Name: miniUPnPc" >> $@ echo "Description: UPnP IGD client lightweight library" >> $@ echo "Version: $(shell cat VERSION)" >> $@ echo "Libs: -L\$${libdir} -lminiupnpc" >> $@ echo "Cflags: -I\$${includedir}" >> $@ winres.o: miniupnpc.rc rc_version.h $(WINDRES) -D INTERNAL_NAME=\\\"miniupnpc.dll\\0\\\" -i $< -o $@ testminixml.exe: testminixml.o minixml.o igd_desc_parse.o $(CC) -static -o $@ $^ minixml.o: $(SRCDIR)/minixml.c $(SRCDIR)/minixml.h upnpc.o: include/miniwget.h $(SRCDIR)/minisoap.h include/miniupnpc.h include/igd_desc_parse.h upnpc.o: include/upnpreplyparse.h include/upnpcommands.h include/upnperrors.h miniupnpcstrings.h miniwget.o: $(SRCDIR)/miniwget.c include/miniwget.h miniupnpcstrings.h $(SRCDIR)/connecthostport.h minisoap.o: $(SRCDIR)/minisoap.c $(SRCDIR)/minisoap.h miniupnpcstrings.h miniupnpc.o: $(SRCDIR)/miniupnpc.c include/miniupnpc.h $(SRCDIR)/minisoap.h \ include/miniwget.h $(SRCDIR)/minixml.h $(SRCDIR)/addr_is_reserved.h igd_desc_parse.o: $(SRCDIR)/igd_desc_parse.c include/igd_desc_parse.h upnpreplyparse.o: $(SRCDIR)/upnpreplyparse.c include/upnpreplyparse.h $(SRCDIR)/minixml.h upnpcommands.o: $(SRCDIR)/upnpcommands.c include/upnpcommands.h include/upnpreplyparse.h \ include/miniupnpc.h include/portlistingparse.h minissdpc.o: $(SRCDIR)/minissdpc.c $(SRCDIR)/minissdpc.h $(SRCDIR)/receivedata.h upnpdev.o: $(SRCDIR)/upnpdev.c include/upnpdev.h