Subject: build system
From: Julian Ospald <[email-masked]>
Date: Sun Jun 24 13:32:38 UTC 2012

respect all flags
respect compiler
add options for DATADIR, BSD_KERNEL and DEBUG
use proper pkgconfig calls
remove needless build types
rename EXE to "el"

--- elc/Makefile.linux
+++ elc/Makefile.linux
@@ -3,16 +3,54 @@
 -include make.conf
 
 # basic compiling and linking - rarely changed
-OPTIONS = -DLINUX -DELC $(foreach FEATURE, $(FEATURES), -D$(FEATURE)) -D_7ZIP_ST
-CFLAGS=$(PLATFORM) $(CWARN) -O0 -ggdb -pipe $(OPTIONS) $(shell sdl-config --cflags) $(shell xml2-config --cflags) -fno-strict-aliasing $(EXTRA_INCLUDES)
-_CFLAGS=$(PLATFORM) -O2 -fomit-frame-pointer -ffast-math -pipe $(OPTIONS) $(shell sdl-config --cflags) $(shell xml2-config --cflags) -fno-strict-aliasing $(EXTRA_INCLUDES)
-CXXFLAGS=$(PLATFORM) $(CXXWARN) -O0 -ggdb -pipe $(OPTIONS) $(shell sdl-config --cflags) $(shell xml2-config --cflags) -fno-strict-aliasing $(EXTRA_INCLUDES)
-_CXXFLAGS=$(PLATFORM) -O3 -fomit-frame-pointer -ffast-math -pipe $(OPTIONS) $(shell sdl-config --cflags) $(shell xml2-config --cflags) -fno-strict-aliasing $(EXTRA_INCLUDES)
-
-PNG_SCREENSHOT_LIBS = -lpng
-LDFLAGS=$(shell sdl-config --libs) $(shell xml2-config --libs) -lSDL_net -lSDL_image -lopenal $(XDIR) -lGL -lGLU -lcal3d -lm $(EXTRA_LIBS) -lz -lpng -lvorbis -lvorbisfile \
-	$(foreach FEATURE, $(FEATURES), $($(FEATURE)_LIBS))
-_LDFLAGS=$(XDIR) -lGL -lpthread -lstdc++
+CC ?= gcc
+CXX ?= g++
+
+# some options
+DATADIR ?= /usr/share/games/eternal-lands
+
+CPPFLAGS += -DDATA_DIR=\"$(DATADIR)\" \
+	    -DLINUX \
+	    -DELC \
+	    $(foreach FEATURE, $(EL_FEATURES), -D$(FEATURE)) \
+	    -D_7ZIP_ST
+
+ifeq ($(BSD_KERNEL),yes)
+CPPFLAGS += -DBSD
+endif
+
+ifeq ($(DEBUG),yes)
+CPPFLAGS += -DMEMORY_DEBUG
+endif
+
+CFLAGS += $(shell sdl-config --cflags) \
+	  $(shell xml2-config --cflags) \
+	  -fno-strict-aliasing \
+	  $(EXTRA_INCLUDES)
+
+CXXFLAGS += $(shell sdl-config --cflags) \
+	    $(shell xml2-config --cflags) \
+	    -fno-strict-aliasing \
+	    $(EXTRA_INCLUDES)
+
+LIBS += $(shell pkg-config --libs x11) \
+	$(shell sdl-config --libs) \
+	$(shell xml2-config --libs) \
+	$(shell pkg-config --libs SDL_net) \
+	$(shell pkg-config --libs SDL_image) \
+	$(shell pkg-config --libs openal) \
+	$(shell pkg-config --libs freealut) \
+	$(shell pkg-config --libs gl) \
+	$(shell pkg-config --libs glu) \
+	$(shell pkg-config --libs cal3d) \
+	$(shell pkg-config --libs libpng) \
+	$(shell pkg-config --libs vorbis) \
+	$(shell pkg-config --libs vorbisfile) \
+	$(shell pkg-config --libs zlib) \
+	-lm \
+	$(EXTRA_LIBS) \
+	$(foreach FEATURE, $(EL_FEATURES), $($(FEATURE)_LIBS)) \
+	-lstdc++
 
 # This works on Ubuntu 8.04 (LTS) at least
 # Install these packages in addition to those required for a standard build
