# $Id$

# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.

log() {
	if [ $1 = "1" ]; then
		shift
		echo "$@"
	else
		shift
	fi
	echo "$@" >> $config_log
}

set_default() {
	ignore_extra_parameters="0"
	# We set all kinds of defaults for params. Later on the user can override
	# most of them; but if they don't, this default is used.
	build=""
	host=""
	cc_build=""
	cc_host=""
	cxx_build=""
	cxx_host=""
	windres=""
	strip=""
	lipo=""
	awk="awk"
	os="DETECT"
	endian="AUTO"
	cpu_type="DETECT"
	config_log="config.log"
	prefix_dir="/usr/local"
	binary_dir="games"
	data_dir="share/games/openttd"
	doc_dir="1"
	icon_dir="share/pixmaps"
	icon_theme_dir="1"
	personal_dir="1"
	shared_dir="1"
	install_dir="/"
	man_dir="1"
	menu_dir="1"
	menu_group="Game;"
	menu_name="OpenTTD"
	binary_name="openttd"
	enable_debug="0"
	enable_desync_debug="0"
	enable_profiling="0"
	enable_lto="0"
	enable_dedicated="0"
	enable_network="1"
	enable_static="1"
	enable_translator="0"
	enable_unicode="1"
	enable_console="1";
	enable_assert="1"
	enable_strip="0"
	enable_universal="0"
	enable_osx_g5="0"
	enable_cocoa_quartz="1"
	enable_cocoa_quickdraw="1"
	with_osx_sysroot="1"
	with_application_bundle="1"
	with_menu_entry="1"
	with_allegro="1"
	with_sdl="1"
	with_cocoa="1"
	with_zlib="1"
	with_lzma="1"
	with_lzo2="1"
	with_png="1"
	enable_builtin_depend="1"
	with_makedepend="0"
	with_direct_music="1"
	with_sort="1"
	with_iconv="1"
	with_midi=""
	with_midi_arg=""
	with_libtimidity="1"
	with_freetype="1"
	with_fontconfig="1"
	with_icu="1"
	static_icu="0"
	with_psp_config="1"
	with_threads="1"
	with_distcc="1"
	with_ccache="1"
	with_nforenum="1"
	with_grfcodec="1"

	save_params_array="
		build
		host
		cc_build
		cc_host
		cxx_build
		cxx_host
		windres
		strip
		lipo
		awk
		os
		endian
		cpu_type
		config_log
		prefix_dir
		binary_dir
		data_dir
		doc_dir
		icon_dir
		icon_theme_dir
		man_dir
		menu_dir
		personal_dir
		shared_dir
		install_dir
		menu_group
		menu_name
		binary_name
		enable_debug
		enable_desync_debug
		enable_profiling
		enable_lto
		enable_dedicated
		enable_network
		enable_static
		enable_translator
		enable_unicode
		enable_console
		enable_assert
		enable_strip
		enable_universal
		enable_osx_g5
		enable_cocoa_quartz
		enable_cocoa_quickdraw
		with_osx_sysroot
		with_application_bundle
		with_allegro
		with_sdl
		with_cocoa
		with_zlib
		with_lzma
		with_lzo2
		with_png
		enable_builtin_depend
		with_makedepend
		with_direct_music
		with_sort
		with_iconv
		with_midi
		with_midi_arg
		with_libtimidity
		with_freetype
		with_fontconfig
		with_icu
		static_icu
		with_psp_config
		with_threads
		with_distcc
		with_ccache
		with_grfcodec
		with_nforenum
	CC CXX CFLAGS CXXFLAGS LDFLAGS CFLAGS_BUILD CXXFLAGS_BUILD LDFLAGS_BUILD"
}

detect_params() {
	# Walk over all params from the user and override any default settings if
	#  needed. This also handles any invalid option.
	for p in "$@"; do
		if [ -n "$prev_p" ]; then
			eval "$prev_p=\$p"
			prev_p=
			continue
		fi

		optarg=`expr "x$p" : 'x[^=]*=\(.*\)'`

		case "$p" in
			--help | -h | -\?)            showhelp; exit 0;;

			--config-log)                 prev_p="config_log";;
			--config-log=*)               config_log="$optarg";;

			--build)                      prev_p="build";;
			--build=*)                    build="$optarg";;

			--host)                       prev_p="host";;
			--host=*)                     host="$optarg";;

			--os)                         prev_p="os";;
			--os=*)                       os="$optarg";;

			--cpu-type)                   prev_p="cpu_type";;
			--cpu-type=*)                 cpu_type="$optarg";;

			--cc-build)                   prev_p="cc_build";;
			--cc-build=*)                 cc_build="$optarg";;
			--cc-host)                    prev_p="cc_host";;
			--cc-host=*)                  cc_host="$optarg";;
			--cxx-build)                  prev_p="cxx_build";;
			--cxx-build=*)                cxx_build="$optarg";;
			--cxx-host)                   prev_p="cxx_host";;
			--cxx-host=*)                 cxx_host="$optarg";;
			--windres)                    prev_p="windres";;
			--windres=*)                  windres="$optarg";;
			--awk)                        prev_p="awk";;
			--awk=*)                      awk="$optarg";;
			--strip)                      prev_p="strip";;
			--strip=*)                    strip="$optarg";;
			--lipo)                       prev_p="lipo";;
			--lipo=*)                     lipo="$optarg";;

			--endian)                     prev_p="endian";;
			--endian=*)                   endian="$optarg";;



			# Alias --prefix with --prefix-dir, for compatibility with GNU autotools
			--prefix-dir | --prefix)      prev_p="prefix_dir";;
			--prefix-dir=* | --prefix=*)  prefix_dir="$optarg";;

			--binary-dir)                 prev_p="binary_dir";;
			--binary-dir=*)               binary_dir="$optarg";;

			--data-dir)                   prev_p="data_dir";;
			--data-dir=*)                 data_dir="$optarg";;

			--doc-dir)                    prev_p="doc_dir";;
			--doc-dir=*)                  doc_dir="$optarg";;

			--icon-dir)                   prev_p="icon_dir";;
			--icon-dir=*)                 icon_dir="$optarg";;

			--icon-theme-dir)             prev_p="icon_theme_dir";;
			--icon-theme-dir=*)           icon_theme_dir="$optarg";;
			--without-icon-theme)         icon_theme_dir="";;

			--menu-dir)                   prev_p="menu_dir";;
			--menu-dir=*)                 menu_dir="$optarg";;
			--without-menu-entry)         menu_dir="";;

			--menu-name)                  prev_p="menu_name";;
			--menu-name=*)                menu_name="$optarg";;

			--binary-name)                prev_p="binary_name";;
			--binary-name=*)              binary_name="$optarg";;

			--man-dir)                    prev_p="man_dir";;
			--man-dir=*)                  man_dir="$optarg";;

			--personal-dir)               prev_p="personal_dir";;
			--personal-dir=*)             personal_dir="$optarg";;
			--without-personal-dir)       personal_dir="";;

			--shared-dir)                 prev_p="shared_dir";;
			--shared-dir=*)               shared_dir="$optarg";;
			--without-shared-dir)         shared_dir="";;

			--install-dir)                prev_p="install_dir";;
			--install-dir=*)              install_dir="$optarg";;



			--menu-group)                 prev_p="menu_group";;
			--menu-group=*)               menu_group="$optarg";;



			--enable-debug)               enable_debug="1";;
			--enable-debug=*)             enable_debug="$optarg";;
			--enable-desync-debug)        enable_desync_debug="1";;
			--enable-desync-debug=*)      enable_desync_debug="$optarg";;
			--enable-profiling)           enable_profiling="1";;
			--enable-profiling=*)         enable_profiling="$optarg";;
			--enable-lto)                 enable_lto="1";;
			--enable-lto=*)               enable_lto="$optarg";;
			--enable-ipo)                 enable_lto="1";;
			--enable-ipo=*)               enable_lto="$optarg";;
			--enable-dedicated)           enable_dedicated="1";;
			--enable-dedicated=*)         enable_dedicated="$optarg";;
			--enable-network)             enable_network="2";;
			--enable-network=*)           enable_network="$optarg";;
			--disable-network)            enable_network="0";;
			--disable-static)             enable_static="0";;
			--enable-static)              enable_static="2";;
			--enable-static=*)            enable_static="$optarg";;
			--disable-translator)         enable_translator="0";;
			--enable-translator)          enable_translator="2";;
			--enable-translator=*)        enable_translator="$optarg";;
			--disable-assert)             enable_assert="0";;
			--enable-assert)              enable_assert="2";;
			--enable-assert=*)            enable_assert="$optarg";;
			--disable-strip)              enable_strip="0";;
			--enable-strip)               enable_strip="2";;
			--enable-strip=*)             enable_strip="$optarg";;
			--disable-universal)          enable_universal="0";;
			--enable-universal)           enable_universal="i386 ppc";;
			--enable-universal=*)         enable_universal="$optarg";;
			--disable-osx-g5)             enable_osx_g5="0";;
			--enable-osx-g5)              enable_osx_g5="2";;
			--enable-osx-g5=*)            enable_osx_g5="$optarg";;
			--disable-unicode)            enable_unicode="0";;
			--enable-unicode)             enable_unicode="2";;
			--enable-unicode=*)           enable_unicode="$optarg";;
			--disable-console)            enable_console="0";;
			--enable-console)             enable_console="2";;
			--enable-console=*)           enable_console="$optarg";;

			--disable-cocoa-quartz)       enable_cocoa_quartz="0";;
			--enable-cocoa-quartz)        enable_cocoa_quartz="2";;
			--enable-cocoa-quartz=*)      enable_cocoa_quartz="$optarg";;
			--disable-cocoa-quickdraw)    enable_cocoa_quickdraw="0";;
			--enable-cocoa-quickdraw)     enable_cocoa_quickdraw="2";;
			--enable-cocoa-quickdraw=*)   enable_cocoa_quickdraw="$optarg";;

			--with-allegro)               with_allegro="2";;
			--without-allegro)            with_allegro="0";;
			--with-allegro=*)             with_allegro="$optarg";;

			--with-sdl)                   with_sdl="2";;
			--without-sdl)                with_sdl="0";;
			--with-sdl=*)                 with_sdl="$optarg";;

			--with-cocoa)                 with_cocoa="2";;
			--without-cocoa)              with_cocoa="0";;
			--with-cocoa=*)               with_cocoa="$optarg";;

			--with-zlib)                  with_zlib="2";;
			--without-zlib)               with_zlib="0";;
			--with-zlib=*)                with_zlib="$optarg";;

			--with-lzma)                  with_lzma="2";;
			--without-lzma)               with_lzma="0";;
			--with-lzma=*)                with_lzma="$optarg";;
			--with-liblzma)               with_lzma="2";;
			--without-liblzma)            with_lzma="0";;
			--with-liblzma=*)             with_lzma="$optarg";;

			--with-lzo2)                  with_lzo2="2";;
			--without-lzo2)               with_lzo2="0";;
			--with-lzo2=*)                with_lzo2="$optarg";;
			--with-liblzo2)               with_lzo2="2";;
			--without-liblzo2)            with_lzo2="0";;
			--with-liblzo2=*)             with_lzo2="$optarg";;

			--with-png)                   with_png="2";;
			--without-png)                with_png="0";;
			--with-png=*)                 with_png="$optarg";;
			--with-libpng)                with_png="2";;
			--without-libpng)             with_png="0";;
			--with-libpng=*)              with_png="$optarg";;

			--with-libtimidity)           with_libtimidity="2";;
			--without-libtimidity)        with_libtimidity="0";;
			--with-libtimidity=*)         with_libtimidity="$optarg";;

			--with-freetype)              with_freetype="2";;
			--without-freetype)           with_freetype="0";;
			--with-freetype=*)            with_freetype="$optarg";;
			--with-libfreetype)           with_freetype="2";;
			--without-libfreetype)        with_freetype="0";;
			--with-libfreetype=*)         with_freetype="$optarg";;

			--with-fontconfig)            with_fontconfig="2";;
			--without-fontconfig)         with_fontconfig="0";;
			--with-fontconfig=*)          with_fontconfig="$optarg";;
			--with-libfontconfig)         with_fontconfig="2";;
			--without-libfontconfig)      with_fontconfig="0";;
			--with-libfontconfig=*)       with_fontconfig="$optarg";;

			--with-icu)                   with_icu="2";;
			--without-icu)                with_icu="0";;
			--with-icu=*)                 with_icu="$optarg";;
			--with-libicu)                with_icu="2";;
			--without-libicu)             with_icu="0";;
			--with-libicu=*)              with_icu="$optarg";;
			--static-icu)                 static_icu="1";;
			--static-icu=*)               static_icu="$optarg";;
			--static-libicu)              static_icu="1";;
			--static-libicu=*)            static_icu="$optarg";;

			--with-psp-config)            with_psp_config="2";;
			--without-psp-config)         with_psp_config="0";;
			--with-psp-config=*)          with_psp_config="$optarg";;

			--disable-builtin-depend)     enable_builtin_depend="0";;
			--enable-builtin-depend)      enable_builtin_depend="2";;
			--enable-builtin-depend=*)    enable_builtin_depend="$optarg";;

			--with-makedepend)            with_makedepend="2";;
			--without-makedepend)         with_makedepend="0";;
			--with-makedepend=*)          with_makedepend="$optarg";;

			--with-direct-music)          with_direct_music="2";;
			--without-direct-music)       with_direct_music="0";;
			--with-direct-music=*)        with_direct_music="$optarg";;

			--with-sort)                  with_sort="2";;
			--without-sort)               with_sort="0";;
			--with-sort=*)                with_sort="$optarg";;

			--with-iconv)                 with_iconv="2";;
			--without-iconv)              with_iconv="0";;
			--with-iconv=*)               with_iconv="$optarg";;

			--with-midi=*)                with_midi="$optarg";;
			--with-midi-arg=*)            with_midi_arg="$optarg";;

			--without-distcc)             with_distcc="0";;
			--with-distcc)                with_distcc="2";;
			--with-distcc=*)              with_distcc="$optarg";;

			--without-ccache)             with_ccache="0";;
			--with-ccache)                with_ccache="2";;
			--with-ccache=*)              with_ccache="$optarg";;

			--without-nforenum)           with_nforenum="0";;
			--with-nforenum)              with_nforenum="2";;
			--with-nforenum=*)            with_nforenum="$optarg";;

			--without-grfcodec)           with_grfcodec="0";;
			--with-grfcodec)              with_grfcodec="2";;
			--with-grfcodec=*)            with_grfcodec="$optarg";;

			--without-osx-sysroot)        with_osx_sysroot="0";;
			--with-osx-sysroot)           with_osx_sysroot="2";;
			--with-osx-sysroot=*)         with_osx_sysroot="$optarg";;

			--without-application-bundle) with_application_bundle="0";;
			--with-application-bundle)    with_application_bundle="1";;
			--with-application-bundle=*)  with_application_bundle="$optarg";;

			--without-threads)            with_threads="0";;
			--with-threads)               with_threads="1";;
			--with-threads=*)             with_threads="$optarg";;

			CC=* | --CC=*)                CC="$optarg";;
			CXX=* | --CXX=*)              CXX="$optarg";;
			CFLAGS=* | --CFLAGS=*)        CFLAGS="$optarg";;
			CXXFLAGS=* | --CXXFLAGS=*)    CXXFLAGS="$optarg";;
			LDFLAGS=* | --LDFLAGS=*)      LDFLAGS="$optarg";;
			CFLAGS_BUILD=* | --CFLAGS_BUILD=* | --CFLAGS-BUILD=*)     CFLAGS_BUILD="$optarg";;
			CXXFLAGS_BUILD=* | --CXXFLAGS_BUILD=* | --CXXFLAGS-BUILD=*) CXXFLAGS_BUILD="$optarg";;
			LDFLAGS_BUILD=* | --LDFLAGS_BUILD=* | --LDFLAGS-BUILD=*)   LDFLAGS_BUILD="$optarg";;

			--ignore-extra-parameters)    ignore_extra_parameters="1";;

			--* | -*)
				if [ "$ignore_extra_parameters" = "0" ]; then
					log 1 "Unknown option $p"
					exit 1
				else
					log 1 "Unknown option $p ignored"
				fi
				;;
		esac
	done

	if [ -n "$prev_p" ]; then
		log 1 "configure: error: missing argument to --$prev_p"
		exit 1
	fi

	# Clean the logfile
	echo "" > $config_log
	log 2 "Invocation: $0 $*"
}

