Merge branch 'gles'
[neverball] / Makefile
index c4635d3..675a247 100644 (file)
--- a/Makefile
+++ b/Makefile
 
-#-------------------------------------------------------------------------------
+#------------------------------------------------------------------------------
 
-#VERSION=1.5.0
-VERSION= $(shell sh scripts/version.sh)
+BUILD := $(shell head -n1 BUILD 2> /dev/null || echo release)
 
-ifeq ($(VERSION),)
-    $(error Failed to obtain version for this build)
+ifeq ($(BUILD),release)
+    VERSION := 1.5.5
+else
+    VERSION := $(shell sh scripts/version.sh)
+    ifeq ($(VERSION),unknown)
+        VERSION := 1.5.5-dev
+    endif
 endif
 
+$(info Will make a "$(BUILD)" build of Neverball $(VERSION).)
+
 #------------------------------------------------------------------------------
+# Provide a target system hint for the Makefile.
+# Recognized PLATFORM values: darwin, mingw.
 
-# Maybe you need one of these.  Maybe you don't.
+ifeq ($(shell uname), Darwin)
+    PLATFORM := darwin
+endif
 
-#X11_PATH= -L/usr/X11/lib
-#X11_PATH= -L/usr/X11R6/lib
+#------------------------------------------------------------------------------
+# Paths (packagers might want to set DATADIR and LOCALEDIR)
 
-OGL_LIBS= -lGL -lm
-#OGL_LIBS= -lm                                                # Think Different
+USERDIR   := .neverball
+DATADIR   := ./data
+LOCALEDIR := ./locale
 
-CFLAGS= -Wall -g -O3 -ansi -pedantic $(shell sdl-config --cflags)
-#CFLAGS= -Wall -g -O1 -ansi -pedantic $(shell sdl-config --cflags)
-#CFLAGS= -Wall -pg -ansi $(shell sdl-config --cflags)
+ifeq ($(PLATFORM),mingw)
+    USERDIR := Neverball
+endif
 
-CPPFLAGS += -DVERSION=\"$(VERSION)\" -Ishare
+ifneq ($(BUILD),release)
+    USERDIR := $(USERDIR)-dev
+endif
 
-SDL_LIBS= $(shell sdl-config --libs)
-PNG_LIBS= $(shell libpng-config --libs)
+#------------------------------------------------------------------------------
+# Optional flags (CFLAGS, CPPFLAGS, ...)
+
+ifeq ($(DEBUG),1)
+    CFLAGS   := -g
+    CPPFLAGS :=
+else
+    CFLAGS   := -O2
+    CPPFLAGS := -DNDEBUG
+endif
+
+#------------------------------------------------------------------------------
+# Mandatory flags
 
-MAPC_TARG= mapc$(EXT)
-BALL_TARG= neverball$(EXT)
-PUTT_TARG= neverputt$(EXT)
+# Compiler...
+
+ifeq ($(ENABLE_TILT),wii)
+    # -std=c99 because we need isnormal and -fms-extensions because
+    # libwiimote headers make heavy use of the "unnamed fields" GCC
+    # extension.
+
+    ALL_CFLAGS := -Wall -std=c99 -pedantic -fms-extensions $(CFLAGS)
+else
+    ALL_CFLAGS := -Wall -ansi -pedantic $(CFLAGS)
+endif
 
-LOCALEDIR= locale
-LOCALEDOM= neverball
+# Preprocessor...
 
-POTFILE= po/neverball.pot
+SDL_CPPFLAGS := $(shell sdl-config --cflags) -U_GNU_SOURCE
+PNG_CPPFLAGS := $(shell libpng-config --cflags)
+
+ALL_CPPFLAGS := $(SDL_CPPFLAGS) $(PNG_CPPFLAGS) -Ishare \
+    -DVERSION=\"$(VERSION)\"
+
+ALL_CPPFLAGS += \
+    -DCONFIG_USER=\"$(USERDIR)\" \
+    -DCONFIG_DATA=\"$(DATADIR)\" \
+    -DCONFIG_LOCALE=\"$(LOCALEDIR)\"
+
+ifeq ($(ENABLE_NLS),0)
+    ALL_CPPFLAGS += -DENABLE_NLS=0
+else
+    ALL_CPPFLAGS += -DENABLE_NLS=1
+endif
+
+ifeq ($(PLATFORM),darwin)
+    ALL_CPPFLAGS += -I/opt/local/include
+endif
+
+ALL_CPPFLAGS += $(CPPFLAGS)
+
+#------------------------------------------------------------------------------
+# Libraries
+
+SDL_LIBS := $(shell sdl-config --libs)
+PNG_LIBS := $(shell libpng-config --libs)
+
+ifeq ($(ENABLE_FS),stdio)
+FS_LIBS :=
+else
+FS_LIBS := -lphysfs
+endif
 
