]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - Makefile
automatically find DLLs
[xonotic/netradiant.git] / Makefile
index f6b6a850dbd1f9e2b1d3269d4c4442b5e3df1c5a..9df9c7c81190b19ba0fa1bb954d645d0d4648c38 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,10 @@
 include Makefile.conf
 
-CFLAGS     = -MMD -W -Wall -Wcast-align -Wcast-qual -Wno-unused-parameter -fPIC
+ifeq ($(OS),MINGW32_NT-6.0)
+       OS = Win32
+endif
+
+CFLAGS     = -MMD -W -Wall -Wcast-align -Wcast-qual -Wno-unused-parameter
 CPPFLAGS   = 
 LDFLAGS    =
 LIBS       =
@@ -15,7 +19,7 @@ ifneq ($(MINGW),)
        AR = $(MINGWPREFIX)ar
        OS := Win32
        CPPFLAGS += -I$(MINGW)/include -D_inline=inline
-       CFLAGS   += -mms-bitfields
+       CFLAGS   += 
        LDFLAGS  += -L$(MINGW)/lib
 
        CPPFLAGS_GLIB = -I$(MINGW)/include/glib-2.0 -I$(MINGW)/lib/glib-2.0/include
@@ -32,6 +36,8 @@ ifneq ($(MINGW),)
        LIBS_GL = -lopengl32
        CPPFLAGS_DL =
        LIBS_DL =
+       CPPFLAGS_ZLIB =
+       LIBS_ZLIB = -lz
 endif
 
 ifeq ($(BUILD),debug)
@@ -46,38 +52,46 @@ endif
 
 ifeq ($(OS),Linux)
        CPPFLAGS += -DPOSIX -DXWINDOWS -D_LINUX
+       CFLAGS += -fPIC
        LDFLAGS_DLL = -fPIC -ldl
        LIBS = -lpthread
        EXE = x86
        A = a
        DLL = so
+       MWINDOWS =
 else ifeq ($(OS),Win32)
-       CPPFLAGS += -DWIN32 -D_WIN32
-       LDFLAGS_DLL = -fPIC
+       CPPFLAGS += -DWIN32 -D_WIN32 -D_inline=inline
+       CFLAGS += -mms-bitfields
+       LDFLAGS_DLL = --dll -Wl,--add-stdcall-alias
        LIBS = -lws2_32 -luser32 -lgdi32
        EXE = exe
        A = a
        DLL = dll
-else ifeq ($(OS),Darwin)
-$(error Unsupported build OS)
+       MWINDOWS = -mwindows
+       LDD =
+       LIBS_GL ?= -lopengl32
+       LIBS_DL ?= 
+#else ifeq ($(OS),Darwin)
 else
-$(error Unsupported build OS)
+$(error Unsupported build OS: $(OS))
 endif
 
 CPPFLAGS_GLIB ?= `pkg-config glib-2.0 --cflags`
-LIBS_GLIB ?= `pkg-config glib-2.0 --libs-only-l --libs-only-L`
-CPPFLAGS_XML ?= `xml2-config --cflags`
-LIBS_XML ?= `xml2-config --libs`
-CPPFLAGS_PNG ?= `libpng-config --cflags`
-LIBS_PNG ?= `libpng-config --libs`
+LIBS_GLIB ?= `pkg-config glib-2.0 --libs-only-L` `pkg-config glib-2.0 --libs-only-l`
+CPPFLAGS_XML ?= `pkg-config libxml-2.0 --cflags`
+LIBS_XML ?= `pkg-config libxml-2.0 --libs-only-L` `pkg-config libxml-2.0 --libs-only-l`
+CPPFLAGS_PNG ?= `pkg-config libpng --cflags`
+LIBS_PNG ?= `pkg-config libpng --libs-only-L` `pkg-config libpng --libs-only-l`
 CPPFLAGS_GTK ?= `pkg-config gtk+-2.0 --cflags`
-LIBS_GTK ?= `pkg-config gtk+-2.0 --libs-only-l --libs-only-L`
+LIBS_GTK ?= `pkg-config gtk+-2.0 --libs-only-L` `pkg-config gtk+-2.0 --libs-only-l`
 CPPFLAGS_GTKGLEXT ?= `pkg-config gtkglext-1.0 --cflags`
-LIBS_GTKGLEXT ?= `pkg-config gtkglext-1.0 --libs-only-l --libs-only-L`
+LIBS_GTKGLEXT ?= `pkg-config gtkglext-1.0 --libs-only-L` `pkg-config gtkglext-1.0 --libs-only-l`
 CPPFLAGS_GL ?=
 LIBS_GL ?= -lGL
 CPPFLAGS_DL ?=
 LIBS_DL ?= -ldl
+CPPFLAGS_ZLIB =
+LIBS_ZLIB = -lz
 
 RADIANT_ABOUTMSG = Custom build
 
@@ -85,6 +99,7 @@ LDD ?= ldd
 FIND ?= find
 RANLIB ?= ranlib
 AR ?= ar
+OBJDUMP ?= objdump
 MKDIR ?= mkdir -p
 CP ?= cp
 CP_R ?= $(CP) -r