save_params() {
	# Here we save all params, so we can later on do an exact redo of this
	#  configuration, without having the user to re-input stuff

	echo "Running configure with following options:" >> $config_log
	echo "" >> $config_log

	configure="$CONFIGURE_EXECUTABLE --ignore-extra-parameters"
	for p in $save_params_array; do
		eval "v=\"\$$p\""
		p=`echo "$p" | sed 's@_@-@g;s@\n@@g;s@ @\\ @g'`
		# Only save those params that aren't empty
		configure="$configure --$p=\"$v\""
	done

	echo "$configure" >> $config_log
	echo "$configure" > config.cache
	echo "" >> $config_log
}

check_params() {
	# Some params want to be in full uppercase, else they might not work as
	# expected.. fix that here

	endian=`echo $endian | tr '[a-z]' '[A-Z]'`
	os=`echo $os | tr '[a-z]' '[A-Z]'`
	cpu_type=`echo $cpu_type | tr '[a-z]' '[A-Z]'`

	# Check if all params have valid values

	# Endian only allows AUTO, LE and, BE
	if [ -z "`echo $endian | egrep '^(AUTO|LE|BE|PREPROCESSOR)$'`" ]; then
		log 1 "configure: error: invalid option --endian=$endian"
		log 1 " Available options are: --endian=[AUTO|LE|BE]"
		exit 1
	fi
	if [ "$endian" = "PREPROCESSOR" ] && [ "$os" != "OSX" ]; then
		log 1 "configure: error: invalid option --endian=$endian"
		log 1 " PREPROCESSOR is only available for OSX"
		exit 1
	fi
	# OS only allows DETECT, UNIX, OSX, FREEBSD, OPENBSD, MORPHOS, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP
	if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP)$'`" ]; then
		log 1 "configure: error: invalid option --os=$os"
		log 1 " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP]"
		exit 1
	fi
	# cpu_type can be either 32 or 64
	if [ -z "`echo $cpu_type | egrep '^(32|64|DETECT)$'`" ]; then
		log 1 "configure: error: invalid option --cpu-type=$cpu_type"
		log 1 " Available options are: --cpu-type[=DETECT|32|64]"
		exit 1
	fi
	# enable_debug should be between 0 and 4
	if [ -z "`echo $enable_debug | egrep '^[0123]$'`" ]; then
		log 1 "configure: error: invalid option --enable-debug=$enable_debug"
		log 1 " Available options are: --enable-debug[=0123]"
		exit 1
	fi

	# enable_desync_debug should be between 0 and 3
	if [ -z "`echo $enable_desync_debug | egrep '^[012]$'`" ]; then
		log 1 "configure: error: invalid option --enable-desync-debug=$enable_desync_debug"
		log 1 " Available options are: --enable-desync-debug[=012]"
		exit 1
	fi

	detect_awk

	detect_os

	check_build
	check_host

	# Check for universal builds; they only make sense for OSX, so fail if enabled for another OS
	if [ "$enable_universal" = "0" ]; then
		log 1 "checking universal build... no"
	else
		if [ "$os" != "OSX" ]; then
			log 1 "configure: error: --enable-universal only works on OSX"
			exit 1
		fi
		log 1 "checking universal build... yes, for: $enable_universal"
	fi

	# Already detected by check_build
	log 1 "checking build cc... $cc_build"
	log 1 "checking host cc... $cc_host"

	check_cxx_build
	check_cxx_host
	check_windres
	if [ "$enable_strip" != "0" ]; then
		check_strip
	else
		log 1 "checking strip... disabled"
	fi
	check_lipo

	if [ "$enable_builtin_depend" != "0" ]; then
		log 1 "checking builtin depend... yes"
		makedepend="\$(SRC_OBJS_DIR)/\$(DEPEND)"
	else
		log 1 "checking builtin depend... no"
	fi

	check_makedepend
	detect_cputype

	if [ "$enable_static" = "1" ]; then
		if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "MORPHOS" ] || [ "$os" = "DOS" ]; then
			enable_static="2"
		else
			enable_static="0"
		fi
	fi

	if [ "$enable_static" != "0" ]; then
		log 1 "checking static... yes"

		if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "OSX" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "DOS" ]; then
			log 1 "WARNING: static is only known to work on Windows, DOS, MacOSX and MorphOS"
			log 1 "WARNING: use static at your own risk on this platform"

			sleep 5
		fi
	else
		log 1 "checking static... no"
	fi

	if [ "$enable_unicode" = "1" ]; then
		if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "DOS" ]; then
			enable_unicode="2"
		else
			enable_unicode="0"
		fi
	fi

	if [ "$enable_unicode" != "0" ]; then
		log 1 "checking unicode... yes"
	else
		log 1 "checking unicode... no"
	fi

	# Show what we configured
	if [ "$enable_debug" = "0" ]; then
		log 1 "using debug level... no"
	elif [ "$enable_profiling" != "0" ]; then
		log 1 "using debug level... profiling (debug level $enable_debug)"
	else
		log 1 "using debug level... level $enable_debug"
	fi

	if [ "$enable_desync_debug" = "0" ]; then
		log 1 "using desync debug level... no"
	else
		log 1 "using desync debug level... level $enable_desync_debug"
		log 1 "WARNING: desync debug functions slow down the game considerably."
		log 1 "WARNING: use only when you are instructed to do so"
		log 1 "         or when you know what you are doing."

		sleep 5
	fi

	if [ "$enable_lto" != "0" ]; then
		# GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}'
		has_lto=`($cxx_build -dumpspecs 2>&1 | grep '\%{flto') || ($cxx_build -help ipo 2>&1 | grep '\-ipo')`
		if [ -n "$has_lto" ]; then
			log 1 "using link time optimization... yes"
		else
			enable_lto="0"
			log 1 "using link time optimization... no"
			log 1 "WARNING: you selected link time optimization but it is not found."
			sleep 5
		fi
	else
		log 1 "using link time optimization... no"
	fi


	if [ "$os" != "OSX" ] && [ "$with_osx_sysroot" != "0" ]; then
		if [ "$with_osx_sysroot" = "1" ]; then
			with_osx_sysroot="0"

			log 1 "checking OSX sysroot... not OSX, skipping"
		else
			log 1 "configure: error: --with-osx-sysroot only works if OSX is the target"
			exit 1
		fi
	fi

	if [ "$with_osx_sysroot" != "0" ]; then
		if [ "$enable_universal" = "0" ] && [ "$with_osx_sysroot" != "1" ] && [ "$with_osx_sysroot" != "2" ]; then
			# Sysroot manually specified? Check for usability
			log 1 "checking OSX sysroot... $with_osx_sysroot"
			if ! check_osx_sdk "$with_osx_sysroot"; then
				log 1 "Passed sysroot not found/not functional"
				exit 1
			fi
		else
			# If autodetect and no universal, use system default
			if [ "$with_osx_sysroot" = "1" ] && [ "$enable_universal" = "0" ]; then
				log 1 "checking OSX sysroot... no (use system default)"
			else
				log 1 "checking OSX sysroot... automatically"
				detect_osx_sdk
			fi
		fi

		if [ -n "$osx_sdk_path" ]; then
			if [ "$enable_universal" != "0" ]; then
				if [ -z "$osx_sdk_104_path" ]; then
					log 1 "WARNING: Could not find a usable 10.4u SDK, the resulting"
					log 1 "WARNING: binary will only run on OSX 10.5 or later"
					osx_sdk_104_path="$osx_sdk_path"
				fi
				OSX_SYSROOT="-isysroot $osx_sdk_104_path"
				OSX_LD_SYSROOT="-Wl,-syslibroot,$osx_sdk_104_path"
			else
				OSX_SYSROOT="-isysroot $osx_sdk_path"
				OSX_LD_SYSROOT="-Wl,-syslibroot,$osx_sdk_path"
			fi
		fi
	else
		if [ "$os" = "OSX" ]; then
			log 1 "checking OSX sysroot... no (use system default)"
		fi
	fi

	detect_allegro
	detect_sdl
	detect_cocoa

	if [ "$enable_dedicated" != "0" ]; then
		log 1 "checking GDI video driver... dedicated server, skipping"
		log 1 "checking dedicated... found"

		if [ "$enable_network" = "0" ]; then
			log 1 "configure: error: building a dedicated server without network support is pointless"
			exit 1
		fi
	else
		if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then
			log 1 "checking GDI video driver... found"
		else
			log 1 "checking GDI video driver... not Windows, skipping"
		fi

		if [ -z "$allegro_config" ] && [ -z "$sdl_config" ] && [ "$with_cocoa" = 0 ] && [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then
			log 1 "configure: error: no video driver development files found"
			log 1 " If you want a dedicated server use --enable-dedicated as parameter"
			exit 1
		else
			log 1 "checking dedicated... not selected"
		fi
	fi

	if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then
		log 1 "checking console application... not Windows, skipping"
	elif [ "$enable_console" = "1" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "checking console application... dedicated server, enabled"
		enable_console="2"
	elif [ "$enable_console" = "1" ]; then
		log 1 "checking console application... disabled (only used when forced)"
		enable_console="0"
	elif [ "$enable_console" = "0" ]; then
		log 1 "checking console application... disabled"
	else
		log 1 "checking console application... enabled"
	fi

	if [ "$enable_network" = "1" ] && [ "$os" = "DOS" ]; then
		log 1 "checking network... DOS, skipping"
		enable_network=0
	elif [ "$enable_network" != "0" ]; then
		log 1 "checking network... found"
	else
		log 1 "checking network... disabled"
	fi

	log 1 "checking squirrel... found"
	SCRIPT_SRC_DIR="$ROOT_DIR/src/3rdparty/squirrel/include"

	if [ "$enable_translator" != "0" ]; then
		log 1 "checking translator... debug"
		# -t shows TODO items, normally they are muted
		strgen_flags="-t"
	else
		log 1 "checking translator... no"
		strgen_flags=""
	fi

	if [ "$enable_assert" != "0" ]; then
		log 1 "checking assert... enabled"
	else
		log 1 "checking assert... disabled"
	fi

	pre_detect_with_zlib=$with_zlib
	detect_zlib

	if [ "$with_zlib" = "0" ] || [ -z "$zlib" ]; then
		log 1 "WARNING: zlib was not detected or disabled"
		log 1 "WARNING: OpenTTD doesn't require zlib, but it does mean that many features"
		log 1 "WARNING: (like loading most old savegames/scenarios, loading heightmaps,"
		log 1 "WARNING: using PNG, or using fonts, ...) will be disabled."
		if [ "$pre_detect_with_zlib" = "0" ]; then
			log 1 "WARNING: We strongly suggest you to install zlib."
		else
			log 1 "configure: error: no zlib detected"
			log 1 " If you want to compile without zlib use --without-zlib as parameter"
			exit
		fi
	fi

	pre_detect_with_lzma=$with_lzma
	detect_lzma

	if [ "$with_lzma" = "0" ] || [ -z "$lzma_config" ]; then
		log 1 "WARNING: lzma was not detected or disabled"
		log 1 "WARNING: OpenTTD doesn't require lzma, but it does mean that many features"
		log 1 "WARNING: (like loading most savegames/scenarios and joining most servers)"
		log 1 "WARNING: will be disabled."
		if [ "$pre_detect_with_lzma" = "0" ]; then
			log 1 "WARNING: We strongly suggest you to install liblzma."
			log 1 "configure: error: no liblzma detected"
		else
			log 1 " If you want to compile without lzma use --without-lzma as parameter"
			exit
		fi
	fi

	pre_detect_with_lzo2=$with_lzo2
	detect_lzo2

	if [ "$with_lzo2" = "0" ] || [ -z "$lzo2" ]; then
		log 1 "WARNING: liblzo2 was not detected or disabled"
		log 1 "WARNING: OpenTTD doesn't require liblzo2, but it does mean that"
		log 1 "WARNING: loading old savegames/scenarios will be disabled."
		if [ "$pre_detect_with_lzo2" = "0" ]; then
			log 1 "WARNING: We strongly suggest you to install liblzo2."
		else
			log 1 "configure: error: no liblzo2 detected"
			log 1 " If you want to compile without liblzo2 use --without-liblzo2 as parameter"
			exit
		fi
	fi

	detect_png
	detect_freetype
	detect_fontconfig
	detect_icu
	detect_pspconfig
	detect_libtimidity

	if [ "$with_direct_music" != "0" ]; then
		if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then
			if [ "$with_direct_music" != "1" ]; then
				log 1 "configure: error: direct-music is only supported on Win32 targets"
				exit 1
			fi
			with_direct_music="0"

			log 1 "checking direct-music... not Windows, skipping"
		else
			check_direct_music
		fi
	fi

	detect_sort

	if [ "$os" = "OSX" ] && [ "$endian" = "AUTO" ]; then
		endian="PREPROCESSOR"
	fi

	log 1 "checking endianess... $endian"

	# Suppress language errors when there is a version defined, indicating a release
	#  It just isn't pretty if any release produces warnings in the languages.
	if [ -f "$ROOT_DIR/version" ]; then
		lang_suppress="yes"
		log 1 "suppress language errors... yes"
	else
		lang_suppress=""
		log 1 "suppress language errors... no"
	fi

	if [ "$enable_debug" = "0" ] && [ "$enable_profiling" = "0" ] && [ "$enable_strip" != "0" ]; then
		if [ "$os" = "MORPHOS" ]; then
			strip_arg="--strip-all --strip-unneeded --remove-section .comment"
		elif [ "$os" = "OSX" ]; then
			strip_arg=""
		elif [ "$os" = "OS2" ]; then
			strip_arg=""
			# OS2 uses strip via gcc, because it needs to be feed to emxbind
			LDFLAGS="$LDFLAGS -s"
		elif [ "$os" = "SUNOS" ]; then
			# The GNU strip does know -s, the non-GNU doesn't
			#  So try to detect it (in a bit of an ugly way)
			strip_arg="`$strip -s strip.test 2>/dev/null && echo \"-s\"`"
		else
			strip_arg="-s"
		fi

		log 1 "checking stripping... $strip $strip_arg"
	else
		strip=""
		log 1 "checking stripping... skipped"
	fi

	if [ "$with_distcc" = "0" ]; then
		log 1 "checking distcc... no"
	elif [ "$with_distcc" = "1" ]; then
		with_distcc="0"

		log 1 "checking distcc... no (only used when forced)"
	elif [ "$with_distcc" = "2" ]; then
		distcc="distcc"
	else
		distcc="$with_distcc"
	fi
	if [ "$with_distcc" != "0" ]; then
		res="`$distcc --version 2>/dev/null | head -n 1 | cut -b 1-6`"
		if [ "$res" != "distcc" ]; then
			distcc=""
			log 1 "checking distcc... no"
			if [ "$with_distcc" = "2" ]; then
				log 1 "configure: error: no distcc detected, but was forced to be used"
				exit 1
			fi
			if [ "$with_distcc" != "1" ]; then
				log 1 "configure: error: '$with_distcc' doesn't seem a distcc to me"
				exit 1
			fi
		fi

		log 1 "checking distcc... $distcc"
	fi

	if [ "$with_ccache" = "0" ]; then
		log 1 "checking ccache... no"
	elif [ "$with_ccache" = "1" ]; then
		with_ccache="0"

		log 1 "checking ccache... no (only used when forced)"
	elif [ "$with_ccache" = "2" ]; then
		ccache="ccache"
	else
		ccache="$with_ccache"
	fi
	if [ "$with_ccache" != "0" ]; then
		res="`$ccache --version 2>/dev/null | head -n 1 | cut -b 1-6`"
		if [ "$res" != "ccache" ]; then
			ccache=""
			log 1 "checking ccache... no"
			if [ "$with_ccache" = "2" ]; then
				log 1 "configure: error: no ccache detected, but was forced to be used"
				exit 1
			fi
			if [ "$with_ccache" != "1" ]; then
				log 1 "configure: error: '$with_ccache' doesn't seem a ccache to me"
				exit 1
			fi
		fi

		log 1 "checking ccache... $ccache"
	fi

	detect_grfcodec
	detect_nforenum

	if [ -z "$grfcodec" ] && [ -n "$nforenum" ]; then
		log 1 "checking nforenum/grfcodec... nforenum needs grfcodec enabled, disabling nforenum"
		nforenum=""
	fi

	if [ -z "$nforenum" ] && [ -n "$grfcodec" ]; then
		log 1 "checking nforenum/grfcodec... grfcodec needs nforenum enabled, disabling grfcodec"
		grfcodec=""
	fi

	if [ "$os" = "DOS" ]; then
		with_threads="0"
	fi

	if [ "$os" != "OSX" ] && [ "$with_application_bundle" != "0" ]; then
		if [ "$with_application_bundle" = "1" ]; then
			with_application_bundle="0"

			log 1 "checking OSX application bundle... not OSX, skipping"
		else
			log 1 "configure: error: --with-application-bundle only works if OSX is the target"
			exit 1
		fi
	fi

	if [ "$os" = "OSX" ] && [ "$with_application_bundle" = "1" ]; then
		OSXAPP="OpenTTD.app"
	else
		OSXAPP=""
	fi

	if [ "$os" = "OSX" ]; then
		# Test on ppc970 (G5) - we can optimize there

		if [ "$enable_osx_g5" != "0" ]; then
			log 1 "detecting ppc970 (G5)... yes (forced)"
		else
			# First, are we a real OSX system, else we can't detect it
			native=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | grep darwin`
			# If $host doesn't match $build , we are cross-compiling
			if [ -n "$native" ] && [ "$build" = "$host" ]; then
				$cxx_build $SRC_DIR/os/macosx/G5_detector.cpp -o G5_detector
				res=`./G5_detector`
				rm -f G5_detector
				if [ -n "$res" ]; then
					# This is G5, add flags for it
					enable_osx_g5="2"

					log 1 "detecting ppc970 (G5)... yes"
				else
					enable_osx_g5="0"

					log 1 "detecting ppc970 (G5)... no"
				fi
			else
				enable_osx_g5="0"

				log 1 "detecting ppc970 (G5)... no (cross-compiling)"
			fi
		fi
	else
		if [ "$enable_osx_g5" != "0" ]; then
			log 1 "configure: error: ppc970 (OSX G5) selected, but not compiling for OSX"
			log 1 "configure: error: either select OSX as OS, or deselect ppc970"

			exit 1
		fi
	fi

	if [ -d "$ROOT_DIR/.svn" ] && [ -n "`svn help 2>/dev/null`" ]; then
		log 1 "checking revision... svn detection"
	elif [ -d "$ROOT_DIR/../.svn" ] && [ -n "`svn help 2>/dev/null`" ] && [ -n "`LC_ALL=C svn info $ROOT_DIR/.. | grep '^URL:.*tags$'`" ]; then
		# subversion changed its behaviour; now not all folders have a .svn folder,
		# but only the root folder. Since making tags requires a (sparse) checkout
		# of the tags folder, the folder of the tag does not have a .svn folder
		# anymore and this fails to detect the subversion repository checkout.
		log 1 "checking revision... svn detection (tag)"
	elif [ -d "$ROOT_DIR/.git" ] && [ -n "`git help 2>/dev/null`" ]; then
		log 1 "checking revision... git detection"
	elif [ -d "$ROOT_DIR/.hg" ] && [ -n "`hg help 2>/dev/null`" ]; then
		log 1 "checking revision... hg detection"
	elif [ -f "$ROOT_DIR/.ottdrev" ]; then
		log 1 "checking revision... source tarball"
	else
		log 1 "checking revision... no detection"
		log 1 "WARNING: there is no means to determine the version."
		log 1 "WARNING: please use a subversion, mercurial, or git checkout of OpenTTD."
		log 1 "WARNING: you can only join game servers that have been compiled without"
		log 1 "WARNING:   version detection."
		log 1 "WARNING: there is a great chance you desync."
		log 1 "WARNING: USE WITH CAUTION!"

		sleep 5
	fi

	if [ "$doc_dir" = "1" ]; then
		if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
			doc_dir="share/doc/openttd"
		else
			doc_dir="$data_dir/docs"
		fi
	else
		doc_dir="`echo $doc_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
	fi

	if [ "$icon_theme_dir" = "1" ]; then
		if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
			icon_theme_dir="share/icons/hicolor"
		else
			icon_theme_dir=""
		fi
	else
		icon_theme_dir="`echo $icon_theme_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
	fi

	if [ "$personal_dir" = "1" ]; then
		if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ] || [ "$os" = "DOS" ] || [ "$os" = "HAIKU" ]; then
			personal_dir="OpenTTD"
		elif [ "$os" = "OSX" ]; then
			personal_dir="Documents/OpenTTD"
		else
			personal_dir=".openttd"
		fi
	else
		personal_dir="`echo $personal_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
	fi

	if [ "$shared_dir" = "1" ]; then
		# we are using default values
		if [ "$os" = "OSX" ]; then
			shared_dir="/Library/Application\\\\ Support/OpenTTD"
		else
			shared_dir=""
		fi
	else
		shared_dir="`echo $shared_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
	fi

	if [ "$man_dir" = "1" ]; then
		# add manpage on UNIX systems
		if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OSX" ]; then
			man_dir="share/man/man6"
		else
			man_dir=""
		fi
	else
		man_dir="`echo $man_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
	fi

	if [ "$menu_dir" = "1" ]; then
		# add a freedesktop menu item only for some UNIX systems
		if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
			menu_dir="share/applications"
		else
			menu_dir=""
		fi
	else
		menu_dir="`echo $menu_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
	fi

	detect_iconv

	if [ -n "$personal_dir" ]
	then
		log 1 "personal home directory... $personal_dir"
	else
		log 1 "personal home directory... none"
	fi

	if [ -n "$shared_dir" ]
	then
		log 1 "shared data directory... $shared_dir"
	else
		log 1 "shared data directory... none"
	fi

	if [ -n "$install_dir" ]
	then
		log 1 "installation directory... $install_dir"
	else
		log 1 "installation directory... none"
	fi

	if [ -n "$icon_theme_dir" ]
	then
		log 1 "icon theme directory... $icon_theme_dir"
	else
		log 1 "icon theme directory... none"
	fi

	if [ -n "$man_dir" ]
	then
		log 1 "manual page directory... $man_dir"
	else
		log 1 "manual page directory... none"
	fi

	if [ -n "$menu_dir" ]
	then
		log 1 "menu item directory... $menu_dir"
	else
		log 1 "menu item directory... none"
	fi
}