-#-------------------------------------------------------------------------------
+# The  non-conditionalised values  below  are specific  to the  native
+# system. The native system of this Makefile is Linux (or GNU+Linux if
+# you prefer). Please be sure to  override ALL of them for each target
+# system in the conditional parts below.
 
-MAPC_OBJS= \
-       share/vec3.o   \
+INTL_LIBS :=
+
+ifeq ($(ENABLE_TILT),wii)
+    TILT_LIBS := -lcwiimote -lbluetooth
+else
+ifeq ($(ENABLE_TILT),loop)
+    TILT_LIBS := -lusb-1.0 -lfreespace
+endif
+endif
+
+OGL_LIBS := -lGL -lm
+
+ifeq ($(PLATFORM),mingw)
+    ifneq ($(ENABLE_NLS),0)
+        INTL_LIBS := -lintl
+    endif
+
+    TILT_LIBS :=
+    OGL_LIBS  := -lopengl32 -lm
+endif
+
+ifeq ($(PLATFORM),darwin)
+    ifneq ($(ENABLE_NLS),0)
+        INTL_LIBS := -lintl
+    endif
+
+    TILT_LIBS :=
+    OGL_LIBS  := -framework OpenGL
+endif
+
+BASE_LIBS := -ljpeg $(PNG_LIBS) $(FS_LIBS)
+
+ifeq ($(PLATFORM),darwin)
+    BASE_LIBS += -L/opt/local/lib
+endif
+
+ALL_LIBS := $(SDL_LIBS) $(BASE_LIBS) $(TILT_LIBS) $(INTL_LIBS) -lSDL_ttf \
+    -lvorbisfile $(OGL_LIBS)
+
+#------------------------------------------------------------------------------
+
+ifeq ($(PLATFORM),mingw)
+    EXT := .exe
+endif
+
+MAPC_TARG := mapc$(EXT)
+BALL_TARG := neverball$(EXT)
+PUTT_TARG := neverputt$(EXT)
+
+ifeq ($(PLATFORM),mingw)
+    MAPC := $(WINE) ./$(MAPC_TARG)
+else
+    MAPC := ./$(MAPC_TARG)
+endif
+
+
+#------------------------------------------------------------------------------
+
+MAPC_OBJS := \
+       share/vec3.o        \
        share/base_image.o  \
-       share/solid.o  \
-       share/binary.o \
+       share/solid_base.o  \
+       share/binary.o      \
        share/base_config.o \
+       share/common.o      \
+       share/fs_common.o   \
+       share/fs_png.o      \
+       share/fs_jpg.o      \
+       share/dir.o         \
+       share/array.o       \
+       share/list.o        \
        share/mapc.o