@@ -59,7 +97,7 @@
 	xz/CpuArch.o xz/Delta.o xz/LzFind.o xz/Lzma2Dec.o xz/Lzma2Enc.o	\
 	xz/LzmaDec.o xz/LzmaEnc.o xz/Sha256.o xz/Xz.o xz/XzCrc64.o xz/XzDec.o	\
 	xz/XzEnc.o	\
-	$(foreach FEATURE, $(FEATURES), $($(FEATURE)_COBJ))
+	$(foreach FEATURE, $(EL_FEATURES), $($(FEATURE)_COBJ))
 	
 CXXOBJS=actor_init.o cal3d_wrapper.o context_menu.o optimizer.o sendvideoinfo.o	\
 	exceptions/extendedexception.o xml/xmlhelper.o quest_log.o	\
@@ -80,7 +118,7 @@
 	eye_candy/effect_mines.o eye_candy/effect_missile.o \
 	eye_candy/orbital_mover.o eye_candy/kepler_orbit.o	\
 	eye_candy/effect_staff.o \
-	$(foreach FEATURE, $(FEATURES), $($(FEATURE)_CXXOBJ))
+	$(foreach FEATURE, $(EL_FEATURES), $($(FEATURE)_CXXOBJ))
 
 OBJS=$(COBJS) $(CXXOBJS)
 HEADER_DIRS = . books eye_candy io pawn fsaa engine xz
@@ -89,24 +127,13 @@
 DEP_FILES=$(foreach OBJ, $(COBJS), .deps/$(OBJ).P) $(foreach OBJ, $(CXXOBJS), .deps/$(OBJ).P)
 #(shell echo $OBJ |sed s/\.o/\.P/))
 
-EXE=el.x86.linux.bin
-
-ifndef CC
-CC=gcc
-endif
-ifndef CXX
-CXX=g++
-endif
-ifndef LINK
-LINK=gcc
-endif
+EXE=el
 
 all: $(EXE)
 
 # the compile targets
 $(EXE): $(OBJS)
-	@echo "  LINK $(EXE)"
-	@$(LINK) $(CFLAGS) -o $(EXE) $(OBJS) $(LDFLAGS)
+	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $(EXE) $(OBJS) $(LIBS)
 
 #recompile on Makefile or conf change
 #.depend $(OBJS): Makefile.linux make.conf
@@ -114,25 +141,19 @@
 DEPS_MAGIC := $(shell mkdir .deps .deps/io .deps/shader .deps/eye_candy .deps/exceptions .deps/xz .deps/xml .deps/fsaa .deps/engine > /dev/null 2>&1 || :)
 
 $(COBJS): %.o: %.c Makefile.linux make.conf
-	@echo "  CC   $@"
-	@if $(CC) $(CFLAGS) -MT '$@' -MD -MP -MF '.deps/$@.pp' -c $< -o $@; then \
+	@echo "$(CC) $(CFLAGS) $(CPPFLAGS) -MT '$@' -MD -MP -MF '.deps/$@.pp' -c $< -o $@"
+	@if $(CC) $(CFLAGS) $(CPPFLAGS) -MT '$@' -MD -MP -MF '.deps/$@.pp' -c $< -o $@; then \
 		mv ".deps/$@.pp" ".deps/$@.P"; \
 	else rm -f ".deps/$@.pp"; exit 1; \
 	fi
 
 $(CXXOBJS): %.o: %.cpp Makefile.linux make.conf
-	@echo "  CXX  $@"
-	@if $(CXX) $(CXXFLAGS) -MT '$@' -MD -MP -MF '.deps/$@.pp' -c $< -o $@; then \
+	@echo "$(CXX) $(CXXFLAGS) $(CPPFLAGS) -MT '$@' -MD -MP -MF '.deps/$@.pp' -c $< -o $@"
+	@if $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MT '$@' -MD -MP -MF '.deps/$@.pp' -c $< -o $@; then \
 		mv ".deps/$@.pp" ".deps/$@.P"; \
 	else rm -f ".deps/$@.pp"; exit 1; \
 	fi
 
-release:
-	@$(MAKE) -f Makefile.linux 'CFLAGS=$(_CFLAGS)' 'CXXFLAGS=$(_CXXFLAGS)'
-
-static:
-	@$(MAKE) -f Makefile.linux 'CFLAGS=$(_CFLAGS)' 'CXXFLAGS=$(_CXXFLAGS)' 'LDFLAGS=$(_LDFLAGS)' 'OBJS=$(OBJS) $(STATICLIBS)'
-
 clean:
 	rm -f $(OBJS) $(EXE) 
 