make_compiler_cflags() {
	# Params:
	# $1 - compiler
	# $2 - name of the cflags variable
	# $3 - name of the cxxflags variable
	# $4 - name of the ldflags variable
	# $5 - name of the features variable

	eval eval "flags=\\\$$2"
	eval eval "cxxflags=\\\$$3"
	eval eval "ldflags=\\\$$4"
	eval eval "features=\\\$$5"

	if [ `basename $1 | cut -c 1-3` = "icc" ]; then
		# Enable some things only for certain ICC versions
		cc_version=`$1 -dumpversion | cut -c 1-4 | sed s@\\\.@@g`

		flags="$flags -rdynamic"
		ldflags="$ldflags -rdynamic"

		if [ -z "$first_time_icc_check" ]; then
			first_time_icc_check=no
			if [ $cc_version -lt 90 ]; then
				log 1 "WARNING: you seem to be using a very old version of ICC"
				log 1 "WARNING: OpenTTD hasn't been tested with this version"
				sleep 5
			elif [ $cc_version -lt 120 ]; then
				log 1 "WARNING: you seem to be using an unsupported ICC version"
				log 1 "WARNING: ICC older than 12.0 is known to fail to compile OpenTTD"
				sleep 5
			fi
		fi

		flags="$flags -Wall"
		# remark #111: statement is unreachable
		flags="$flags -wd111"
		# remark #181: argument is incompatible with corresponding format string conversion
		# ICC is very picky about signedness of operands, warnings provided by GCC are enough
		flags="$flags -wd181"
		# remark #271: trailing comma is nonstandard
		flags="$flags -wd271"
		# remark #280: selector expression is constant
		flags="$flags -wd280"
		# remark #304: access control not specified ("public" by default)
		flags="$flags -wd304"
		# remark #383: value copied to temporary, reference to temporary used
		flags="$flags -wd383"
		# remark #444: destructor for base class ... is not virtual
		flags="$flags -wd444"
		# remark #593: variable ... was set but never used
		flags="$flags -wd593"
		# warning #654: overloaded virtual function ... is only partially overridden in class ...
		flags="$flags -wd654"
		# remark #810: conversion from ... to ... may lose significant bits
		flags="$flags -wd810"
		# remark #869: parameter ... was never referenced
		flags="$flags -wd869"
		# warning #873: function ... ::operator new ... has no corresponding operator delete ...
		flags="$flags -wd873"
		# remark #981: operands are evaluated in unspecified order
		flags="$flags -wd981"
		# remark #1418: external function definition with no prior declaration
		flags="$flags -wd1418"
		# remark #1419: external declaration in primary source file
		flags="$flags -wd1419"
		# remark #1572: floating-point equality and inequality
		flags="$flags -wd1572"
		# remark #1599: declaration hides variable/parameter ...
		flags="$flags -wd1599"
		# remark #1720: function ... ::operator new ... has no corresponding member operator delete ...
		flags="$flags -wd1720"

		if [ $cc_version -lt 110 ]; then
			# warns about system headers with recent glibc:
			# warning #1292: attribute "__nonnull__" ignored
			flags="$flags -wd1292"
		fi

		if [ $cc_version -ge 100 ]; then
			# warning #1899: multicharacter character literal (potential portability problem)
			flags="$flags -wd1899"
			# vec report defaults to telling where it did loop vectorisation, which is not very important
			flags="$flags -vec-report=0 "
		fi

		if [ $cc_version -ge 110 ]; then
			# remark #2259: non-pointer conversion from ... to ... may lose significant bits
			flags="$flags -wd2259"
			# Use c++0x mode so static_assert() is available
			cxxflags="$cxxflags -std=c++0x"
		fi

		if [ "$enable_lto" != "0" ]; then
			has_ipo=`$1 -help ipo | grep '\-ipo'`
			if [ -n "$has_ipo" ]; then
				# Use IPO (only if we see IPO exists and is requested)
				flags="$flags -ipo"
				features="$features lto"
			fi
		fi
	elif [ `basename $1 | grep 'clang'` ]; then
		# Enable some things only for certain clang versions
		cc_version="`$1 -v 2>&1 | head -n 1 | sed s@[^0-9]@@g | cut -c 1-2`"

		# aliasing rules are not held in openttd code
		flags="$flags -fno-strict-aliasing"

		# -W alone doesn't enable all warnings enabled by -Wall; on the other hand,
		# -Weverything enables too many useless warnings that can't be disabled (as of 3.0)
		flags="$flags -Wall -W"

		# warning: unused parameter '...'
		flags="$flags -Wno-unused-parameter"

		# warning: expression result unused
		flags="$flags -Wno-unused-value"

		# warning: multi-character character constant
		flags="$flags -Wno-multichar"

		# warning: explicitly assigning a variable of type '...' to itself
		# it happens when using the FOR_ALL_WINDOWS_FROM_BACK_FROM macro
		flags="$flags -Wno-self-assign"

		if [ "$cc_version" -lt "30" ]; then
			# warning: equality comparison with extraneous parentheses
			flags="$flags -Wno-parentheses"
			# warning: operands of ? are integers of different signs: 'unsigned int' and 'int'
			flags="$flags -Wno-sign-compare"
		fi

		if [ "$cc_version" -ge "30" ]; then
			# warning: equality comparison with extraneous parentheses
			# this warning could be useful, but it warns about code in squirrel
			flags="$flags -Wno-parentheses-equality"
		fi

		if [ "$with_ccache" != "0" -o "$with_distcc" != "0" ]; then
			# ccache and distcc run separate preprocess and compile passes,
			# both are fed with the same CFLAGS. Unfortunately, clang
			# complains about -I when compiling preprocessed files:
			# "clang: warning: argument unused during compilation: '-I /usr/include'"
			flags="$flags -Qunused-arguments"
		fi

		if [ "$enable_assert" -eq "0" ]; then
			# do not warn about unused variables when building without asserts
			flags="$flags -Wno-unused-variable"
		fi

		# rdynamic is used to get useful stack traces from crash reports.
		ldflags="$ldflags -rdynamic"
	else
		# Enable some things only for certain GCC versions
		cc_version=`$1 -dumpversion | cut -c 1,3`

		if [ $cc_version -lt 33 ]; then
			log 1 "configure: error: gcc older than 3.3 can't compile OpenTTD because of its poor template support"
			exit 1
		fi

		flags="$flags -Wall -Wno-multichar -Wsign-compare -Wundef"
		flags="$flags -Wwrite-strings -Wpointer-arith"
		flags="$flags -W -Wno-unused-parameter -Wredundant-decls"
		flags="$flags -Wformat=2 -Wformat-security"

		if [ $enable_assert -eq 0 ]; then
			# Do not warn about unused variables when building without asserts
			flags="$flags -Wno-unused-variable"
			if [ $cc_version -ge 46 ]; then
				# GCC 4.6 gives more warnings, disable them too
				flags="$flags -Wno-unused-but-set-variable"
				flags="$flags -Wno-unused-but-set-parameter"
			fi
		fi

		if [ $cc_version -ge 34 ]; then
			# Warn when a variable is used to initialise itself:
			# int a = a;
			flags="$flags -Winit-self"
		fi

		if [ $cc_version -ge 40 ]; then
			# GCC 4.0+ complains about that we break strict-aliasing.
			#  On most places we don't see how to fix it, and it doesn't
			#  break anything. So disable strict-aliasing to make the
			#  compiler all happy.
			flags="$flags -fno-strict-aliasing"
			# Warn about casting-out 'const' with regular C-style cast.
			#  The preferred way is const_cast<>() which doesn't warn.
			flags="$flags -Wcast-qual"
		fi

		if [ $cc_version -ge 42 ]; then
			# GCC 4.2+ automatically assumes that signed overflows do
			# not occur in signed arithmetics, whereas we are not
			# sure that they will not happen. It furthermore complains
			# about its own optimized code in some places.
			flags="$flags -fno-strict-overflow"
			# GCC 4.2 no longer includes -Wnon-virtual-dtor in -Wall.
			# Enable it in order to be consistent with older GCC versions.
			flags="$flags -Wnon-virtual-dtor"
		fi

		if [ $cc_version -ge 43 ]; then
			# Use gnu++0x mode so static_assert() is available.
			# Don't use c++0x, it breaks mingw (with gcc 4.4.0).
			cxxflags="$cxxflags -std=gnu++0x"
		fi

		if [ $cc_version -eq 45 ]; then
			# Prevent optimisation supposing enums are in a range specified by the standard
			# For details, see http://gcc.gnu.org/PR43680
			flags="$flags -fno-tree-vrp"
		fi

		if [ $cc_version -ge 47 ]; then
			# Disable -Wnarrowing which gives many warnings, such as:
			# warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing]
			# They are valid according to the C++ standard, but useless.
			cxxflags="$cxxflags -Wno-narrowing"
			# Disable bogus 'attempt to free a non-heap object' warning
			flags="$flags -Wno-free-nonheap-object"
		fi

		if [ "$enable_lto" != "0" ]; then
			# GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}'
			has_lto=`$1 -dumpspecs | grep '\%{flto'`
			if [ -n "$has_lto" ]; then
				# Use LTO only if we see LTO exists and is requested
				if [ $cc_version -lt 46 ]; then
					flags="$flags -flto"
				else
					flags="$flags -flto=jobserver"
				fi
				ldflags="$ldflags -fwhole-program"
				features="$features lto"
			fi
		fi

		has_rdynamic=`$1 -dumpspecs | grep rdynamic`
		if [ -n "$has_rdynamic" ]; then
			# rdynamic is used to get useful stack traces from crash reports.
			flags="$flags -rdynamic"
			ldflags="$ldflags -rdynamic"
		fi
	fi

	eval "$2=\"$flags\""
	eval "$3=\"$cxxflags\""
	eval "$4=\"$ldflags\""
	eval "$5=\"$features\""
}