@@ -133,6 +148,7 @@ all: \
        install/qdata3.$(EXE) \
        install/radiant.$(EXE) \
        install-data \
+       install-dll \
 
 .PHONY: clean
 clean:
@@ -141,7 +157,7 @@ clean:
 
 %.$(EXE):
        dir=$@; $(MKDIR) $${dir%/*}
-       $(CXX) -o $@ $^ $(LDFLAGS) $(LIBS_EXTRA) $(LIBS)
+       $(CXX) -o $@ $^ $(LDFLAGS) $(LDFLAGS_EXTRA) $(LIBS_EXTRA) $(LIBS)
        [ -z "$(LDD)" ] || [ -z "`$(LDD) -r $@ 2>&1 >/dev/null $(TEE_STDERR)`" ] || { $(RM) $@; exit 1; }
 
 %.$(A):
@@ -150,7 +166,7 @@ clean:
 
 %.$(DLL):
        dir=$@; $(MKDIR) $${dir%/*}
-       $(CXX) -shared -o $@ $^ $(LDFLAGS) $(LDFLAGS_DLL) $(LIBS_EXTRA) $(LIBS)
+       $(CXX) -shared -o $@ $^ $(LDFLAGS) $(LDFLAGS_DLL) $(LDFLAGS_EXTRA) $(LIBS_EXTRA) $(LIBS)
        [ -z "$(LDD)" ] || [ -z "`$(LDD) -r $@ 2>&1 >/dev/null $(TEE_STDERR)`" ] || { $(RM) $@; exit 1; }
 
 %.o: %.cpp
@@ -309,6 +325,7 @@ install/q3data.$(EXE): \
        libl_net.$(A) \
        libmathlib.$(A) \
 
+install/radiant.$(EXE): LDFLAGS_EXTRA := $(MWINDOWS)
 install/radiant.$(EXE): LIBS_EXTRA := $(LIBS_GL) $(LIBS_DL) $(LIBS_XML) $(LIBS_GLIB) $(LIBS_GTK) $(LIBS_GTKGLEXT)
 install/radiant.$(EXE): CPPFLAGS_EXTRA := $(CPPFLAGS_GL) $(CPPFLAGS_DL) $(CPPFLAGS_XML) $(CPPFLAGS_GLIB) $(CPPFLAGS_GTK) $(CPPFLAGS_GTKGLEXT) -Ilibs -Iinclude
 install/radiant.$(EXE): \
@@ -443,8 +460,8 @@ libxmllib.$(A): \
        libs/xml/xmltextags.o \
        libs/xml/xmlwriter.o \
 
-install/modules/archivezip.$(DLL): LIBS_EXTRA := -lz
-install/modules/archivezip.$(DLL): CPPFLAGS_EXTRA := -Ilibs -Iinclude
+install/modules/archivezip.$(DLL): LIBS_EXTRA := $(LIBS_ZLIB)
+install/modules/archivezip.$(DLL): CPPFLAGS_EXTRA := $(CPPFLAGS_ZLIB) -Ilibs -Iinclude
 install/modules/archivezip.$(DLL): \
        plugins/archivezip/archive.o \
        plugins/archivezip/pkzip.o \
@@ -752,7 +769,7 @@ makeversion:
 .PHONY: install-data
 install-data: makeversion
        $(MKDIR) install/games
-       $(FIND) install/ -name .svn -exec $(RM_R) {} \; -prune; \
+       $(FIND) install/ -name .svn -exec $(RM_R) {} \; -prune
        set -ex; \
        for GAME in games/*; do \
                if [ -d "$$GAME/tools" ]; then \
@@ -768,6 +785,36 @@ install-data: makeversion
        $(CP) include/RADIANT_MAJOR install/
        $(CP) include/RADIANT_MINOR install/
        $(CP_R) setup/data/tools/* install/
-       $(FIND) install/ -name .svn -exec $(RM_R) {} \; -prune; \
+       $(FIND) install/ -name .svn -exec $(RM_R) {} \; -prune
+
+.PHONY: install-dll
+ifeq ($(OS),Win32)
+install-dll:
+       set -e; \
+       dllfetch() \
+       { \
+               dll=$$1; \
+               [ -f "install/$$dll" ] && return; \
+               dllsource=`which $$dll`; \
+               echo "Fetching $$dll..."; \
+               $(CP) $$dllsource install/$$dll; \
+               dlldeps install/$$dll; \
+       }; \
+       dlldeps() \
+       { \
+               echo "Looking for dependencies of $$1..."; \
+               $(OBJDUMP) -p $$1 | grep "DLL Name" | grep -- '-' | while read -r DUMMY1 DUMMY2 dll; do \
+                       dllfetch $$dll; \
+               done; \
+       }; \
+       dllfetch zlib1.dll; \
+       dllfetch intl.dll; \
+       for obj in install/*.$(EXE) install/*/*.$(DLL); do \
+               dlldeps $$obj; \
+       done
+else
+install-dll:
+       echo No DLL inclusion required for this target.
+endif
 
 -include $(shell find . -name \*.d)