@@ -140,8 +161,8 @@
 	cd docs && doxygen Doxyfile
 
 .depend: $(foreach HEADER_DIR, $(HEADER_DIRS), $(wildcard $(HEADER_DIR)/*.h))
-	$(CC) $(CFLAGS) -MM $(patsubst %.o, %.c, $(COBJS)) >.depend
-	$(CXX) $(CXXFLAGS) -MM $(patsubst %.o, %.cpp, $(CXXOBJS)) >>.depend
+	$(CC) $(CFLAGS) $(CPPFLAGS) -MM $(patsubst %.o, %.c, $(COBJS)) >.depend
+	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -MM $(patsubst %.o, %.cpp, $(CXXOBJS)) >>.depend
 
 make.conf: make.defaults
 	@if (test -f $@ -a '$(UPDATE_CONF)' != 'yes'); \
@@ -161,7 +182,7 @@
 	echo "\t#endinput" >> $@; \
 	echo "#endif" >> $@; \
 	echo "#define _features_included" >> $@; \
-	for feature in $(FEATURES); do \
+	for feature in $(EL_FEATURES); do \
 		echo "#define $$feature" >> $@; \
 	done
 
--- elc/make.defaults
+++ elc/make.defaults
@@ -1,71 +1,82 @@
 # set this to "no" if you don't want this file to be overwritten
 UPDATE_CONF=yes
 
+# set to 'yes' for BSD support
+BSD_KERNEL=no
+
+# set to 'yes' to enable debug support
+DEBUG=no
+
 # tune these for your setup & compile options
 # IMPORTANT: if you are using a linker that needs libraries in correct order, make sure you list EYE_CANDY before PNG_SCREENSHOT if you use both
 
 ### Current release default options ###
-FEATURES += CLUSTER_INSIDES		# Group objects into separate clusters for clipping on inside maps
-FEATURES += CUSTOM_LOOK			# allows you to customize your look.
-FEATURES += CUSTOM_UPDATE		# allows autoupdating of custom look information
-FEATURES += FUZZY_PATHS			# Makes Tab Map walking not always follow exaclty the same path
-FEATURES += NEW_SOUND			# Enables extended sound effects system
-FEATURES += PNG_SCREENSHOT		# make screenshots in W3C's PNG format in game, requires libpng
-FEATURES += TEXT_ALIASES		# Text aliases
-FEATURES += USE_INLINE			# enable some optimizations to use inline functions instead of pure function calls
+EL_FEATURES += CLUSTER_INSIDES		# Group objects into separate clusters for clipping on inside maps
+EL_FEATURES += CUSTOM_LOOK			# allows you to customize your look.
+EL_FEATURES += CUSTOM_UPDATE		# allows autoupdating of custom look information
+EL_FEATURES += FUZZY_PATHS			# Makes Tab Map walking not always follow exaclty the same path
+EL_FEATURES += NEW_SOUND			# Enables extended sound effects system
+EL_FEATURES += PNG_SCREENSHOT		# make screenshots in W3C's PNG format in game, requires libpng
+EL_FEATURES += TEXT_ALIASES		# Text aliases
+EL_FEATURES += USE_INLINE			# enable some optimizations to use inline functions instead of pure function calls
 # new for 1.9.0 release
-FEATURES += BANDWIDTH_SAVINGS		# enable bandwidth saving changes for message protocol
+EL_FEATURES += BANDWIDTH_SAVINGS		# enable bandwidth saving changes for message protocol
 # new for 1.9.2 release
-FEATURES += ANIMATION_SCALING		# Adds support for animation scaling, depending on the number of animation commands in the actor queue.
-FEATURES += ENCYCL_NAVIGATION		# Adds context menus to encyclopedia windows with search and bookmark functions
-FEATURES += FSAA			# Adds support for full screen anti-aliasing using OpenGL multisampling.
-FEATURES += NEW_NEW_CHAR_WINDOW		# Use the new character creation window; controls always on-screen
-FEATURES += NEW_TEXTURES		# Enables the new texture loading and caching system (http://www.eternal-lands.com/forum/index.php?showtopic=54756)
+EL_FEATURES += ANIMATION_SCALING		# Adds support for animation scaling, depending on the number of animation commands in the actor queue.
+EL_FEATURES += ENCYCL_NAVIGATION		# Adds context menus to encyclopedia windows with search and bookmark functions
+EL_FEATURES += FSAA			# Adds support for full screen anti-aliasing using OpenGL multisampling.
+EL_FEATURES += NEW_NEW_CHAR_WINDOW		# Use the new character creation window; controls always on-screen
+EL_FEATURES += NEW_TEXTURES		# Enables the new texture loading and caching system (http://www.eternal-lands.com/forum/index.php?showtopic=54756)
 # new for 1.9.3 release
-FEATURES += FASTER_MAP_LOAD		# Enables optimizations to speed up the process of switching between maps
-FEATURES += FASTER_STARTUP		# An attempt to reduce the startup time of EL somewhat
-FEATURES += MIDDLE_MOUSE_PASTE	# Paste using the middle mouse button from the primary buffer on X systems
+EL_FEATURES += FASTER_MAP_LOAD		# Enables optimizations to speed up the process of switching between maps
+EL_FEATURES += FASTER_STARTUP		# An attempt to reduce the startup time of EL somewhat
+EL_FEATURES += MIDDLE_MOUSE_PASTE	# Paste using the middle mouse button from the primary buffer on X systems
 
 ### Testing options (these options are possible for the next release and should be tested) ###
-#FEATURES += ANTI_ALIAS			# allows to enable/disable anti-aliasing in el.ini
-#FEATURES += DYNAMIC_ANIMATIONS		# (appears broken) Synchronizes animation to FPS instead of a fixed timer
-#FEATURES += EXT_ACTOR_DICT		# Removes remaining hard-coded actor def dictionaries - requires updated actor defs files (http://el.grug.redirectme.net/actor_defs.zip)
-#FEATURES += NEW_ALPHA			# (undocumented)
-#FEATURES += USE_SIMD			# Enables usage of simd instructions
+#EL_FEATURES += ANTI_ALIAS			# allows to enable/disable anti-aliasing in el.ini
+#EL_FEATURES += DYNAMIC_ANIMATIONS		# (appears broken) Synchronizes animation to FPS instead of a fixed timer
+#EL_FEATURES += EXT_ACTOR_DICT		# Removes remaining hard-coded actor def dictionaries - requires updated actor defs files (http://el.grug.redirectme.net/actor_defs.zip)
+#EL_FEATURES += NEW_ALPHA			# (undocumented)
+#EL_FEATURES += USE_SIMD			# Enables usage of simd instructions
 
 ### Machine specific options (fixes or performance enhancements) ###
-#FEATURES += EL_BIG_ENDIAN		# Enable big-endian code (automatically detected for OSX)
-#FEATURES += NO_PF_MACRO		# Use a function instead of a macro for pf_get_tile()
-#FEATURES += SIMPLE_LOD			# enable a simplistic distance culling to improve performance
+#EL_FEATURES += EL_BIG_ENDIAN		# Enable big-endian code (automatically detected for OSX)
+#EL_FEATURES += NO_PF_MACRO		# Use a function instead of a macro for pf_get_tile()
+#EL_FEATURES += SIMPLE_LOD			# enable a simplistic distance culling to improve performance

 ### Debug options ###
-#FEATURES += CONTEXT_MENUS_TEST		# Enable "#cmtest" command to help test/demo the context menu code
-#FEATURES += DEBUG			# (undocumented)
-#FEATURES += DEBUG_XML			# Enables missing (optional) XML string property messages
-#FEATURES += DEBUG_POINT_PARTICLES	# (undocumented)
-#FEATURES += DEBUG_TIME			# Fakes the acceleration of time for use in debugging shadows and the like.
-#FEATURES += DEBUG_MAP_SOUND		# Adds (some??) map boundary areas to tab maps and additional logging to stdout
-#FEATURES += ECDEBUGWIN			# press ctrl-alt-c to open the Eye Candy debug window: trigger most effects without casting spells or server side events
-#FEATURES += EXTRA_DEBUG		# (undocumented)
-#FEATURES += MEMORY_DEBUG		# gather information about memory allocation and freeing
-#FEATURES += MISSILES_DEBUG		# Enables debug for missiles feature. It will create a file missiles_log.txt file in your settings directory.
-#FEATURES += MUTEX_DEBUG		# (undocumented)
-#FEATURES += OPENGL_TRACE		# make far more frequent checks for OpenGL errors (requires -DDEBUG to be of any use). Will make error_log.txt a lot larger.
-#FEATURES += TIMER_CHECK		# (undocumented)
-#FEATURES += _EXTRA_SOUND_DEBUG		# Enable debug for sound effects
+#EL_FEATURES += CONTEXT_MENUS_TEST		# Enable "#cmtest" command to help test/demo the context menu code
+#EL_FEATURES += DEBUG			# (undocumented)
+#EL_FEATURES += DEBUG_XML			# Enables missing (optional) XML string property messages
+#EL_FEATURES += DEBUG_POINT_PARTICLES	# (undocumented)
+#EL_FEATURES += DEBUG_TIME			# Fakes the acceleration of time for use in debugging shadows and the like.
+#EL_FEATURES += DEBUG_MAP_SOUND		# Adds (some??) map boundary areas to tab maps and additional logging to stdout
+#EL_FEATURES += ECDEBUGWIN			# press ctrl-alt-c to open the Eye Candy debug window: trigger most effects without casting spells or server side events
+#EL_FEATURES += EXTRA_DEBUG		# (undocumented)
+
+# gather information about memory allocation and freeing
+ifeq ($(DEBUG),yes)
+EL_FEATURES += MEMORY_DEBUG
+endif
+
+#EL_FEATURES += MISSILES_DEBUG		# Enables debug for missiles feature. It will create a file missiles_log.txt file in your settings directory.
+#EL_FEATURES += MUTEX_DEBUG		# (undocumented)
+#EL_FEATURES += OPENGL_TRACE		# make far more frequent checks for OpenGL errors (requires -DDEBUG to be of any use). Will make error_log.txt a lot larger.
+#EL_FEATURES += TIMER_CHECK		# (undocumented)
+#EL_FEATURES += _EXTRA_SOUND_DEBUG		# Enable debug for sound effects

 ### Other options (Experimental, unfinished, defunct or otherwise unknown) ###
-#FEATURES += NEW_CURSOR			# New coloured cursors made by Emajekral (Experimental) Extract http://users.on.net/~gingerman/sky_cursor-textures.zip into datadir/textures/
-#FEATURES += PAWN			# Experimental, not for release, will need server support to function properly. This *will* eat your cat. You've been warned. Enables the Pawn abstract machine.
-#FEATURES += UID			# use unique ID sent from server for custom looks. (INCOMPLETE)
-#FEATURES += USE_ACTORS_OPTIMIZER	# Enables actor optimizations
-#FEATURES += USE_BOOST
-#FEATURES += USE_TR1			# Needs tr1 version of c++ stl, used for NEW_FILE_IO
-#FEATURES += WRITE_XML			# dangerous to use, will wipe out some XML files that are part of the main game download
-#FEATURES += ZLIBW			# Enables being able to write gzip compressed files, requires -lzlib/-lz needed for map_editor
-#FEATURES += OLD_MISC_OBJ_DIR		# if not defined, ./3dobjects/misc_objects/ paths becomes ./3dobjects/
+#EL_FEATURES += NEW_CURSOR			# New coloured cursors made by Emajekral (Experimental) Extract http://users.on.net/~gingerman/sky_cursor-textures.zip into datadir/textures/
+#EL_FEATURES += PAWN			# Experimental, not for release, will need server support to function properly. This *will* eat your cat. You've been warned. Enables the Pawn abstract machine.
+#EL_FEATURES += UID			# use unique ID sent from server for custom looks. (INCOMPLETE)
+#EL_FEATURES += USE_ACTORS_OPTIMIZER	# Enables actor optimizations
+#EL_FEATURES += USE_BOOST
+#EL_FEATURES += USE_TR1			# Needs tr1 version of c++ stl, used for NEW_FILE_IO
+#EL_FEATURES += WRITE_XML			# dangerous to use, will wipe out some XML files that are part of the main game download
+#EL_FEATURES += ZLIBW			# Enables being able to write gzip compressed files, requires -lzlib/-lz needed for map_editor
+#EL_FEATURES += OLD_MISC_OBJ_DIR		# if not defined, ./3dobjects/misc_objects/ paths becomes ./3dobjects/

 
@@ -86,7 +97,3 @@
 #EXTRA_INCLUDES=-IC:\\Programme\\Dev-Cpp\\Include
 #EXTRA_LIBS=-lz
 #EXTRA_STATICLIBS=libs/zlib.a
-
-CC=gcc
-CXX=g++
-LINK=gcc