make_cflags_and_ldflags() {
	# General CFlags for BUILD
	CFLAGS_BUILD="$CFLAGS_BUILD"
	# Special CXXFlags for BUILD
	CXXFLAGS_BUILD="$CXXFLAGS_BUILD"
	# LDFLAGS for BUILD
	LDFLAGS_BUILD="$LDFLAGS_BUILD"
	# FEATURES for BUILD (lto)
	FEATURES_BUILD=""
	# General CFlags for HOST
	CFLAGS="$CFLAGS"
	# Special CXXFlags for HOST
	CXXFLAGS="$CXXFLAGS"
	# Libs to compile. In fact this is just LDFLAGS
	LIBS="-lstdc++"
	# LDFLAGS used for HOST
	LDFLAGS="$LDFLAGS"
	# FEATURES for HOST (lto)
	FEATURES=""

	make_compiler_cflags "$cc_build" "CFLAGS_BUILD" "CXXFLAGS_BUILD" "LDFLAGS_BUILD" "FEATURES_BUILD"
	make_compiler_cflags "$cc_host" "CFLAGS" "CXXFLAGS" "LDFLAGS" "FEATURES"

	CFLAGS="$CFLAGS -D$os"

	if [ "$enable_debug" = "0" ]; then
		# No debug, add default stuff
		OBJS_SUBDIR="release"
		if [ "$os" = "MORPHOS" ]; then
			CFLAGS="-I/gg/os-include -noixemul -fstrict-aliasing -fexpensive-optimizations -mcpu=604 -fno-inline -mstring -mmultiple $CFLAGS"
			LDFLAGS="$LDFLAGS -noixemul"
		fi

		CFLAGS="-O2 -fomit-frame-pointer $CFLAGS"
	else
		OBJS_SUBDIR="debug"

		# Each debug level reduces the optimization by a bit
		if [ $enable_debug -ge 1 ]; then
			CFLAGS="$CFLAGS -g -D_DEBUG"
			if [ "$os" = "PSP" ]; then
				CFLAGS="$CFLAGS -G0"
			fi
		fi
		if [ $enable_debug -ge 2 ]; then
			CFLAGS="$CFLAGS -fno-inline"
		fi
		if [ $enable_debug -ge 3 ]; then
			CFLAGS="$CFLAGS -O0"
		else
			CFLAGS="$CFLAGS -O2"
		fi
	fi

	if [ $enable_debug -le 2 ]; then
		if basename "$cc_host" | grep "gcc" &>/dev/null; then
			# Define only when compiling with GCC. Some GLIBC versions use GNU
			# extensions in a way that breaks build with at least ICC.
			# This requires -O1 or more, so debug level 3 (-O0) is excluded.
			CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"

			# Just add -O1 to the tools needed for building.
			CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1"
		fi
	fi

	if [ "$os" = "OSX" ] && [ $cc_version -eq 40 ]; then
		# Apple's GCC 4.0 has a compiler bug for x86_64 with (higher) optimization,
		# wrongly optimizing ^= in loops. This disables the failing optimisation.
		CFLAGS="$CFLAGS -fno-expensive-optimizations"
	fi

	if [ "$enable_profiling" != "0" ]; then
		CFLAGS="$CFLAGS -p"
		LDFLAGS="$LDFLAGS -pg"
	fi

	if [ "$with_threads" = "0" ]; then
		CFLAGS="$CFLAGS -DNO_THREADS"
	fi

	if [ "`echo $1 | cut -c 1-3`" != "icc" ]; then
		if [ "$os" = "CYGWIN" ]; then
			flags="$flags -mwin32"
			LDFLAGS="$LDFLAGS -mwin32"
		fi
		if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then
			flags="$flags -mno-cygwin"

			if [ "$enable_console" != "0" ]; then
				LDFLAGS="$LDFLAGS -mno-cygwin -Wl,--subsystem,console"
			else
				LDFLAGS="$LDFLAGS -mno-cygwin -Wl,--subsystem,windows"
			fi

			LIBS="$LIBS -lws2_32 -lwinmm -lgdi32 -ldxguid -lole32"

			if [ $cc_version -ge 44 ]; then
				LDFLAGS_BUILD="$LDFLAGS_BUILD -static-libgcc -static-libstdc++"
			fi
			if [ $cc_version -ge 47 ]; then
				CFLAGS="$CFLAGS -mno-ms-bitfields"
			fi
		fi
	fi

	if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then
		LIBS="$LIBS -lpthread"
	fi

	if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "MINGW" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ]; then
		LIBS="$LIBS -lc"
	fi
	if [ "$os" = "WINCE" ]; then
		LIBS="$LIBS -lcoredll -lcorelibc -laygshell -lws2 -e WinMainCRTStartup"
	fi
	if [ "$os" = "PSP" ]; then
		CFLAGS="$CFLAGS -I`$psp_config -p`/include"
		LDFLAGS="$LDFLAGS -L`$psp_config -p`/lib"

		CFLAGS="$CFLAGS -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150"
		LIBS="$LIBS -D_PSP_FW_VERSION=150 -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -lm"
	fi

	if [ "$os" = "MORPHOS" ]; then
		# -Wstrict-prototypes generates much noise because of system headers
		CFLAGS="$CFLAGS -Wno-strict-prototypes"
	fi

	if [ "$os" = "OPENBSD" ]; then
		LIBS="$LIBS -pthread"
	fi

	if [ "$os" = "FREEBSD" ]; then
		LIBS="$LIBS -lpthread"
	fi

	if [ "$os" = "OSX" ]; then
		LDFLAGS="$LDFLAGS -framework Cocoa"

		# Add macports include dir which is not always set a default system dir. This avoids zillions of bogus warnings.
		CFLAGS="$CFLAGS -isystem/opt/local/include"

		if [ "$enable_dedicated" = "0" ] && ([ "$cpu_type" = "32" ] || [ "$enable_universal" != "0" ]); then
			LIBS="$LIBS -framework QuickTime"
		else
			CFLAGS="$CFLAGS -DNO_QUICKTIME"
		fi

		if [ "$enable_universal" = "0" ]; then
			# Universal builds set this elsewhere
			CFLAGS="$OSX_SYSROOT $CFLAGS"
			LDFLAGS="$OSX_LD_SYSROOT $LDFLAGS"
		fi

		if [ "$enable_universal" = "0" ] && [ $cc_version -ge 40 ]; then
			# Only set the min version when not doing an universal build.
			# Universal builds set the version elsewhere.
			if [ "$cpu_type" = "64" ]; then
				CFLAGS="$CFLAGS -mmacosx-version-min=10.5"
			else
				gcc_cpu=`$cc_host -dumpmachine`
				if [ "`echo $gcc_cpu | cut -c 1-3`" = "ppc" -o "`echo $gcc_cpu | cut -c 1-7`" = "powerpc" ]; then
					# PowerPC build can run on 10.3
					CFLAGS="$CFLAGS -mmacosx-version-min=10.3"
				else
					# Intel is only available starting from 10.4
					CFLAGS="$CFLAGS -mmacosx-version-min=10.4"
				fi
			fi
		fi
	fi

	if [ "$os" = "BEOS" ] || [ "$os" = "HAIKU" ]; then
		LIBS="$LIBS -lmidi -lbe"
	fi

	# Most targets act like UNIX, just with some additions
	if [ "$os" = "BEOS" ] || [ "$os" = "HAIKU" ] || [ "$os" = "OSX" ] || [ "$os" = "MORPHOS" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OS2" ]; then
		CFLAGS="$CFLAGS -DUNIX"
	fi
	# And others like Windows
	if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then
		CFLAGS="$CFLAGS -DWIN"
	fi

	if [ -n "$allegro_config" ]; then
		CFLAGS="$CFLAGS -DWITH_ALLEGRO"
		CFLAGS="$CFLAGS `$allegro_config --cflags`"
		if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then
			if [ "$enable_static" != "0" ]; then
				LIBS="$LIBS `$allegro_config --static --libs`"
			else
				LIBS="$LIBS `$allegro_config --libs`"
			fi
		fi
	fi

	if [ -n "$sdl_config" ]; then
		CFLAGS="$CFLAGS -DWITH_SDL"
		# SDL must not add _GNU_SOURCE as it breaks many platforms
		CFLAGS="$CFLAGS `$sdl_config --cflags | sed 's@-D_GNU_SOURCE[^ ]*@@'`"
		if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then
			if [ "$enable_static" != "0" ]; then
				LIBS="$LIBS `$sdl_config --static-libs`"
			else
				LIBS="$LIBS `$sdl_config --libs`"
			fi
		fi
	fi

	if [ "$with_cocoa" != "0" ]; then
		CFLAGS="$CFLAGS -DWITH_COCOA"
		LIBS="$LIBS -F/System/Library/Frameworks -framework Cocoa -framework Carbon -framework AudioUnit -framework AudioToolbox"

		if [ "$enable_cocoa_quartz" != "0" ]; then
			CFLAGS="$CFLAGS -DENABLE_COCOA_QUARTZ"
		fi

		if [ "$enable_cocoa_quickdraw" != "0" ]; then
			CFLAGS="$CFLAGS -DENABLE_COCOA_QUICKDRAW"
		fi
	fi

	if [ "$with_zlib" != "0" ]; then
		if [ "$enable_static" != "0" ] && [ "$os" != "OSX" ]; then
			LIBS="$LIBS $zlib"
		else
			LIBS="$LIBS -lz"
		fi
		CFLAGS="$CFLAGS -DWITH_ZLIB"
	fi

	if [ -n "$lzma_config" ]; then
		CFLAGS="$CFLAGS -DWITH_LZMA"
		CFLAGS="$CFLAGS `$lzma_config --cflags | tr '\n\r' '  '`"

		if [ "$enable_static" != "0" ]; then
			CFLAGS="$CFLAGS -DLZMA_API_STATIC"
			LIBS="$LIBS `$lzma_config --libs --static | tr '\n\r' '  '`"
		else
			LIBS="$LIBS `$lzma_config --libs | tr '\n\r' '  '`"
		fi
	fi

	if [ "$with_lzo2" != "0" ]; then
		if [ "$enable_static" != "0" ] && [ "$os" != "OSX" ]; then
			LIBS="$LIBS $lzo2"
		else
			LIBS="$LIBS -llzo2"
		fi
		CFLAGS="$CFLAGS -DWITH_LZO"
	fi

	# 64bit machines need -D_SQ64
	if [ "$cpu_type" = "64" ] && [ "$enable_universal" = "0" ]; then
		CFLAGS="$CFLAGS -D_SQ64"
	fi
	CFLAGS="$CFLAGS -I$SCRIPT_SRC_DIR"

	if [ -n "$png_config" ]; then
		CFLAGS="$CFLAGS -DWITH_PNG"
		CFLAGS="$CFLAGS `$png_config --cppflags --I_opts | tr '\n\r' '  '`"

		# The extra flags are unneeded for latest libpng-config, but some versions are so broken...
		if [ "$enable_static" != "0" ]; then
			if [ "$os" = "OSX" ]; then
				LIBS="$LIBS `$png_config --prefix`/lib/libpng.a"
			else
				LIBS="$LIBS `$png_config --static --ldflags | tr '\n\r' '  '`"
			fi
		else
			LIBS="$LIBS `$png_config --ldflags | tr '\n\r' '  '`"
		fi
	fi

	if [ -n "$fontconfig_config" ]; then
		CFLAGS="$CFLAGS -DWITH_FONTCONFIG"
		CFLAGS="$CFLAGS `$fontconfig_config --cflags | tr '\n\r' '  '`"

		if [ "$enable_static" != "0" ]; then
			if [ "$os" = "OSX" ]; then
				# fontconfig_config goes via pkg-config on all systems, which doesn't know --prefix
				# Also, despite the reason we link to the .a file ourself (because we can't use -static), we do need to ask pkg-config about possible other deps
				LIBS="$LIBS `$fontconfig_config --variable=prefix`/lib/libfontconfig.a `$fontconfig_config --libs --static | sed s@-lfontconfig@@`"
			else
				LIBS="$LIBS `$fontconfig_config --libs --static | tr '\n\r' '  '`"
			fi
		else
			LIBS="$LIBS `$fontconfig_config --libs | tr '\n\r' '  '`"
		fi
	fi

	if [ -n "$freetype_config" ]; then
		CFLAGS="$CFLAGS -DWITH_FREETYPE"
		CFLAGS="$CFLAGS `$freetype_config --cflags | tr '\n\r' '  '`"

		if [ "$enable_static" != "0" ]; then
			if [ "$os" = "OSX" ]; then
				LIBS="$LIBS `$freetype_config --prefix`/lib/libfreetype.a"
			else
				# Is it possible to do static with freetype, if so: how?
				LIBS="$LIBS `$freetype_config --libs | tr '\n\r' '  '`"
			fi
		else
			LIBS="$LIBS `$freetype_config --libs | tr '\n\r' '  '`"
		fi
	fi

	if [ -n "$icu_config" ]; then
		CFLAGS="$CFLAGS -DWITH_ICU"
		CFLAGS="$CFLAGS `$icu_config --cppflags | tr '\n\r' '  '`"

		# Some icu-configs have the 'feature' of not adding a space where others do add the space
		if [ "$static_icu" != "0" ]; then
			LIBS="$LIBS `$icu_config --ldflags-searchpath` `$icu_config --ldflags-libsonly | tr '\n\r' '  ' | sed s/licu/lsicu/g`"
		else
			LIBS="$LIBS `$icu_config --ldflags-searchpath` `$icu_config --ldflags-libsonly | tr '\n\r' '  '`"
		fi
	fi


	if [ "$with_direct_music" != "0" ]; then
		CFLAGS="$CFLAGS -DWIN32_ENABLE_DIRECTMUSIC_SUPPORT"
		# GCC 4.0+ doesn't like the DirectX includes (gives tons of
		#  warnings on it we won't be able to fix). For now just
		#  suppress those warnings.
		if [ $cc_version -ge 40 ]; then
			CFLAGS="$CFLAGS -Wno-non-virtual-dtor"
		fi
	fi

	if [ -n "$libtimidity" ]; then
		if [ "$enable_static" != "0" ]; then
			LIBS="$LIBS $libtimidity"
		else
			LIBS="$LIBS -ltimidity"
		fi
		CFLAGS="$CFLAGS -DLIBTIMIDITY"
	fi

	if [ "$with_iconv" != "0" ]; then
		CFLAGS="$CFLAGS -DWITH_ICONV"
		if [ "$link_to_iconv" = "yes" ]; then
			LIBS="$LIBS -liconv"
			if [ "$with_iconv" != "2" ]; then
				CFLAGS="$CFLAGS -I$with_iconv/include"
				LIBS="$LIBS -L$with_iconv/lib"
			fi
		fi

		if [ "$have_non_const_iconv" != "no" ]; then
			CFLAGS="$CFLAGS -DHAVE_NON_CONST_ICONV"
		fi
	fi

	if [ -n "$with_midi" ]; then
		CFLAGS="$CFLAGS -DEXTERNAL_PLAYER=\\\\\"$with_midi\\\\\""
	fi
	if [ -n "$with_midi_arg" ]; then
		CFLAGS="$CFLAGS -DMIDI_ARG=\\\\\"$with_midi_arg\\\\\""
	fi

	if [ "$enable_dedicated" != "0" ]; then
		CFLAGS="$CFLAGS -DDEDICATED"
	fi

	if [ "$enable_unicode" != "0" ]; then
		CFLAGS="$CFLAGS -DUNICODE -D_UNICODE"
	fi

	if [ "$enable_network" != "0" ]; then
		CFLAGS="$CFLAGS -DENABLE_NETWORK"

		if [ "$os" = "BEOS" ]; then
			LDFLAGS="$LDFLAGS -lbind -lsocket"
		fi

		if [ "$os" = "HAIKU" ]; then
			LDFLAGS="$LDFLAGS -lnetwork"
		fi

		if [ "$os" = "SUNOS" ]; then
			LDFLAGS="$LDFLAGS -lnsl -lsocket"
		fi
	fi

	if [ "$enable_static" != "0" ]; then
		# OSX can't handle -static in LDFLAGS
		if [ "$os" != "OSX" ]; then
			LDFLAGS="$LDFLAGS -static"
		fi
	fi

	if [ "$enable_assert" = "0" ]; then
		CFLAGS="$CFLAGS -DNDEBUG"
		CFLAGS_BUILD="$CFLAGS_BUILD -DNDEBUG"
	fi

	if [ "$enable_desync_debug" != "0" ]; then
		CFLAGS="$CFLAGS -DRANDOM_DEBUG"
	fi

	if [ "$enable_osx_g5" != "0" ]; then
		CFLAGS="$CFLAGS -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt"
	fi

	if [ -n "$personal_dir" ]; then
		CFLAGS="$CFLAGS -DWITH_PERSONAL_DIR -DPERSONAL_DIR=\\\\\"$personal_dir\\\\\""
	fi

	if [ -n "$shared_dir" ]; then
		CFLAGS="$CFLAGS -DWITH_SHARED_DIR -DSHARED_DIR=\\\\\"$shared_dir\\\\\""
	fi

	CFLAGS="$CFLAGS -DGLOBAL_DATA_DIR=\\\\\"$prefix_dir/$data_dir\\\\\""

	if [ "$enable_lto" != "0" ]; then
		lto_build=`echo "$FEATURES_BUILD" | grep "lto"`
		lto_host=`echo "$FEATURES" | grep "lto"`
		if [ -z "$lto_build$lto_host" ]; then
			log 1 "WARNING: you enabled LTO/IPO, but neither build nor host compiler supports it"
			log 1 "WARNING: LTO/IPO has been disabled"
		fi
		if [ -n "$lto_build" ]; then
			LDFLAGS_BUILD="$LDFLAGS_BUILD $CFLAGS_BUILD $CXXFLAGS_BUILD"
		fi
		if [ -n "$lto_host" ]; then
			LDFLAGS="$LDFLAGS $CFLAGS $CXXFLAGS"
		fi
	fi

	log 1 "using CFLAGS_BUILD... $CFLAGS_BUILD"
	log 1 "using CXXFLAGS_BUILD... $CXXFLAGS_BUILD"
	log 1 "using LDFLAGS_BUILD... $LDFLAGS_BUILD"
	log 1 "using CFLAGS... $CFLAGS"
	log 1 "using CXXFLAGS... $CXXFLAGS"
	log 1 "using LDFLAGS... $LIBS $LDFLAGS"

	# Makedepend doesn't like something like: -isysroot /OSX/blabla
	#  so convert it to: -isysroot -OSX/blabla. makedepend just ignores
	#  any - command it doesn't know, so we are pretty save.
	# Lovely hackish, not?
	# Btw, this almost always comes from outside the configure, so it is
	#  not something we can control.
	# Also make makedepend aware of compiler's built-in defines.
	if [ "$with_makedepend" != "0" ] || [ "$enable_builtin_depend" != "0" ]; then
		# Append CXXFLAGS possibly containing -std=c++0x
		cflags_makedep="`echo | $cxx_host $CXXFLAGS -E -x c++ -dM - | sed 's@.define @-D@g;s@ .*@ @g;s@(.*)@@g' | tr -d '\r\n'`"

		# Please escape ALL " within ` because e.g. "" terminates the string in some sh implementations
		cflags_makedep="$cflags_makedep `echo \"$CFLAGS\" \"$CXXFLAGS\" | sed 's@ /@ -@g;s@-I[ ]*[^ ]*@@g'`"
	else
		makedepend=""
	fi

	if [ "$with_distcc" != "0" ]; then
		cc_host="$distcc $cc_host"
		cxx_host="$distcc $cxx_host"
		log 1 ""
		log 1 " NOTICE: remind yourself to use 'make -jN' to make use of distcc"
		log 1 ""
	fi

	if [ "$with_ccache" != "0" ]; then
		cc_host="$ccache $cc_host"
		cxx_host="$ccache $cxx_host"
	fi
}