-BALL_OBJS= \
-       share/i18n.o    \
-       share/st_lang.o \
-       share/st_resol.o \
-       share/vec3.o    \
-       share/base_image.o   \
-       share/image.o   \
-       share/solid.o   \
-       share/solid_gl.o\
-       share/part.o    \
-       share/back.o    \
-       share/geom.o    \
-       share/gui.o     \
-       share/base_config.o  \
-       share/config.o  \
-       share/binary.o  \
-       share/state.o   \
-       share/audio.o   \
-       ball/hud.o      \
-       ball/game.o     \
-       ball/level.o    \
-       ball/levels.o   \
-       ball/set.o      \
-       ball/demo.o     \
-       ball/util.o     \
-       ball/st_conf.o  \
-       ball/st_demo.o  \
-       ball/st_save.o  \
-       ball/st_play_end.o  \
-       ball/st_done.o  \
-       ball/st_level.o \
-       ball/st_over.o  \
-       ball/st_play.o  \
-       ball/st_set.o   \
-       ball/st_start.o \
-       ball/st_title.o \
-       ball/st_help.o  \
-       ball/st_name.o  \
-       ball/st_shared.o  \
-       ball/st_pause.o \
+BALL_OBJS := \
+       share/lang.o        \
+       share/st_resol.o    \
+       share/vec3.o        \
+       share/base_image.o  \
+       share/image.o       \
+       share/solid_base.o  \
+       share/solid_vary.o  \
+       share/solid_draw.o  \
+       share/solid_cmd.o   \
+       share/solid_all.o   \
+       share/part.o        \
+       share/geom.o        \
+       share/item.o        \
+       share/ball.o        \
+       share/gui.o         \
+       share/base_config.o \
+       share/config.o      \
+       share/video.o       \
+       share/glext.o       \
+       share/binary.o      \
+       share/state.o       \
+       share/audio.o       \
+       share/text.o        \
+       share/common.o      \
+       share/keynames.o    \
+       share/syswm.o       \
+       share/list.o        \
+       share/queue.o       \
+       share/cmd.o         \
+       share/array.o       \
+       share/dir.o         \
+       share/fs_common.o   \
+       share/fs_png.o      \
+       share/fs_jpg.o      \
+       share/fs_rwops.o    \
+       share/fs_ov.o       \
+       share/sync.o        \
+       ball/hud.o          \
+       ball/game_common.o  \
+       ball/game_client.o  \
+       ball/game_server.o  \
+       ball/game_proxy.o   \
+       ball/game_draw.o    \
+       ball/score.o        \
+       ball/level.o        \
+       ball/progress.o     \
+       ball/set.o          \
+       ball/demo.o         \
+       ball/demo_dir.o     \
+       ball/util.o         \
+       ball/speed.o        \
+       ball/st_conf.o      \
+       ball/st_demo.o      \
+       ball/st_save.o      \
+       ball/st_goal.o      \
+       ball/st_fail.o      \
+       ball/st_done.o      \
+       ball/st_level.o     \
+       ball/st_over.o      \
+       ball/st_play.o      \
+       ball/st_set.o       \
+       ball/st_start.o     \
+       ball/st_title.o     \
+       ball/st_help.o      \
+       ball/st_name.o      \
+       ball/st_shared.o    \
+       ball/st_pause.o     \
+       ball/st_ball.o      \
        ball/main.o
-PUTT_OBJS= \
-       share/i18n.o    \
-       share/st_lang.o \
-       share/st_resol.o \
-       share/vec3.o   \
+PUTT_OBJS := \
+       share/lang.o        \
+       share/st_resol.o    \
+       share/vec3.o        \
        share/base_image.o  \
-       share/image.o  \
-       share/solid.o  \
-       share/solid_gl.o  \
-       share/part.o   \
-       share/geom.o   \
-       share/back.o   \
-       share/base_config.o  \
-       share/config.o \
-       share/binary.o \
-       share/audio.o  \
-       share/state.o  \
-       share/gui.o    \
-       putt/hud.o     \
-       putt/game.o    \
-       putt/hole.o    \
-       putt/course.o  \
-       putt/st_all.o  \
-       putt/st_conf.o \
+       share/image.o       \
+       share/solid_base.o  \
+       share/solid_vary.o  \
+       share/solid_draw.o  \
+       share/solid_cmd.o   \
+       share/solid_all.o   \
+       share/part.o        \
+       share/geom.o        \
+       share/ball.o        \
+       share/base_config.o \
+       share/config.o      \
+       share/video.o       \
+       share/glext.o       \
+       share/binary.o      \
+       share/audio.o       \
+       share/state.o       \
+       share/gui.o         \
+       share/text.o        \
+       share/common.o      \
+       share/syswm.o       \
+       share/list.o        \
+       share/fs_common.o   \
+       share/fs_png.o      \
+       share/fs_jpg.o      \
+       share/fs_rwops.o    \
+       share/fs_ov.o       \
+       share/dir.o         \
+       share/array.o       \
+       share/sync.o        \
+       putt/hud.o          \
+       putt/game.o         \
+       putt/hole.o         \
+       putt/course.o       \
+       putt/st_all.o       \
+       putt/st_conf.o      \
        putt/main.o
 