check_compiler() {
	# Params:
	# $1 - Type for message (build / host)
	# $2 - What to fill with the found compiler
	# $3 - System to try
	# $4 - Compiler to try
	# $5 - Env-setting to try
	# $6 - GCC alike to try
	# $7 - CC alike to try
	# $8 - "0" gcc, "1" g++, "2" windres, "3" strip, "4" lipo
	# $9 - What the command is to check for

	if [ -n "$3" ]; then
		# Check for system
		if [ -z "$6" ]; then
			compiler="$3"
		else
			compiler="$3-$6"
		fi
		machine=`eval $compiler $9 2>/dev/null`
		ret=$?
		eval "$2=\"$compiler\""

		log 2 "executing $compiler $9"
		log 2 "  returned $machine"
		log 2 "  exit code $ret"

		if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then
			log 1 "checking $1... $compiler not found"
			log 1 "I couldn't detect any $6 binary for $3"
			exit 1
		fi

		if [ "$machine" != "$3" ] && ( [ "$8" = "0" ] || [ "$8" = "1" ] ); then
			log 1 "checking $1... expected $3, found $machine"
			log 1 "the compiler suggests it doesn't build code for the machine you specified"
			exit 1
		fi
	elif [ -n "$4" ]; then
		# Check for manual compiler
		machine=`$4 $9 2>/dev/null`
		ret=$?
		eval "$2=\"$4\""

		log 2 "executing $4 $9"
		log 2 "  returned $machine"
		log 2 "  exit code $ret"

		if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then
			log 1 "checking $1... $4 not found"
			log 1 "the selected binary doesn't seem to be a $6 binary"
			exit 1
		fi
	else
		# Nothing given, autodetect

		if [ -n "$5" ]; then
			machine=`$5 $9 2>/dev/null`
			ret=$?
			eval "$2=\"$5\""

			log 2 "executing $5 $9"
			log 2 "  returned $machine"
			log 2 "  exit code $ret"

			# The user defined a GCC that doesn't reply to $9.. abort
			if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then
				log 1 "checking $1... $5 unusable"
				log 1 "the CC environment variable is set, but it doesn't seem to be a $6 binary"
				log 1 "please redefine the CC/CXX environment to a $6 binary"
				exit 1
			fi
		else
			log 2 "checking $1... CC/CXX not set (skipping)"

			# No $5, so try '$6'
			machine=`$6 $9 2>/dev/null`
			ret=$?
			eval "$2=\"$6\""

			log 2 "executing $6 $9"
			log 2 "  returned $machine"
			log 2 "  exit code $ret"

			if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then
				# Maybe '$7'?
				machine=`$7 $9 2>/dev/null`
				ret=$?
				eval "$2=\"$7\""

				log 2 "executing $7 $9"
				log 2 "  returned $machine"
				log 2 "  exit code $ret"

				# All failed, abort
				if [ -z "$machine" ]; then
					log 1 "checking $1... $6 not found"
					log 1 "I couldn't detect any $6 binary on your system"
					log 1 "please define the CC/CXX environment to where it is located"

					exit 1
				fi
			fi
		fi
	fi

	if [ "$8" != "0" ]; then
		eval "res=\$$2"
		log 1 "checking $1... $res"
	else
		log 1 "checking $1... $machine"
	fi
}

check_build() {
	if [ "$os" = "FREEBSD" ]; then
		# FreeBSD's C compiler does not support dump machine.
		# However, removing C support is not possible because PSP must be linked with the C compiler.
		check_compiler "build system type" "cc_build" "$build" "$cc_build" "$CXX" "g++" "c++" "0" "-dumpmachine"
	else
		check_compiler "build system type" "cc_build" "$build" "$cc_build" "$CC" "gcc" "cc" "0" "-dumpmachine"
	fi
}

check_host() {
	# By default the host is the build
	if [ -z "$host" ]; then host="$build"; fi

	if [ "$os" = "FREEBSD" ]; then
		# FreeBSD's C compiler does not support dump machine.
		# However, removing C support is not possible because PSP must be linked with the C compiler.
		check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CXX" "g++" "c++" "0" "-dumpmachine"
	else
		check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CC" "gcc" "cc" "0" "-dumpmachine"
	fi
}

check_cxx_build() {
	check_compiler "build c++" "cxx_build" "$build" "$cxx_build" "$CXX" "g++" "c++" 1 "-dumpmachine"
}

check_cxx_host() {
	# By default the host is the build
	if [ -z "$host" ]; then host="$build"; fi
	check_compiler "host c++" "cxx_host" "$host" "$cxx_host" "$CXX" "g++" "c++" 1 "-dumpmachine"
}

check_windres() {
	if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then
		check_compiler "host windres" "windres" "$host" "$windres" "$WINDRES" "windres" "windres" "2" "-V"
	fi
}

check_strip() {
	if [ "$os" = "OS2" ]; then
		# OS2 via gcc is a bit weird.. stripping HAS to be done via emxbind, which is via gcc directly
		log 1 "checking host strip... using gcc -s option"
	elif [ "$os" = "OSX" ]; then
		# Most targets have -V in strip, to see if they exists... OSX doesn't.. so execute something
		echo "int main(int argc, char *argv[]) { }" > strip.test.c
		$cxx_host strip.test.c -o strip.test
		check_compiler "host strip" "strip" "$host" "$strip" "$STRIP" "strip" "strip" "3" "strip.test"
		rm -f strip.test.c strip.test
	else
		check_compiler "host strip" "strip" "$host" "$strip" "$STRIP" "strip" "strip" "3" "-V"
	fi
}

check_lipo() {
	if [ "$os" = "OSX" ] && [ "$enable_universal" != "0" ]; then
		echo "int main(int argc, char *argv[]) { }" > lipo.test.c
		$cxx_host lipo.test.c -o lipo.test
		check_compiler "host lipo" "lipo" "$host" "$lipo" "$LIPO" "lipo" "lipo" "4" "-info lipo.test"
		rm -f lipo.test.c lipo.test
	fi
}

check_osx_sdk() {
	local sysroot=""
	if [ -n "$1" ]; then
		if echo "$1" | grep -q / ; then
			# Seems to be a file system path
			osx_sdk_path="$1"
		else
			osx_sdk_path="/Developer/SDKs/MacOSX$1.sdk"
		fi
		if [ ! -d "$osx_sdk_path" ]; then
			# No directory, not present or garbage
			return 1
		fi

		# Set minimum version to 10.4 as that's when kCGBitmapByteOrder32Host was introduced
		sysroot="-isysroot $osx_sdk_path -Wl,-syslibroot,$osx_sdk_path -mmacosx-version-min=10.4"
	fi

cat > tmp.osx.mm << EOF
#include <Cocoa/Cocoa.h>
int main() {
	kCGBitmapByteOrder32Host;
	return 0;
}
EOF
	execute="$cxx_host $sysroot $CFLAGS tmp.osx.mm -framework Cocoa -o tmp.osx 2>&1"
	eval $execute > /dev/null
	ret=$?
	log 2 "executing $execute"
	log 2 "  exit code $ret"
	rm -f tmp.osx.mm tmp.osx
	return $ret
}

check_direct_music() {
	echo "
		#include <windows.h>
		#include <dmksctrl.h>
		#include <dmusici.h>
		#include <dmusicc.h>
		#include <dmusicf.h>
		int main(int argc, char *argv[]) { }" > direct_music.test.c
	$cxx_host $CFLAGS direct_music.test.c -o direct_music.test 2> /dev/null
	res=$?
	rm -f direct_music.test.c direct_music.test

	if [ "$res" != "0" ]; then
		if [ "$with_direct_music" != "1" ]; then
			log 1 "configure: error: direct-music is not available on this system"
			exit 1
		fi
		with_direct_music="0"

		log 1 "checking direct-music... not found"
	else
		log 1 "checking direct-music... found"
	fi
}

check_makedepend() {
	if [ "$enable_builtin_depend" != "0" ]; then
		with_makedepend="0"
	fi

	if [ "$with_makedepend" = "0" ]; then
		log 1 "checking makedepend... disabled"
		return
	fi

	if [ "$with_makedepend" = "1" ] || [ "$with_makedepend" = "2" ]; then
		makedepend="makedepend"
	else
		makedepend="$with_makedepend"
	fi

	rm -f makedepend.tmp
	touch makedepend.tmp
	res=`$makedepend -fmakedepend.tmp 2>/dev/null`
	res=$?
	log 2 "executing $makedepend -f makedepend.tmp"
	log 2 "  returned `cat makedepend.tmp`"
	log 2 "  exit code $ret"

	if [ ! -s makedepend.tmp ]; then
		rm -f makedepend.tmp makedepend.tmp.bak

		if [ "$with_makedepend" = "2" ]; then
			log 1 "checking makedepend... not found"

			log 1 "I couldn't detect any makedepend on your system"
			log 1 "please locate it via --makedepend=[binary]"

			exit 1
		elif [ "$with_makedepend" != "1" ]; then
			log 1 "checking makedepend... $makedepend not found"

			log 1 "the selected file doesn't seem to be a valid makedepend binary"

			exit 1
		else
			log 1 "checking makedepend... not found"

			with_makedepend="0"
			return
		fi
	fi

	rm -f makedepend.tmp makedepend.tmp.bak

	log 1 "checking makedepend... $makedepend"
}

check_version() {
	# $1 - requested version (major.minor)
	# $2 - version we got (major.minor)

	if [ -z "$2" ]; then
		return 0
	fi

	req_major=`echo $1 | cut -d. -f1`
	got_major=`echo $2 | cut -d. -f1`
	if [ $got_major -lt $req_major ]; then
		return 0
	elif [ $got_major -gt $req_major ]; then
		return 1
	fi

	req_minor=`echo $1 | cut -d. -f2`
	got_minor=`echo $2 | cut -d. -f2`
	if [ $got_minor -lt $req_minor ]; then
		return 0
	fi
	return 1
}

detect_awk() {
	# Not all awks allow gsub(), so we test for that here! It is in fact all we need...

	# These awks are known to work. Test for them explicit
	awks="gawk mawk nawk"

	awk_prefix="echo \"a.c b.c c.c\" | tr ' ' \\\\n | "
	awk_param="' { ORS = \" \" } /\.c$/   { gsub(\".c$\",   \".o\", \$0); print \$0; }' 2>/dev/null"
	awk_result="a.o b.o c.o "
	log 2 "Detecing awk..."

	log 2 "Trying: $awk_prefix $awk $awk_param"
	res=`eval $awk_prefix $awk $awk_param`
	log 2 "Result: '$res'"
	if [ "$res" != "$awk_result" ] && [ "$awk" = "awk" ]; then
		# User didn't supply his own awk, so try to detect some other known working names for an awk
		for awk in $awks; do
			log 2 "Trying: $awk_prefix $awk $awk_param"
			res=`eval $awk_prefix $awk $awk_param`
			log 2 "Result: '$res'"
			if [ "$res" = "$awk_result" ]; then break; fi
		done

		if [ "$res" != "$awk_result" ]; then
			log 1 "checking awk... not found"
			log 1 "configure: error: no awk found"
			log 1 "configure: error: please install one of the following: $awks"
			exit 1
		fi
	fi
	if [ "$res" != "$awk_result" ]; then
		log 1 "checking awk... not found"
		log 1 "configure: error: you supplied '$awk' but it doesn't seem a valid gawk or mawk"
		exit 1
	fi

	log 1 "checking awk... $awk"
}

detect_os() {
	if [ "$os" = "DETECT" ]; then
		# Detect UNIX, OSX, FREEBSD, OPENBSD, NETBSD, HPUX, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP

		# Try first via dumpmachine, then via uname
		os=`echo "$host" | tr '[A-Z]' '[a-z]' | $awk '
					/linux/        { print "UNIX";    exit}
					/darwin/       { print "OSX";     exit}
					/freebsd/      { print "FREEBSD"; exit}
					/openbsd/      { print "OPENBSD"; exit}
					/netbsd/       { print "NETBSD";  exit}
					/hp-ux/        { print "HPUX";    exit}
					/morphos/      { print "MORPHOS"; exit}
					/beos/         { print "BEOS";    exit}
					/haiku/        { print "HAIKU";   exit}
					/sunos/        { print "SUNOS";   exit}
					/solaris/      { print "SUNOS";   exit}
					/cygwin/       { print "CYGWIN";  exit}
					/mingw/        { print "MINGW";   exit}
					/os2/          { print "OS2";     exit}
					/dos/          { print "DOS";     exit}
					/wince/        { print "WINCE";   exit}
					/psp/          { print "PSP";     exit}
		'`

		if [ -z "$os" ]; then
			os=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | $awk '
					/linux/        { print "UNIX";    exit}
					/darwin/       { print "OSX";     exit}
					/freebsd/      { print "FREEBSD"; exit}
					/openbsd/      { print "OPENBSD"; exit}
					/netbsd/       { print "NETBSD";  exit}
					/hp-ux/        { print "HPUX";    exit}
					/morphos/      { print "MORPHOS"; exit}
					/beos/         { print "BEOS";    exit}
					/haiku/        { print "HAIKU";   exit}
					/sunos/        { print "SUNOS";   exit}
					/cygwin/       { print "CYGWIN";  exit}
					/mingw/        { print "MINGW";   exit}
					/os\/2/        { print "OS2";     exit}
					/gnu/          { print "UNIX";    exit}
			'`
		fi

		if [ -z "$os" ]; then
			log 1 "detecting OS... none detected"
			log 1 "I couldn't detect your OS. Please use --os=OS to force one"
			log 1 "Allowed values are: UNIX, OSX, FREEBSD, OPENBSD, NETBSD, MORPHOS, HPUX, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP"
			exit 1
		fi

		log 1 "detecting OS... $os"
	else
		log 1 "forcing OS... $os"
	fi
}