-BALL_DEPS= $(BALL_OBJS:.o=.d)
-PUTT_DEPS= $(PUTT_OBJS:.o=.d)
-MAPC_DEPS= $(MAPC_OBJS:.o=.d)
+BALL_OBJS += share/solid_sim_sol.o
+PUTT_OBJS += share/solid_sim_sol.o
+
+ifeq ($(ENABLE_FS),stdio)
+BALL_OBJS += share/fs_stdio.o
+PUTT_OBJS += share/fs_stdio.o
+MAPC_OBJS += share/fs_stdio.o
+else
+BALL_OBJS += share/fs_physfs.o
+PUTT_OBJS += share/fs_physfs.o
+MAPC_OBJS += share/fs_physfs.o
+endif
+
+ifeq ($(ENABLE_TILT),wii)
+BALL_OBJS += share/tilt_wii.o
+else
+ifeq ($(ENABLE_TILT),loop)
+BALL_OBJS += share/tilt_loop.o
+else
+BALL_OBJS += share/tilt_null.o
+endif
+endif
 
-BASE_LIBS= $(SDL_LIBS) -lSDL_image
-LIBS= $(X11_PATH) $(BASE_LIBS) $(PNG_LIBS) -lSDL_ttf -lSDL_mixer $(OGL_LIBS)
+ifeq ($(PLATFORM),mingw)
+BALL_OBJS += neverball.ico.o
+PUTT_OBJS += neverputt.ico.o
+endif
 
-MESSAGEPART= /LC_MESSAGES/$(LOCALEDOM).mo
-MESSAGES= $(LINGUAS:%=$(LOCALEDIR)/%$(MESSAGEPART))
+BALL_DEPS := $(BALL_OBJS:.o=.d)
+PUTT_DEPS := $(PUTT_OBJS:.o=.d)
+MAPC_DEPS := $(MAPC_OBJS:.o=.d)
 
-MAPS= $(shell find data/ -name '*.map')
-SOLS= $(MAPS:%.map=%.sol)
+MAPS := $(shell find data -name "*.map" \! -name "*.autosave.map")
+SOLS := $(MAPS:%.map=%.sol)
 