detect_allegro() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_allegro" = "0" ]; then
		log 1 "checking Allegro... disabled"

		allegro_config=""
		return 0
	fi

	if [ "$with_allegro" = "2" ] && [ "$with_cocoa" = "2" ]; then
		log 1 "configure: error: it is impossible to compile both Allegro and COCOA"
		log 1 "configure: error: please deselect one of them and try again"
		exit 1
	fi

	if [ "$with_allegro" = "2" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "configure: error: it is impossible to compile a dedicated with Allegro"
		log 1 "configure: error: please deselect one of them and try again"
		exit 1
	fi

	if [ "$enable_dedicated" != "0" ]; then
		log 1 "checking Allegro... dedicated server, skipping"

		allegro_config=""
		return 0
	fi

	# By default on OSX we don't use SDL. The rest is auto-detect
	if [ "$with_allegro" = "1" ] && [ "$os" = "OSX" ] && [ "$with_cocoa" != "0" ]; then
		log 1 "checking Allegro... OSX, skipping"

		allegro_config=""
		return 0
	fi

	if [ "$with_allegro" = "1" ] || [ "$with_allegro" = "" ] || [ "$with_allegro" = "2" ]; then
		allegro_config="allegro-config"
	else
		allegro_config="$with_allegro"
	fi

	version=`$allegro_config --version 2>/dev/null`
	ret=$?
	log 2 "executing $allegro_config --version"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ]; then
		log 1 "checking Allegro... not found"

		# It was forced, so it should be found.
		if [ "$with_allegro" != "1" ]; then
			log 1 "configure: error: allegro-config couldn't be found"
			log 1 "configure: error: you supplied '$with_allegro', but it seems invalid"
			exit 1
		fi

		allegro_config=""
		return 0
	fi

	log 1 "checking Allegro... found"
}


detect_sdl() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_sdl" = "0" ]; then
		log 1 "checking SDL... disabled"

		sdl_config=""
		return 0
	fi

	if [ "$with_sdl" = "2" ] && [ "$with_cocoa" = "2" ]; then
		log 1 "configure: error: it is impossible to compile both SDL and COCOA"
		log 1 "configure: error: please deselect one of them and try again"
		exit 1
	fi

	if [ "$with_sdl" = "2" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "configure: error: it is impossible to compile a dedicated with SDL"
		log 1 "configure: error: please deselect one of them and try again"
		exit 1
	fi

	if [ "$enable_dedicated" != "0" ]; then
		log 1 "checking SDL... dedicated server, skipping"

		sdl_config=""
		return 0
	fi

	# By default on OSX we don't use SDL. The rest is auto-detect
	if [ "$with_sdl" = "1" ] && [ "$os" = "OSX" ] && [ "$with_cocoa" != "0" ]; then
		log 1 "checking SDL... OSX, skipping"

		sdl_config=""
		return 0
	fi

	if [ "$os" = "OSX" ]; then
		log 1 "WARNING: sdl is known to fail on some versions of Mac OS X"
		log 1 "WARNING: with some hardware configurations. Use at own risk!"
		sleep 5
	fi

	if [ "$with_sdl" = "1" ] || [ "$with_sdl" = "" ] || [ "$with_sdl" = "2" ]; then
		sdl_config="sdl-config"
	else
		sdl_config="$with_sdl"
	fi

	version=`$sdl_config --version 2>/dev/null`
	ret=$?
	log 2 "executing $sdl_config --version"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ]; then
		log 1 "checking SDL... not found"

		# It was forced, so it should be found.
		if [ "$with_sdl" != "1" ]; then
			log 1 "configure: error: sdl-config couldn't be found"
			log 1 "configure: error: you supplied '$with_sdl', but it seems invalid"
			exit 1
		fi

		sdl_config=""
		return 0
	fi

	log 1 "checking SDL... found"
}

detect_osx_sdk() {
	# Try to find the best SDK available. For a normal build this
	# is currently the 10.5 SDK as this is needed to compile all
	# optional code. Because such an executable won't run on 10.4
	# or lower, also check for the 10.4u SDK when doing an universal
	# build.

	# Check for the 10.5 SDK, but try 10.6 if that fails
	check_osx_sdk "10.5" ||	check_osx_sdk "10.6" || osx_sdk_path=""

	if [ -z "$osx_sdk_path" ] || [ "$enable_universal" != "0" ]; then
		# No better SDK or universal build enabled? Check 10.4u SDK as well
		local old_sdk="$osx_sdk_path"
		if check_osx_sdk "10.4u"; then
			osx_sdk_104_path="$osx_sdk_path"
		else
			osx_sdk_104_path=""
		fi
		if [ -z "$old_sdk" ]; then
			osx_sdk_path="$osx_sdk_104_path"
		else
			osx_sdk_path="$old_sdk"
		fi
	fi

	if [ -z "$osx_sdk_path" ]; then
		log 1 "Your system SDK is probably too old"
		log 1 "Please install/upgrade your Xcode to >= 2.5"

		exit 1
	fi
}

detect_cocoa() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_cocoa" = "0" ]; then
		log 1 "checking COCOA... disabled"

		return 0
	fi

	if [ "$with_cocoa" = "2" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "configure: error: it is impossible to compile a dedicated with COCOA"
		log 1 "configure: error: please deselect one of them and try again"
		exit 1
	fi

	if [ "$enable_dedicated" != "0" ]; then
		log 1 "checking COCOA... dedicated server, skipping"

		with_cocoa="0"
		return 0
	fi

	# By default on OSX we use COCOA. The rest doesn't support it
	if [ "$with_cocoa" = "1" ] && [ "$os" != "OSX" ]; then
		log 1 "checking COCOA... not OSX, skipping"

		with_cocoa="0"
		return 0
	fi

	if [ "$os" != "OSX" ]; then
		log 1 "checking COCOA... not OSX"

		log 1 "configure: error: COCOA video driver is only supported for OSX"
		exit 1
	fi

	log 1 "checking COCOA... found"


	if [ "$enable_cocoa_quartz" != "0" ]; then
		log 1 "checking whether to enable the Quartz window subdriver... yes"
	else
		log 1 "checking whether to enable the Quartz window subdriver... no"
	fi

	detect_quickdraw
}

detect_quickdraw() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$enable_cocoa_quickdraw" = "0" ]; then
		log 1 "checking Quickdraw window subdriver... disabled"
		return 0
	fi

	# Assume QuickDraw is available when doing an universal build
	if [ "$enable_universal" != "0" ]; then
		log 1 "checking Quickdraw window subdriver... found"
		return 0
	fi

	# 64 bits doesn't have quickdraw
	if [ "$cpu_type" = "64" ]; then
		enable_cocoa_quickdraw="0"
		log 1 "checking Quickdraw window subdriver... disabled (64 bits)"
		return 0
	fi

cat > tmp.osx.mm << EOF
#include <AvailabilityMacros.h>
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[]) { SetEmptyRgn(NULL); return 0; }
EOF
	execute="$cxx_host $OSX_SYSROOT $OSX_LD_SYSROOT $CFLAGS -mmacosx-version-min=10.3 tmp.osx.mm -framework Cocoa -o tmp.osx 2>&1"
	eval $execute > /dev/null
	ret=$?
	log 2 "executing $execute"
	log 2 "  exit code $ret"
	rm -f tmp.osx.mm tmp.osx
	if [ "$ret" != "0" ]; then
		log 1 "checking Quickdraw window subdriver... not found"

		# It was forced, so it should be found.
		if [ "$enable_cocoa_quickdraw" != "1" ]; then
			log 1 "configure: error: Quickdraw window driver could not be found"
			exit 1
		fi

		enable_cocoa_quickdraw=0
		return 0
	fi

	enable_cocoa_quickdraw=1
	log 1 "checking Quickdraw window subdriver... found"
}

detect_library() {
	# $1 - config-param ($with_zlib value)
	# $2 - library name ('zlib', sets $zlib)
	# $3 - static library name (libz.a)
	# $4 - header directory ()
	# $5 - header name (zlib.h)
	# $6 - force static (if non-empty)

	if [ -n "$6" ]; then force_static="1"; fi

	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$1" = "0" ]; then
		log 1 "checking $2... disabled"

		eval "$2=\"\""
		return 0
	fi

	log 2 "detecting $2"

	if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then
		eval "$2=`ls -1 /usr/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
		eval "res=\$$2"
		if [ -z "$res" ]; then
			log 2 "  trying /usr/include/$4$5... no"
			eval "$2=`ls -1 /usr/local/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
		fi
		eval "res=\$$2"
		if [ -z "$res" ]; then
			log 2 "  trying /usr/local/include/$4$5... no"
			eval "$2=`ls -1 /mingw/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
		fi
		eval "res=\$$2"
		if [ -z "$res" ]; then
			log 2 "  trying /mingw/include/$4$5... no"
			eval "$2=`ls -1 /opt/local/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
		fi
		eval "res=\$$2"
		if [ -z "$res" ]; then
			log 2 "  trying /opt/local/include/$4$5... no"
		fi
		if [ -z "$res" ] && [ "$os" = "NETBSD" ]; then
			eval "$2=`ls -1 /usr/pkg/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
			eval "res=\$$2"
			if [ -z "$res" ]; then
				log 2 "  trying /usr/pkg/include/$4$5... no"
			fi
		fi
		if [ -z "$res" ] && [ "$os" = "HAIKU" ]; then
			eval "$2=`ls -1 /boot/common/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
			eval "res=\$$2"
			if [ -z "$res" ]; then
				log 2 "  trying /boot/common/include/$4$5... no"
			fi
		fi

		eval "res=\$$2"
		if [ -n "$res" ] && ( [ -n "$force_static" ] || ( [ "$enable_static" != "0" ] && [ "$os" != "OSX" ] ) ); then
			eval "res=\$$2"
			log 2 "  trying $res... found"
			# Now find the static lib, if needed
			eval "$2=`ls /lib/*.a 2>/dev/null | egrep \"\/$3\$\"`"
			eval "res=\$$2"
			if [ -z "$res" ]; then
				log 2 "  trying /lib/$3... no"
				eval "$2=`ls /usr/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`"
			fi
			eval "res=\$$2"
			if [ -z "$res" ]; then
				log 2 "  trying /usr/lib/$3... no"
				eval "$2=`ls /usr/local/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`"
			fi
			eval "res=\$$2"
			if [ -z "$res" ]; then
				log 2 "  trying /usr/local/lib/$3... no"
				eval "$2=`ls /mingw/lib/*.a 2>/dev/null | egrep \"\/$3\$\"`"
			fi
			eval "res=\$$2"
			if [ -z "$res" ]; then
				log 2 "  trying /mingw/lib/$3... no"
				log 1 "configure: error: $2 couldn't be found"
				log 1 "configure: error: you requested a static link, but I can't find $3"

				exit 1
			fi
		fi
	else
		# Make sure it exists
		if [ -f "$1" ]; then
			eval "$2=`ls $1 2>/dev/null`"
		else
			eval "$2=`ls $1/$3 2>/dev/null`"
		fi
	fi

	eval "res=\$$2"
	if [ -z "$res" ]; then
		log 1 "checking $2... not found"
		if [ "$1" = "2" ]; then
			log 1 "configure: error: $2 couldn't be found"

			exit 1
		elif [ "$1" != "1" ]; then
			log 1 "configure: error: $2 couldn't be found"
			log 1 "configure: error: you supplied '$1', but it seems invalid"

			exit 1
		fi

		eval "with_$2=0"

		return 0
	fi

	eval "res=\$$2"
	log 2 "  trying $res... found"

	log 1 "checking $2... found"
}

detect_zlib() {
	detect_library "$with_zlib" "zlib" "libz.a" "" "zlib.h"
}

detect_lzo2() {
	detect_library "$with_lzo2" "lzo2" "liblzo2.a" "lzo/" "lzo1x.h"
}

detect_libtimidity() {
	detect_library "$with_libtimidity" "libtimidity" "libtimidity.a" "" "timidity.h"
}

detect_lzma() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_lzma" = "0" ]; then
		log 1 "checking liblzma... disabled"

		lzma_config=""
		return 0
	fi

	if [ "$with_lzma" = "1" ] || [ "$with_lzma" = "" ] || [ "$with_lzma" = "2" ]; then
		lzma_config="pkg-config liblzma"
	else
		lzma_config="$with_lzma"
	fi

	version=`$lzma_config --modversion 2>/dev/null`
	ret=$?
	log 2 "executing $lzma_config --modversion"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ]; then
		log 1 "checking liblzma... not found"

		# It was forced, so it should be found.
		if [ "$with_lzma" != "1" ]; then
			log 1 "configure: error: pkg-config liblzma couldn't be found"
			log 1 "configure: error: you supplied '$with_lzma', but it seems invalid"
			exit 1
		fi

		lzma_config=""
		return 0
	fi

	log 1 "checking liblzma... found"
}

detect_png() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_png" = "0" ]; then
		log 1 "checking libpng... disabled"

		png_config=""
		return 0
	fi

	if [ "$with_zlib" = "0" ] || [ -z "$zlib" ]; then
		if [ "$with_png" != "1" ]; then
			log 1 "checking libpng... no zlib"
			log 1 "ERROR: libpng was forced, but zlib was not detected / disabled."
			log 1 "ERROR: libpng depends on zlib."

			exit 1
		fi

		log 1 "checking libpng... no zlib, skipping"

		png_config=""
		return 0
	fi

	if [ "$with_png" = "1" ] || [ "$with_png" = "" ] || [ "$with_png" = "2" ]; then
		png_config="libpng-config"
	else
		png_config="$with_png"
	fi

	version=`$png_config --version 2>/dev/null`
	ret=$?
	log 2 "executing $png_config --version"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ]; then
		log 1 "checking libpng... not found"

		# It was forced, so it should be found.
		if [ "$with_png" != "1" ]; then
			log 1 "configure: error: libpng-config couldn't be found"
			log 1 "configure: error: you supplied '$with_png', but it seems invalid"
			exit 1
		fi

		png_config=""
		return 0
	fi

	log 1 "checking libpng... found"
}

detect_freetype() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_freetype" = "0" ]; then
		log 1 "checking libfreetype... disabled"

		freetype_config=""
		return 0
	fi
	if [ "$with_freetype" = "1" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "checking libfreetype... dedicated server, skipping"

		freetype_config=""
		return 0
	fi

	if [ "$with_zlib" = "0" ] || [ -z "$zlib" ]; then
		if [ "$with_freetype" != "1" ]; then
			log 1 "checking libfreetype... no zlib"
			log 1 "ERROR: libfreetype was forced, but zlib was not detected / disabled."
			log 1 "ERROR: libfreetype depends on zlib."

			exit 1
		fi

		log 1 "checking libfreetype... no zlib, skipping"

		freetype_config=""
		return 0
	fi

	if [ "$with_freetype" = "1" ] || [ "$with_freetype" = "" ] || [ "$with_freetype" = "2" ]; then
		freetype_config="freetype-config"
	else
		freetype_config="$with_freetype"
	fi

	version=`$freetype_config --version 2>/dev/null`
	ret=$?
	log 2 "executing freetype_config --version"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ]; then
		log 1 "checking libfreetype... not found"

		# It was forced, so it should be found.
		if [ "$with_freetype" != "1" ]; then
			log 1 "configure: error: freetype-config couldn't be found"
			log 1 "configure: error: you supplied '$with_freetype', but it seems invalid"
			exit 1
		fi

		freetype_config=""
		return 0
	fi

	log 1 "checking libfreetype... found"
}

detect_fontconfig() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_fontconfig" = "0" ]; then
		log 1 "checking libfontconfig... disabled"

		fontconfig_config=""
		return 0
	fi
	if [ "$with_fontconfig" = "1" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "checking libfontconfig... dedicated server, skipping"

		fontconfig_config=""
		return 0
	fi
	if [ "$with_fontconfig" != "2" ] && [ -z "$freetype_config" ]; then
		log 1 "checking libfontconfig... no freetype, skipping"

		fontconfig_config=""
		return 0
	fi

	if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then
		log 1 "checking libfontconfig... WIN32, skipping"
		fontconfig_config=""
		return 0
	fi

	if [ "$os" = "OSX" ]; then
		log 1 "checking libfontconfig... OSX, skipping"
		fontconfig_config=""
		return 0
	fi

	if [ "$with_fontconfig" = "1" ] || [ "$with_fontconfig" = "" ] || [ "$with_fontconfig" = "2" ]; then
		fontconfig_config="pkg-config fontconfig"
	else
		fontconfig_config="$with_fontconfig"
	fi

	version=`$fontconfig_config --modversion 2>/dev/null`
	ret=$?
	check_version '2.3' "$version"
	version_ok=$?
	log 2 "executing $fontconfig_config --modversion"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
		if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
			log 1 "checking libfontconfig... needs at least version 2.3.0, fontconfig NOT enabled"
		else
			log 1 "checking libfontconfig... not found"
		fi

		# It was forced, so it should be found.
		if [ "$with_fontconfig" != "1" ]; then
			log 1 "configure: error: fontconfig-config couldn't be found"
			log 1 "configure: error: you supplied '$with_fontconfig', but it seems invalid"
			exit 1
		fi

		fontconfig_config=""
		return 0
	fi

	log 1 "checking libfontconfig... found"
}