-POS= $(shell echo po/*.po)
-LINGUAS= $(POS:po/%.po=%)
+DESKTOPS := $(basename $(wildcard dist/*.desktop.in))
 
 #------------------------------------------------------------------------------
-# Implicit rules
-#------------------------------------------------------------------------------
-
-%.d : %.c
-       $(CC) $(CFLAGS) $(CPPFLAGS) -MM -MF $@ -MT '$*.o $@' $<
 
 %.o : %.c
-       $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
+       $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) -MM -MP -MF $*.d -MT "$@" $<
+       $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) -o $@ -c $<
 
 %.sol : %.map $(MAPC_TARG)
-       $(WINE) ./$(MAPC_TARG) $< data
+       $(MAPC) $< data
 
-$(LOCALEDIR)/%$(MESSAGEPART) : po/%.po
-       mkdir -p `dirname $@`
-       msgfmt -c -v -o $@ $<
+%.desktop : %.desktop.in
+       sh scripts/translate-desktop.sh < $< > $@
+
+%.ico.o: dist/ico/%.ico
+       echo "1 ICON \"$<\"" | $(WINDRES) -o $@
 
-#------------------------------------------------------------------------------
-# Main rules
 #------------------------------------------------------------------------------
 
-all : $(BALL_TARG) $(PUTT_TARG) $(MAPC_TARG) sols locales
+all : $(BALL_TARG) $(PUTT_TARG) $(MAPC_TARG) sols locales desktops
 
 $(BALL_TARG) : $(BALL_OBJS)
-       $(CC) $(CFLAGS) -o $(BALL_TARG) $(BALL_OBJS) $(LDFLAGS) $(LIBS)
+       $(CC) $(ALL_CFLAGS) -o $(BALL_TARG) $(BALL_OBJS) $(LDFLAGS) $(ALL_LIBS)
 
 $(PUTT_TARG) : $(PUTT_OBJS)
-       $(CC) $(CFLAGS) -o $(PUTT_TARG) $(PUTT_OBJS) $(LDFLAGS) $(LIBS)
+       $(CC) $(ALL_CFLAGS) -o $(PUTT_TARG) $(PUTT_OBJS) $(LDFLAGS) $(ALL_LIBS)
 
 $(MAPC_TARG) : $(MAPC_OBJS)
-       $(CC) $(CFLAGS) -o $(MAPC_TARG) $(MAPC_OBJS) $(LDFLAGS) $(BASE_LIBS)
+       $(CC) $(ALL_CFLAGS) -o $(MAPC_TARG) $(MAPC_OBJS) $(LDFLAGS) $(BASE_LIBS)
+
+# Work around some extremely helpful sdl-config scripts.
+
+ifeq ($(PLATFORM),mingw)
+$(MAPC_TARG) : ALL_CPPFLAGS := $(ALL_CPPFLAGS) -Umain
+endif
 
 sols : $(SOLS)
 
-locales : $(MESSAGES)
+locales :
+ifneq ($(ENABLE_NLS),0)
+       $(MAKE) -C po
+endif
+
+desktops : $(DESKTOPS)
 
 clean-src :
-       rm -f $(BALL_TARG) $(BALL_OBJS) $(BALL_DEPS)
-       rm -f $(PUTT_TARG) $(PUTT_OBJS) $(PUTT_DEPS)
-       rm -f $(MAPC_TARG) $(MAPC_OBJS) $(MAPC_DEPS)
+       $(RM) $(BALL_TARG) $(BALL_OBJS) $(BALL_DEPS)
+       $(RM) $(PUTT_TARG) $(PUTT_OBJS) $(PUTT_DEPS)
+       $(RM) $(MAPC_TARG) $(MAPC_OBJS) $(MAPC_DEPS)
 
 clean : clean-src
-       rm -f $(SOLS)
-       rm -rf $(LOCALEDIR)
+       $(RM) $(SOLS)
+       $(RM) $(DESKTOPS)
+       $(MAKE) -C po clean
 
 test : all
        ./neverball
 
-mingw-%:
-       $(MAKE) -f Makefile.mingw $*
+TAGS :
+       $(RM) $@
+       find . -name '*.[ch]' | xargs etags -a
+
+#------------------------------------------------------------------------------
+
+.PHONY : all sols locales clean-src clean test TAGS
+
+-include $(BALL_DEPS) $(PUTT_DEPS) $(MAPC_DEPS)
+
+#------------------------------------------------------------------------------
+
+ifeq ($(PLATFORM),mingw)
 
 #------------------------------------------------------------------------------
-# PO update rules
+
+INSTALLER := ../neverball-$(VERSION)-setup.exe
+
+MAKENSIS := makensis
+MAKENSIS_FLAGS := -DVERSION=$(VERSION) -DOUTFILE=$(INSTALLER)
+
+TODOS   := todos
+FROMDOS := fromdos
+
+CP := cp
+
+TEXT_DOCS := \
+       doc/AUTHORS \
+       doc/MANUAL  \
+       CHANGES     \
+       COPYING     \
+       README
+
+TXT_DOCS := $(TEXT_DOCS:%=%.txt)
+
 #------------------------------------------------------------------------------
 
-po/%.po : $(POTFILE)
-       msgmerge -U $@ $<
-       touch $@
-       
-po-update-extract :
-       sh scripts/extractpo.sh $(POTFILE) $(LOCALEDOM)
+.PHONY: setup
+setup: $(INSTALLER)
 
-po-update-merge : $(POS)
+$(INSTALLER): install-dlls convert-text-files all contrib
+       $(MAKENSIS) $(MAKENSIS_FLAGS) -nocd scripts/neverball.nsi
 
-po-update : po-update-extract po-update-merge
+$(INSTALLER): LDFLAGS := -s $(LDFLAGS)
+
+.PHONY: clean-setup
+clean-setup: clean
+       $(RM) install-dlls.sh *.dll $(TXT_DOCS)
+       find data -name "*.txt" -exec $(FROMDOS) {} \;
+       $(MAKE) -C contrib EXT=$(EXT) clean
 
 #------------------------------------------------------------------------------
 
-.PHONY : all sols locales clean-src clean test \
-       po-update-extract po-update-merge po-update \
-       tools
+.PHONY: install-dlls
+install-dlls: install-dlls.sh
+       sh $<
 
--include $(BALL_DEPS) $(PUTT_DEPS) $(MAPC_DEPS)
+install-dlls.sh: $(MAPC_TARG) $(BALL_TARG) $(PUTT_TARG)
+       mingw-list-dlls --format=shell $^ > $@
+
+#------------------------------------------------------------------------------
+
+.PHONY: convert-text-files
+convert-text-files: $(TXT_DOCS)
+       find data -name "*.txt" -exec $(TODOS) {} \;
+
+%.txt: %
+       $(CP) $< $@
+       $(TODOS) $@
+
+#------------------------------------------------------------------------------
+
+.PHONY: contrib
+contrib:
+       $(MAKE) -C contrib EXT=$(EXT)
+
+#------------------------------------------------------------------------------
+
+endif
+
+#------------------------------------------------------------------------------