detect_icu() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_icu" = "0" ]; then
		log 1 "checking libicu... disabled"

		icu_config=""
		return 0
	fi
	if [ "$with_icu" = "1" ] && [ "$enable_dedicated" != "0" ]; then
		log 1 "checking libicu... dedicated server, skipping"

		icu_config=""
		return 0
	fi

	if [ "$with_icu" = "1" ] || [ "$with_icu" = "" ] || [ "$with_icu" = "2" ]; then
		icu_config="icu-config"
	else
		icu_config="$with_icu"
	fi

	version=`$icu_config --version 2>/dev/null`
	ret=$?
	check_version '3.6' "$version"
	version_ok=$?
	log 2 "executing $icu_config --version"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
		if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
			log 1 "checking libicu... needs at least version 3.6.0, icu NOT enabled"
		else
			log 1 "checking libicu... not found"
		fi

		# It was forced, so it should be found.
		if [ "$with_icu" != "1" ]; then
			log 1 "configure: error: icu-config couldn't be found"
			log 1 "configure: error: you supplied '$with_icuconfig', but it seems invalid"
			exit 1
		fi

		icu_config=""
		return 0
	fi

	log 1 "checking libicu... found"
}

detect_pspconfig() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_psp_config" = "0" ]; then
		log 1 "checking psp-config... disabled"

		psp_config=""
		return 0
	fi

	if [ "$with_psp_config" = "1" ] && [ "$os" != "PSP" ]; then
		log 1 "checking psp-config... not PSP, skipping"

		psp_config="";
		return 0
	fi

	if [ "$os" != "PSP" ]; then
		log 1 "checking psp-config... not PSP"

		log 1 "configure: error: psp-config is only supported for PSP"
		exit 1
	fi

	if [ "$with_psp_config" = "1" ] || [ "$with_psp_config" = "" ] || [ "$with_psp_config" = "2" ]; then
		psp_config="psp-config"
	else
		psp_config="$with_psp_config"
	fi

	version=`$psp_config -p 2>/dev/null`
	ret=$?
	log 2 "executing $psp_config -p"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ]; then
		log 1 "checking psp-config... not found"
		log 1 "configure: error: psp-config couldn't be found"

		# It was forced, so it should be found.
		if [ "$with_psp_config" != "1" ]; then
			log 1 "configure: error: you supplied '$with_psp_config', but it seems invalid"
		fi
		exit 1
	fi

	log 1 "checking psp-config... found"
}

detect_iconv() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_iconv" = "0" ]; then
		log 1 "checking iconv... disabled"

		return 0
	fi

	if [ "$with_iconv" = "1" ] && [ "$os" != "OSX" ]; then
		log 1 "checking iconv... not OSX, skipping"
		with_iconv="0"

		return 0
	fi

	# Try to find iconv.h, seems to only thing to detect iconv with

	if [ "$with_iconv" = "1" ] || [ "$with_iconv" = "" ] || [ "$with_iconv" = "2" ]; then
		iconv=`ls -1 /usr/include 2>/dev/null | grep "iconv.h"`
		if [ -z "$iconv" ]; then
			iconv=`ls -1 /usr/local/include 2>/dev/null | grep "iconv.h"`
		fi
	else
		# Make sure it exists
		iconv=`ls $with_iconv/include/iconv.h 2>/dev/null`
	fi

	if [ -z "$iconv" ]; then
		log 1 "checking iconv... not found"
		if [ "$with_iconv" = "2" ]; then
			log 1 "configure: error: iconv couldn't be found"

			exit 1
		elif [ "$with_iconv" != "1" ]; then
			log 1 "configure: error: iconv couldn't be found"
			log 1 "configure: error: you supplied '$with_iconv', but I couldn't detect iconv in it"

			exit 1
		fi

		return 0
	fi

	if [ "$with_iconv" = "1" ]; then
		with_iconv="2"
	fi

	log 2 "found iconv in $iconv"

	log 1 "checking iconv... found"

	# There are different implementations of iconv. The older ones,
	# e.g. SUSv2, pass a const pointer, whereas the newer ones, e.g.
	# IEEE 1003.1 (2004), pass a non-const pointer.

	cat > tmp.iconv.cpp << EOF
#include "src/stdafx.h"
#include <iconv.h>
int main() {
	static char buf[1024];
	iconv_t convd = 0;
	const char *inbuf = "";
	char *outbuf  = buf;
	size_t outlen = 1023;
	size_t inlen  = 0;
	return iconv(convd, &inbuf, &inlen, &outbuf, &outlen);
}
EOF
	execute="$cxx_host $OSX_SYSROOT $CFLAGS -c tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
	eval $execute > /dev/null
	ret=$?
	log 2 "executing $execute"
	log 2 "  exit code $ret"
	if [ "$ret" = "0" ]; then have_non_const_iconv="no"; else have_non_const_iconv="yes"; fi
	log 1 "checking if iconv has non-const inbuf... $have_non_const_iconv"

	cat > tmp.iconv.cpp << EOF
#include "src/stdafx.h"
#include <iconv.h>
int main() {
	static char buf[1024];
	iconv_t convd = 0;
	char *inbuf = "";
	char *outbuf  = buf;
	size_t outlen = 1023;
	size_t inlen  = 0;
	return iconv(convd, &inbuf, &inlen, &outbuf, &outlen);
}
EOF
	execute="$cxx_host $OSX_SYSROOT $OSX_LD_SYSROOT $CFLAGS tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
	eval $execute > /dev/null
	ret=$?
	log 2 "executing $execute"
	log 2 "  exit code $ret"
	if [ "$ret" = "0" ]; then link_to_iconv="no"; else link_to_iconv="yes"; fi
	log 1 "checking whether to link to iconv... $link_to_iconv"
	rm -f tmp.iconv tmp.iconv.cpp
}

_detect_sort() {
	sort_test_in="d
a
c
b"

	sort_test_out="a
b
c
d"

	log 2 "running echo <array> | $1"

	if [ "`echo \"$sort_test_in\" | $1 2>/dev/null`" = "$sort_test_out" ]; then
		sort="$1"
		log 2 "  result was valid"
	else
		log 2 "  result was invalid"
	fi
}

detect_sort() {
	if [ "$with_sort" = "0" ]; then
		log 1 "checking sort... disabled"

		return
	fi

	if [ "$with_sort" = "1" ] || [ "$with_sort" = "2" ]; then
		_detect_sort "sort"
		if [ -z "$sort" ]; then _detect_sort "/sbin/sort"; fi
		if [ -z "$sort" ]; then _detect_sort "/usr/sbin/sort"; fi
		if [ -z "$sort" ]; then _detect_sort "/usr/local/sbin/sort"; fi
		if [ -z "$sort" ]; then _detect_sort "/bin/sort"; fi
		if [ -z "$sort" ]; then _detect_sort "/usr/bin/sort"; fi
		if [ -z "$sort" ]; then _detect_sort "/usr/local/bin/sort"; fi
	else
		_detect_sort "$with_sort"
	fi

	if [ -z "$sort" ]; then
		if [ "$with_sort" = "2" ]; then
			log 1 "checking sort... not found"

			log 1 "configure: error: couldn't detect sort on your system"
			exit 1
		elif [ "$with_sort" != "1" ]; then
			log 1 "checking sort... $with_sort not found"

			log 1 "configure: error: '$with_sort' doesn't look like a sort to me"
			log 1 "configure: error: please verify its location and function and try again"

			exit 1
		else
			log 1 "checking sort... not found"
		fi
	else
		log 1 "checking sort... $sort"
	fi
}

detect_grfcodec() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_grfcodec" = "0" ]; then
		log 1 "checking grfcodec... disabled"

		grfcodec=""
		return 0
	fi

	if [ "$with_grfcodec" = "1" ] || [ "$with_grfcodec" = "" ] || [ "$with_grfcodec" = "2" ]; then
		grfcodec="grfcodec"
	else
		grfcodec="$with_grfcodec"
	fi

	version=`$grfcodec -v 2>/dev/null | $awk '{print $3}' | sed 's/[rM]//g;s/-/0/'`
	ret=$?
	log 2 "executing grfcodec -v"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "949" ]; then
		if [ -n "$version" ] && [ "$version" -lt "949" ]; then
			log 1 "checking grfcodec... needs at least version 6.0.2 (r949), disabled"
		else
			log 1 "checking grfcodec... not found"
		fi

		# It was forced, so it should be found.
		if [ "$with_grfcodec" != "1" ]; then
			log 1 "configure: error: grfcodec couldn't be found"
			log 1 "configure: error: you supplied '$with_grfcodec', but it seems invalid"
			exit 1
		fi

		grfcodec=""
		return 0
	fi

	log 1 "checking grfcodec... found"
}

detect_nforenum() {
	# 0 means no, 1 is auto-detect, 2 is force
	if [ "$with_nforenum" = "0" ]; then
		log 1 "checking nforenum... disabled"

		nforenum=""
		return 0
	fi

	if [ "$with_nforenum" = "1" ] || [ "$with_nforenum" = "" ] || [ "$with_nforenum" = "2" ]; then
		nforenum="nforenum"
	else
		nforenum="$with_nforenum"
	fi

	version=`$nforenum -v 2>/dev/null | $awk '{print $3}' | sed 's/[rM]//g;s/-/0/'`
	ret=$?
	log 2 "executing nforenum -v"
	log 2 "  returned $version"
	log 2 "  exit code $ret"

	if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "949" ]; then
		if [ -n "$version" ] && [ "$version" -lt "949" ]; then
			log 1 "checking nforenum... needs at least version 6.0.2 (r949), disabled"
		else
			log 1 "checking nforenum... not found"
		fi

		# It was forced, so it should be found.
		if [ "$with_nforenum" != "1" ]; then
			log 1 "configure: error: nforenum couldn't be found"
			log 1 "configure: error: you supplied '$with_nforenum', but it seems invalid"
			exit 1
		fi

		nforenum=""
		return 0
	fi

	log 1 "checking nforenum... found"
}

detect_cputype() {
	if [ -n "$cpu_type" ] && [ "$cpu_type" != "DETECT" ]; then
		log 1 "forcing cpu-type... $cpu_type bits"
		return;
	fi
	echo "#define _SQ64 1" > tmp.64bit.cpp
	echo "#include \"src/stdafx.h\"" >> tmp.64bit.cpp
	echo "assert_compile(sizeof(size_t) == 8);" >> tmp.64bit.cpp
	echo "int main() { return 0; }" >> tmp.64bit.cpp
	execute="$cxx_host $CFLAGS tmp.64bit.cpp -o tmp.64bit -DTESTING 2>&1"
	cpu_type="`eval $execute 2>/dev/null`"
	ret=$?
	log 2 "executing $execute"
	log 2 "  returned $cpu_type"
	log 2 "  exit code $ret"
	if [ "$ret" = "0" ]; then cpu_type="64"; else cpu_type="32"; fi
	log 1 "detecting cpu-type... $cpu_type bits"
	rm -f tmp.64bit tmp.64bit.cpp
}

make_sed() {
	T_CFLAGS="$CFLAGS"
	T_CXXFLAGS="$CXXFLAGS"
	T_LDFLAGS="$LDFLAGS"

	SRC_OBJS_DIR="$BASE_SRC_OBJS_DIR/$OBJS_SUBDIR"

	# All the data needed to compile a single target
	#  Make sure if you compile multiple targets to
	#  use multiple OBJS_DIR, because all in-between
	#  binaries are stored in there, and nowhere else.
	SRC_REPLACE="
		s@!!CC_HOST!!@$cc_host@g;
		s@!!CXX_HOST!!@$cxx_host@g;
		s@!!CC_BUILD!!@$cc_build@g;
		s@!!CXX_BUILD!!@$cxx_build@g;
		s@!!WINDRES!!@$windres@g;
		s@!!STRIP!!@$strip $strip_arg@g;
		s@!!LIPO!!@$lipo@g;
		s@!!CFLAGS!!@$T_CFLAGS@g;
		s@!!CFLAGS_BUILD!!@$CFLAGS_BUILD@g;
		s@!!CXXFLAGS!!@$T_CXXFLAGS@g;
		s@!!CXXFLAGS_BUILD!!@$CXXFLAGS_BUILD@g;
		s@!!STRGEN_FLAGS!!@$strgen_flags@g;
		s@!!LIBS!!@$LIBS@g;
		s@!!LDFLAGS!!@$T_LDFLAGS@g;
		s@!!LDFLAGS_BUILD!!@$LDFLAGS_BUILD@g;
		s@!!BIN_DIR!!@$BIN_DIR@g;
		s@!!ROOT_DIR!!@$ROOT_DIR@g;
		s@!!MEDIA_DIR!!@$MEDIA_DIR@g;
		s@!!SOURCE_LIST!!@$SOURCE_LIST@g;
		s@!!SRC_OBJS_DIR!!@$SRC_OBJS_DIR@g;
		s@!!LANG_OBJS_DIR!!@$LANG_OBJS_DIR@g;
		s@!!GRF_OBJS_DIR!!@$GRF_OBJS_DIR@g;
		s@!!SETTING_OBJS_DIR!!@$SETTING_OBJS_DIR@g;
		s@!!SRC_DIR!!@$SRC_DIR@g;
		s@!!SCRIPT_SRC_DIR!!@$SCRIPT_SRC_DIR@g;
		s@!!OSXAPP!!@$OSXAPP@g;
		s@!!LANG_DIR!!@$LANG_DIR@g;
		s@!!TTD!!@$TTD@g;
		s@!!BINARY_DIR!!@$prefix_dir/$binary_dir@g;
		s@!!DATA_DIR!!@$prefix_dir/$data_dir@g;
		s@!!DOC_DIR!!@$prefix_dir/$doc_dir@g;
		s@!!MAN_DIR!!@$prefix_dir/$man_dir@g;
		s@!!ICON_DIR!!@$prefix_dir/$icon_dir@g;
		s@!!ICON_THEME_DIR!!@$prefix_dir/$icon_theme_dir@g;
		s@!!PERSONAL_DIR!!@$personal_dir@g;
		s@!!SHARED_DIR!!@$shared_dir@g;
		s@!!INSTALL_DIR!!@$install_dir@g;
		s@!!BINARY_NAME!!@$binary_name@g;
		s@!!STRGEN!!@$STRGEN@g;
		s@!!ENDIAN_CHECK!!@$ENDIAN_CHECK@g;
		s@!!DEPEND!!@$DEPEND@g;
		s@!!SETTINGSGEN!!@$SETTINGSGEN@g;
		s@!!ENDIAN_FORCE!!@$endian@g;
		s@!!STAGE!!@$STAGE@g;
		s@!!MAKEDEPEND!!@$makedepend@g;
		s@!!CFLAGS_MAKEDEP!!@$cflags_makedep@g;
		s@!!SORT!!@$sort@g;
		s@!!CONFIG_CACHE_COMPILER!!@config.cache.compiler@g;
		s@!!CONFIG_CACHE_LINKER!!@config.cache.linker@g;
		s@!!CONFIG_CACHE_ENDIAN!!@config.cache.endian@g;
		s@!!CONFIG_CACHE_SOURCE!!@config.cache.source@g;
		s@!!CONFIG_CACHE_VERSION!!@config.cache.version@g;
		s@!!CONFIG_CACHE_SOURCE_LIST!!@config.cache.source.list@g;
		s@!!CONFIG_CACHE_PWD!!@config.cache.pwd@g;
		s@!!LANG_SUPPRESS!!@$lang_suppress@g;
		s@!!OBJS_C!!@$OBJS_C@g;
		s@!!OBJS_CPP!!@$OBJS_CPP@g;
		s@!!OBJS_MM!!@$OBJS_MM@g;
		s@!!OBJS_RC!!@$OBJS_RC@g;
		s@!!SRCS!!@$SRCS@g;
		s@!!OS!!@$os@g;
		s@!!CONFIGURE_FILES!!@$CONFIGURE_FILES@g;
		s@!!AWK!!@$awk@g;
		s@!!DISTCC!!@$distcc@g;
		s@!!NFORENUM!!@$nforenum@g;
		s@!!GRFCODEC!!@$grfcodec@g;
	"

	if [ "$icon_theme_dir" != "" ]; then
		SRC_REPLACE="$SRC_REPLACE
			s@!!ICON_THEME_DIR!!@$prefix_dir/$icon_theme_dir@g;
		"
	else
		SRC_REPLACE="$SRC_REPLACE
			s@!!ICON_THEME_DIR!!@@g;
		"
	fi

	if [ "$man_dir" != "" ]; then
		SRC_REPLACE="$SRC_REPLACE
			s@!!MAN_DIR!!@$prefix_dir/$man_dir@g;
		"
	else
		SRC_REPLACE="$SRC_REPLACE
			s@!!MAN_DIR!!@@g;
		"
	fi

	if [ "$menu_dir" != "" ]; then
		SRC_REPLACE="$SRC_REPLACE
			s@!!MENU_DIR!!@$prefix_dir/$menu_dir@g;
		"
	else
		SRC_REPLACE="$SRC_REPLACE
			s@!!MENU_DIR!!@@g;
		"
	fi
}

generate_menu_item() {
	MENU_REPLACE="
		s@!!TTD!!@$TTD@g;
		s@!!MENU_GROUP!!@$menu_group@g;
		s@!!MENU_NAME!!@$menu_name@g
	"
	log 1 "Generating menu item..."
	mkdir -p media
	< $ROOT_DIR/media/openttd.desktop.in sed "$MENU_REPLACE" > media/openttd.desktop
}

generate_main() {
	STAGE="[MAIN]"

	make_sed

	# Create the main Makefile
	log 1 "Generating Makefile..."
	echo "# Auto-generated file from 'Makefile.in' -- DO NOT EDIT" > Makefile
	< $ROOT_DIR/Makefile.in sed "$SRC_REPLACE" >> Makefile
	cp $ROOT_DIR/Makefile.bundle.in Makefile.bundle
	echo "# Auto-generated file -- DO NOT EDIT" > Makefile.am
	echo >> Makefile.am
	# Make the copy of the source-list, so we don't trigger an unwanted recompile
	cp $SOURCE_LIST config.cache.source.list
	# Add the current directory, so we don't trigger an unwanted recompile
	echo "`pwd`" > config.cache.pwd
	# Make sure config.cache is OLDER then config.cache.source.list
	touch config.cache
	touch config.pwd

	if [ "$menu_dir" != "" ]; then
		generate_menu_item
	fi
}

generate_lang() {
	STAGE="[LANG]"

	make_sed

	# Create the language file
	mkdir -p $LANG_OBJS_DIR

	log 1 "Generating lang/Makefile..."
	echo "# Auto-generated file from 'Makefile.lang.in' -- DO NOT EDIT" > $LANG_OBJS_DIR/Makefile
	< $ROOT_DIR/Makefile.lang.in sed "$SRC_REPLACE" >> $LANG_OBJS_DIR/Makefile
	echo "DIRS += $LANG_OBJS_DIR" >> Makefile.am
	echo "LANG_DIRS += $LANG_OBJS_DIR" >> Makefile.am
}

generate_settings() {
	STAGE="[SETTING]"

	make_sed

	# Create the language file
	mkdir -p $SETTING_OBJS_DIR

	log 1 "Generating setting/Makefile..."
	echo "# Auto-generated file from 'Makefile.settings.in' -- DO NOT EDIT" > $SETTING_OBJS_DIR/Makefile
	< $ROOT_DIR/Makefile.setting.in sed "$SRC_REPLACE" >> $SETTING_OBJS_DIR/Makefile
	echo "DIRS += $SETTING_OBJS_DIR" >> Makefile.am
}

generate_grf() {
	STAGE="[GRF]"

	make_sed

	# Create the language file
	mkdir -p $GRF_OBJS_DIR

	log 1 "Generating grf/Makefile..."
	echo "# Auto-generated file from 'Makefile.grf.in' -- DO NOT EDIT" > $GRF_OBJS_DIR/Makefile
	< $ROOT_DIR/Makefile.grf.in sed "$SRC_REPLACE" >> $GRF_OBJS_DIR/Makefile
	echo "DIRS += $GRF_OBJS_DIR" >> Makefile.am
}

generate_src_normal() {
	STAGE=$1

	make_sed

	# Create the source file
	mkdir -p $SRC_OBJS_DIR

	log 1 "Generating $2/Makefile..."
	echo "# Auto-generated file from 'Makefile.src.in' -- DO NOT EDIT" > $SRC_OBJS_DIR/Makefile
	< $ROOT_DIR/Makefile.src.in sed "$SRC_REPLACE" >> $SRC_OBJS_DIR/Makefile
	echo "DIRS += $SRC_OBJS_DIR" >> Makefile.am
	echo "SRC_DIRS += $SRC_OBJS_DIR" >> Makefile.am
}

generate_src_osx() {
	cc_host_orig="$cc_host"
	cxx_host_orig="$cxx_host"
	CFLAGS_orig="$CFLAGS"
	LDFLAGS_orig="$LDFLAGS"

	for type in $enable_universal; do

		if [ -n "$osx_sdk_104_path" ]; then
			# Use 10.4 SDK for 32-bit targets
			CFLAGS="-isysroot $osx_sdk_104_path $CFLAGS_orig"
			LDFLAGS="-Wl,-syslibroot,$osx_sdk_104_path $LDFLAGS_orig"
		fi

		# We don't want to duplicate the x86_64 stuff for each target, so do it once here
		if [ "$type" = "ppc64" ] || [ "$type" = "x86_64" ]; then
			# 64 bits is always 10.5 or higher. Furthermore it has a non const ICONV
			# and they also removed support for QuickTime/QuickDraw
			if [ -n "$osx_sdk_path" ]; then
				CFLAGS="-isysroot $osx_sdk_path $CFLAGS_orig"
				LDFLAGS="-Wl,-syslibroot,$osx_sdk_path $LDFLAGS_orig"
			fi
			CFLAGS="$CFLAGS -D_SQ64 -DHAVE_NON_CONST_ICONV -DNO_QUICKTIME -UENABLE_COCOA_QUICKDRAW"
			LIBS="`echo $LIBS | sed 's/-framework QuickTime//'`"
		fi

		case $type in
			ppc)
				BASE_SRC_OBJS_DIR="$OBJS_DIR/ppc"
				cc_host="$cc_host_orig -arch ppc -mmacosx-version-min=10.3"
				cxx_host="$cxx_host_orig -arch ppc -mmacosx-version-min=10.3"
				generate_src_normal "[ppc]" "objs/ppc";;
			ppc970)
				BASE_SRC_OBJS_DIR="$OBJS_DIR/ppc970"
				cc_host="$cc_host_orig -arch ppc970 -mmacosx-version-min=10.3 -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt"
				cxx_host="$cxx_host_orig -arch ppc970 -mmacosx-version-min=10.3 -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt"
				generate_src_normal "[ppc970]" "objs/ppc970";;
			i386)
				BASE_SRC_OBJS_DIR="$OBJS_DIR/i386"
				cc_host="$cc_host_orig -arch i386 -mmacosx-version-min=10.4"
				cxx_host="$cxx_host_orig -arch i386 -mmacosx-version-min=10.4"
				generate_src_normal "[i386]" "objs/i386";;
			ppc64)
				BASE_SRC_OBJS_DIR="$OBJS_DIR/ppc64"
				cc_host="$cc_host_orig -arch ppc64 -mmacosx-version-min=10.5"
				cxx_host="$cxx_host_orig -arch ppc64 -mmacosx-version-min=10.5"
				generate_src_normal "[ppc64]" "objs/ppc64";;
			x86_64)
				BASE_SRC_OBJS_DIR="$OBJS_DIR/x86_64"
				cc_host="$cc_host_orig -arch x86_64 -mmacosx-version-min=10.5"
				cxx_host="$cxx_host_orig -arch x86_64 -mmacosx-version-min=10.5"
				generate_src_normal "[x86_64]" "objs/x86_64";;
			*) log 1 "Unknown architecture requested for universal build: $type";;
		esac
	done
}

generate_src() {
	if [ "$os" = "OSX" ] && [ "$enable_universal" != "0" ]; then
		generate_src_osx
	else
		generate_src_normal "[SRC]" "objs"
	fi
}

showhelp() {
	echo "'configure' configures OpenTTD."
	echo ""
	echo "Usage: $0 [OPTION]... [VAR=VALUE]..."
	echo ""
	echo "To assign environment variables (e.g., CC, CFLAGS...), specify them as"
	echo "VAR=VALUE.  See below for descriptions of some of the useful variables."
	echo ""
	echo "Defaults for the options are specified in brackets."
	echo ""
	echo "Configuration:"
	echo "  -h, --help                     display this help and exit"
	echo ""
	echo "System types:"
	echo "  --build=BUILD                  configure for building on BUILD [guessed]"
	echo "  --host=HOST                    cross-compile to build programs to run"
	echo "                                 on HOST [BUILD]"
	echo "  --windres=WINDRES              the windres to use [HOST-windres]"
	echo "  --strip=STRIP                  the strip to use [HOST-strip]"
	echo "  --awk=AWK                      the awk to use in configure [awk]"
	echo "  --lipo=LIPO                    the lipo to use (OSX ONLY) [HOST-lipo]"
	echo "  --os=OS                        the OS we are compiling for [DETECT]"
	echo "                                 DETECT/UNIX/OSX/FREEBSD/OPENBSD/NETBSD/"
	echo "                                 MORPHOS/HPUX/BEOS/SUNOS/CYGWIN/MINGW/OS2/"
	echo "                                 DOS/WINCE/PSP/HAIKU"
	echo "  --endian=ENDIAN                set the endian of the HOST (AUTO/LE/BE)"
	echo ""
	echo "Paths:"
	echo "  --prefix-dir=dir               specifies the prefix for all installed"
	echo "                                 files [/usr/local]"
	echo "  --binary-dir=dir               location of the binary. Will be prefixed"
	echo "                                 with the prefix-dir [games]"
	echo "  --data-dir=dir                 location of data files (lang, data, gm)."
	echo "                                 Will be prefixed with the prefix-dir"
	echo "                                 [share/games/openttd]"
	echo "  --doc-dir=dir                  location of the doc files"
	echo "                                 Will be prefixed with the prefix-dir"
	echo "                                 [$doc_dir]"
	echo "  --icon-dir=dir                 location of icons. Will be prefixed"
	echo "                                 with the prefix-dir [share/pixmaps]"
	echo "  --icon-theme-dir=dir           location of icon theme."
	echo "                                 Will be prefixed with the prefix-dir"
	echo "                                 and postfixed with size-dirs [$icon_theme_dir]"
	echo "  --man-dir=dir                  location of the manual page (UNIX only)"
	echo "                                 Will be prefixed with the prefix-dir"
	echo "                                 [$man_dir]"
	echo "  --menu-dir=dir                 location of the menu item. (UNIX only, except OSX)"
	echo "                                 Will be prefixed with the prefix-dir"
	echo "                                 [share/applications]"
	echo "  --personal-dir=dir             location of the personal directory"
	echo "                                 [os-dependent default]"
	echo "  --shared-dir=dir               location of shared data files"
	echo "                                 [os-dependent default]"
	echo "  --install-dir=dir              specifies the root to install to."
	echo "                                 Useful to install into jails [/]"
	echo "  --binary-name                  the name used for the binary, icons,"
	echo "                                 desktop file, etc. when installing [openttd]"
	echo ""
	echo "Features and packages:"
	echo "  --enable-debug[=LVL]           enable debug-mode (LVL=[0123], 0 is release)"
	echo "  --enable-desync-debug=[LVL]    enable desync debug options (LVL=[012], 0 is none"
	echo "  --enable-profiling             enables profiling"
	echo "  --enable-lto                   enables GCC's Link Time Optimization (LTO)/ICC's"
	echo "                                 Interprocedural Optimization if available"
	echo "  --enable-dedicated             compile a dedicated server (without video)"
	echo "  --enable-static                enable static compile (doesn't work for"
	echo "                                 all HOSTs)"
	echo "  --enable-translator            enable extra output for translators"
	echo "  --enable-universal[=ARCH]      enable universal builds (OSX ONLY). Allowed is any combination"
	echo "                                 of architectures: i386 ppc ppc970 ppc64 x86_64"
	echo "                                 Default architectures are: i386 ppc"
	echo "  --enable-osx-g5                enables optimizations for ppc970 (G5) (OSX ONLY)"
	echo "  --disable-cocoa-quartz         disable the quartz window mode driver for Cocoa (OSX ONLY)"
	echo "  --disable-cocoa-quickdraw      disable the quickdraw window mode driver for Cocoa (OSX ONLY)"
	echo "  --disable-unicode              disable unicode support to build win9x"
	echo "                                 version (Win32 ONLY)"
	echo "  --enable-console               compile as a console application instead of as a GUI application."
	echo "                                 If this setting is active, debug output will appear in the same"
	echo "                                 console instead of opening a new window. (Win32 ONLY)"
	echo "  --disable-network              disable network support"
	echo "  --disable-assert               disable asserts (continue on errors)"
	echo "  --enable-strip                 enable any possible stripping"
	echo "  --without-osx-sysroot          disable the automatic adding of sysroot "
	echo "                                 (OSX ONLY)"
	echo "  --without-application-bundle   disable generation of application bundle"
	echo "                                 (OSX ONLY)"
	echo "  --without-menu-entry           Don't generate a menu item (Freedesktop based only)"
	echo "  --menu-group=group             Category in which the menu item will be placed (Freedesktop based only)"
	echo "  --menu-name=name               Name of the menu item when placed [OpenTTD]"
	echo "  --with-direct-music            enable direct music support (Win32 ONLY)"
	echo "  --with-sort=sort               define a non-default location for sort"
	echo "  --with-midi=midi               define which midi-player to use"
	echo "  --with-midi-arg=arg            define which args to use for the"
	echo "                                 midi-player"
	echo "  --with-libtimidity             enables libtimidity support"
	echo "  --with-allegro[=allegro-config]"
	echo "                                 enables Allegro video driver support"
	echo "  --with-cocoa                   enables COCOA video driver (OSX ONLY)"
	echo "  --with-sdl[=sdl-config]        enables SDL video driver support"
	echo "  --with-zlib[=zlib.a]           enables zlib support"
	echo "  --with-liblzma[=liblzma.a]     enables liblzma support"
	echo "  --with-liblzo2[=liblzo2.a]     enables liblzo2 support"
	echo "  --with-png[=libpng-config]     enables libpng support"
	echo "  --with-freetype[=freetype-config]"
	echo "                                 enables libfreetype support"
	echo "  --with-fontconfig[=pkg-config fontconfig]"
	echo "                                 enables fontconfig support"
	echo "  --with-icu[=icu-config]        enables icu (used for right-to-left support)"
	echo "  --static-icu                   try to link statically (libsicu instead of"
	echo "                                 libicu; can fail as the new name is guessed)"
	echo "  --with-iconv[=iconv-path]      enables iconv support"
	echo "  --with-psp-config[=psp-config] enables psp-config support (PSP ONLY)"
	echo "  --disable-builtin-depend       disable use of builtin deps finder"
	echo "  --with-makedepend[=makedepend] enables makedepend support"
	echo "  --with-ccache                  enables ccache support"
	echo "  --with-distcc                  enables distcc support"
	echo ""
	echo "Some influential environment variables:"
	echo "  CC                             C compiler command"
	echo "  CXX                            C++ compiler command"
	echo "  CFLAGS                         C compiler flags"
	echo "  CXXFLAGS                       C++ compiler flags"
	echo "  WINDRES                        windres command"
	echo "  LDFLAGS                        linker flags, e.g. -L<lib dir> if you"
	echo "                                 have libraries in a nonstandard"
	echo "                                 directory <lib dir>"
	echo "  CFLAGS_BUILD                   C compiler flags for build time tool generation"
	echo "  CXXFLAGS_BUILD                 C++ compiler flags for build time tool generation"
	echo "  LDFLAGS_BUILD                  linker flags for build time tool generation"
	echo ""
	echo "Use these variables to override the choices made by 'configure' or to help"
	echo "it to find libraries and programs with nonstandard names/locations."
}