scummvm/configure

593 lines
13 KiB
Bash
Executable File

#!/bin/sh
#
# Some things this script could/should do when finished
#
# * detect the compiler name (g++/c++/...)
# * detect whether its a GNU compiler or not (for compiler settings)
# * detect the host platform and base settings on this:
# - #defines like -DUNIX and -DMACOSX
# - required libs like -lmingw32
# * command line options to...
# - override the host settings (for cross compiles
# - select the desired backend (sdl, x11, ...)
# - whether to do a debug build (with -g) or an optimized build (-O3 etc.)
# * detect whether the chosen backend is available (e.g. call sdl-config)
# * generate a config.mak file for use in makefiles
# * ....
# TODO: We should really use mktemp(1) to determine a random tmp file name.
# However, that tool might not be available everywhere.
TMPO=/tmp/scummvm-conf
TMPC=${TMPO}.cpp
TMPLOG=config.log
# use environment vars if set
CXXFLAGS="$CXXFLAGS $CPPFLAGS"
# default lib behaviour yes/no/auto
_vorbis=auto
_mad=auto
_alsa=auto
# default option behaviour yes/no
_build_scumm=yes
_build_simon=yes
_build_sky=yes
_build_bs2=yes
_need_memalign=no
# more defaults
_backend=sdl
_ranlib=ranlib
_sdlconfig=sdl-config
cc_check() {
echo >> "$TMPLOG"
cat "$TMPC" >> "$TMPLOG"
echo >> "$TMPLOG"
echo "$CXX $TMPC -o $TMPO $@" >> "$TMPLOG"
rm -f "$TMPO"
( $CXX "$TMPC" -o "$TMPO" "$@" ) >> "$TMPLOG" 2>&1
TMP="$?"
echo >> "$TMPLOG"
return "$TMP"
}
echocheck () {
echo -n "Checking for $@... "
}
#
# Check whether the given command is a working C++ compiler
#
test_compiler ()
{
cat <<EOF >tmp_cxx_compiler.cpp
class Foo {
int a;
};
int main(int argc, char **argv)
{
Foo *a = new Foo();
delete a;
return 0;
}
EOF
eval "$1 -o tmp_cxx_compiler tmp_cxx_compiler.cpp 2> /dev/null" && eval "./tmp_cxx_compiler 2> /dev/null" && rm -f tmp_cxx_compiler tmp_cxx_compiler.cpp
}
#
# Determine sdl-config
#
# TODO: small bit of code to test sdl useability
find_sdlconfig()
{
printf "Looking for sdl-config... "
sdlconfigs="$_sdlconfig sdl-config sdl11-config sdl12-config"
for sdlconfig in $sdlconfigs; do
if test "-e $sdlconfig" ; then
_sdlconfig=$sdlconfig
echo $_sdlconfig
break
else
echo "none found!"
exit 1
fi
done
}
#
# Determine a data type with the given length
#
find_type_with_size ()
{
cat <<EOF >tmp_find_type_with_size.cpp
#include <stdio.h>
int main(int argc, char **argv)
{
int size = argv[1][0] - '0';
if (size == sizeof(int))
printf("int\n");
else if (size == sizeof(short))
printf("short\n");
else if (size == sizeof(char))
printf("char\n");
else if (size == sizeof(long))
printf("long\n");
else {
printf("unknown\n");
return 1;
}
return 0;
}
EOF
if eval "$CXX -o tmp_find_type_with_size tmp_find_type_with_size.cpp"; then
datatype=`./tmp_find_type_with_size $1`
if test "$datatype" = "unknown"; then
echo "couldn't find data type with $1 bytes"
exit 1
fi
fi
rm -f tmp_find_type_with_size tmp_find_type_with_size.cpp
echo $datatype
}
#
# Greet user
#
echo "Running ScummVM configure..."
echo "Configure run on" `date` > $TMPLOG
#
# Check any parameters we received
#
# TODO:
# * Change --disable-mad / --enable-mad to the way it's done in autoconf:
# That is, --without-mad / --with-mad=/prefix/to/mad. Useful for people
# who have Mad/Vorbis/ALSA installed in a non-standard locations.
#
for parm in "$@" ; do
if test "$parm" = "--help" || test "$parm" = "-help" || test "$parm" = "-h" ; then
cat << EOF
Usage: $0 [OPTIONS]...
Configuration:
-h, --help display this help and exit
--backend=BACKEND backend to build (sdl, sdlgl, x11, morphos, dc, gp32) [sdl]
Optional Features:
--disable-scumm don't build the SCUMM engine
--disable-simon don't build the simon engine
--disable-sky don't build the Beneath a Steel Sky engine
--disable-bs2 don't build the Broken Sword II engine
Optional Libraries:
--with-alsa-prefix=PFX Prefix where alsa is installed (optional)
--disable-alsa disable ALSA midi sound support [autodetect]
--with-ogg-prefix=PFX Prefix where libogg is installed (optional)
--with-vorbis-prefix=PFX Prefix where libvorbis is installed (optional)
--disable-vorbis disable Ogg Vorbis support [autodetect]
--with-mad-prefix=PFX Prefix where libmad is installed (optional)
--disable-mad disable libmad (MP3) support [autodetect]
EOF
exit 0
fi
done # for parm in ...
DEBFLAGS="-g"
for ac_option in $@; do
case "$ac_option" in
--disable-scumm) _build_scumm=no ;;
--disable-simon) _build_simon=no ;;
--disable-sky) _build_sky=no ;;
--disable-bs2) _build_bs2=no ;;
--enable-alsa) _alsa=yes ;;
--disable-alsa) _alsa=no ;;
--enable-vorbis) _vorbis=yes ;;
--disable-vorbis) _vorbis=no ;;
--enable-mad) _mad=yes ;;
--disable-mad) _mad=no ;;
--with-alsa-prefix=*)
_prefix=`echo $ac_option | cut -d '=' -f 2`
ALSA_CFLAGS="-I$_prefix/include"
ALSA_LIBS="-L$_prefix/libs"
;;
--with-ogg-prefix=*)
_prefix=`echo $ac_option | cut -d '=' -f 2`
OGG_CFLAGS="-I$_prefix/include"
OGG_LIBS="-L$_prefix/lib"
;;
--with-vorbis-prefix=*)
_prefix=`echo $ac_option | cut -d '=' -f 2`
VORBIS_CFLAGS="-I$_prefix/include"
VORBIS_LIBS="-L$_prefix/lib"
;;
--with-mad-prefix=*)
_prefix=`echo $ac_option | cut -d '=' -f 2`
MAD_CFLAGS="-I$_prefix/include"
MAD_LIBS="-L$_prefix/lib"
;;
--backend=*)
_backend=`echo $ac_option | cut -d '=' -f 2`
;;
--disable-debug)
DEBFLAGS=""
;;
--enable-release)
DEBFLAGS=""
;;
*)
echo "error: unrecognised option: $ac_option
Try \`$0 --help' for more information." >&2
exit 1
;;
esac;
done;
CXXFLAGS="$CXXFLAGS $DEBFLAGS"
#
# Determine the C++ compiler
#
printf "Looking for C++ compiler... "
compilers="$CXX g++ c++"
CXX=
for compiler in $compilers; do
if test_compiler $compiler; then
CXX=$compiler
echo $CXX
break
fi
done
if test -z $CXX; then
echo "none found!"
exit 1
fi
#
# Determine the compiler version
echocheck "compiler version"
cxx_name=`( $cc -v ) 2>&1 | tail -1 | cut -d ' ' -f 1`
cxx_version=`( $CXX -dumpversion ) 2>&1`
if test "$?" -gt 0; then
cxx_version="not found"
fi
case $cxx_version in
2.95.[2-9]|2.95.[2-9][-.]*|3.[0-9]|3.[0-9].[0-9])
_cxx_major=`echo $cxx_version | cut -d '.' -f 1`
_cxx_minor=`echo $cxx_version | cut -d '.' -f 2`
cxx_version="$cxx_version, ok"
cxx_verc_fail=no
;;
# whacky beos version strings
2.9-beos-991026*|2.9-beos-000224*)
_cxx_major=2
_cxx_minor=95
cxx_version="$cxx_version, ok"
cxx_verc_fail=no
;;
'not found')
cxx_verc_fail=yes
;;
*)
cxx_version="$cxx_version, bad"
cxx_verc_fail=yes
;;
esac
echo "$cxx_version"
if test "$cxx_verc_fail" = yes ; then
echo
echo "The version of your compiler is not supported at this time"
echo "Please ensure you are using GCC 2.95.x or GCC 3.x"
exit 1
fi
#
# Do CXXFLAGS now we know the compiler version
#
if test "$_cxx_major" -ge "3" ; then
CXXFLAGS="$CXXFLAGS -ansi -W -Wno-unused-parameter"
_make_def_HAVE_GCC3='HAVE_GCC3 = 1'
fi;
#
# Engine selection
#
if test "$_build_scumm" = no ; then
_mak_scumm='DISABLE_SCUMM = 1'
else
_mak_scumm='# DISABLE_SCUMM = 1'
fi
if test "$_build_simon" = no ; then
_mak_simon='DISABLE_SIMON = 1'
else
_mak_simon='# DISABLE_SIMON = 1'
fi
if test "$_build_sky" = no ; then
_mak_sky='DISABLE_SKY = 1'
else
_mak_sky='# DISABLE_SKY = 1'
fi
if test "$_build_bs2" = no ; then
_mak_bs2='DISABLE_SWORD2 = 1'
else
_mak_bs2='# DISABLE_SWORD2 = 1'
fi
#
# Determine hosttype
#
# TODO - also add an command line option to override this?!?
# TODO - recognize more systems, e.g. *BSD
printf "Checking hosttype... "
hosttype=`uname -s`
echo $hosttype
case $hosttype in
Linux | OpenBSD | FreeBSD | NetBSD | BSD/OS | SunOS | HP-UX)
DEFINES="$DEFINES -DUNIX"
;;
IRIX)
DEFINES="$DEFINES -DUNIX"
ranlib=ar -r
;;
Darwin)
DEFINES="$DEFINES -DUNIX -DMACOSX"
LIBS="$LIBS -framework QuickTime -framework AudioUnit"
;;
esac
#
# Check for endianess
#
printf "Checking endianess... "
cat <<EOF >tmp_endianess_check.cpp
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
unsigned int data = 0x01234567;
char *ptr = (char *)&data;
if (ptr[0] == 0x01 && ptr[1] == 0x23 && ptr[2] == 0x45 && ptr[3] == 0x67)
printf("big\n");
else if (ptr[3] == 0x01 && ptr[2] == 0x23 && ptr[1] == 0x45 && ptr[0] == 0x67)
printf("little\n");
else
printf("unknown\n");
return 0;
}
EOF
$CXX -o tmp_endianess_check tmp_endianess_check.cpp
endianess=`./tmp_endianess_check`
echo $endianess;
case $endianess in
big)
_def_endianess='#define SCUMM_BIG_ENDIAN'
;;
little)
_def_endianess='#define SCUMM_LITTLE_ENDIAN'
;;
*)
exit 1
;;
esac
rm -f tmp_endianess_check tmp_endianess_check.cpp
#
# Check whether memory alignment is required
#
echo -n "Alignment required... "
cat > $TMPC << EOF
#include <stdlib.h>
#include <signal.h>
int main(int argc, char **argv)
{
unsigned char test[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };
signal(SIGBUS, exit);
signal(SIGABRT, exit);
signal(SIGSEGV, exit);
if (*((unsigned int *)(test + 1)) != 0x55443322 && *((unsigned int *)(test + 1)) != 0x22334455) {
return 1;
}
return 0;
}
EOF
_need_memalign=yes
cc_check && $TMPO && _need_memalign=no
if test "$_need_memalign" = yes ; then
_def_align='#define SCUMM_NEED_ALIGNMENT'
else
_def_align='#undef SCUMM_NEED_ALIGNMENT'
fi
echo "$_need_memalign"
#
# Determine data type sizes
# TODO: proper error checking
#
printf "Type with 1 byte... "
type_1_byte=`find_type_with_size 1`
echo "$type_1_byte"
printf "Type with 2 bytes... "
type_2_byte=`find_type_with_size 2`
echo "$type_2_byte"
printf "Type with 4 bytes... "
type_4_byte=`find_type_with_size 4`
echo "$type_4_byte"
echocheck "Ogg Vorbis"
if test "$_vorbis" = auto ; then
_vorbis=no
cat > $TMPC << EOF
#include <vorbis/codec.h>
int main(void) { vorbis_packet_blocksize(0,0); return 0; }
EOF
cc_check $LDFLAGS $CXXFLAGS $OGG_CFLAGS $OGG_LIBS $VORBIS_CFLAGS $VORBIS_LIBS \
-lvorbis -logg -lm && _vorbis=yes
fi
if test "$_vorbis" = yes ; then
_def_vorbis='#define USE_VORBIS'
LIBS="$LIBS $OGG_LIBS $VORBIS_LIBS -lvorbisfile -lvorbis -logg"
INCLUDES="$INCLUDES $OGG_CFLAGS $VORBIS_CFLAGS"
else
_def_vorbis='#undef USE_VORBIS'
fi
echo "$_vorbis"
echocheck "MAD"
if test "$_mad" = auto ; then
_mad=no
cat > $TMPC << EOF
#include <mad.h>
int main(void) {return 0; }
EOF
cc_check $LDFLAGS $CXXFLAGS $MAD_CFLAGS $MAD_LIBS -lmad && _mad=yes
fi
if test "$_mad" = yes ; then
_def_mad='#define USE_MAD'
LIBS="$LIBS $MAD_LIBS -lmad"
INCLUDES="$INCLUDES $MAD_CFLAGS"
else
_def_mad='#undef USE_MAD'
fi
echo "$_mad"
echocheck "ALSA 0.9"
if test "$_alsa" = auto ; then
_alsa=no
cat > $TMPC << EOF
#include <alsa/asoundlib.h>
int main(void) { return (!(SND_LIB_MAJOR==0 && SND_LIB_MINOR==9)); }
EOF
cc_check $LDFLAGS $CXXFLAGS $ALSA_CFLAGS $ALSA_LIBS -lasound && _alsa=yes
fi
if test "$_alsa" = yes ; then
_def_alsa='#define USE_ALSA'
LIBS="$LIBS $ALSA_LIBS -lasound"
INCLUDES="$INCLUDES $ALSA_CFLAGS"
else
_def_alsa='#undef USE_ALSA'
fi
echo "$_alsa"
rm -f $TMPC $TMPO
echo
echo "Engines:"
if test "$_build_scumm" = yes ; then
echo " SCUMM"
fi
if test "$_build_simon" = yes ; then
echo " Simon the Sorcerer"
fi
if test "$_build_sky" = yes ; then
echo " Beneath a Steel Sky"
fi
if test "$_build_bs2" = yes ; then
echo " Broken Sword II"
fi
echo
echo -n "Backend... "
echo "$_backend"
#
# Backend related stuff
#
case $_backend in
sdl)
find_sdlconfig
INCLUDES="$INCLUDES `$_sdlconfig --cflags`"
LIBS="$LIBS `$_sdlconfig --libs`"
OBJS="$OBJS backends/sdl/sdl-common.o backends/sdl/sdl.o"
MODULES="$MODULES backends/sdl"
;;
sdlgl)
find_sdlconfig
INCLUDES="$INCLUDES `$_sdlconfig --cflags`"
LIBS="$LIBS `$_sdlconfig --libs` -lGL"
OBJS="$OBJS backends/sdl/sdl-common.o backends/sdl/sdl_gl.o"
MODULES="$MODULES backends/sdl"
;;
x11)
INCLUDES="$INCLUDES -I/usr/X11R6/include"
LIBS="$LIBS -lpthread -lXext -lX11"
LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -L/usr/local/lib"
OBJS="$OBJS backends/x11/x11.o"
DEFINES="$DEFINES -DX11_BACKEND"
MODULES="$MODULES backends/x11"
;;
*)
echo "support for $_backend backend not implemented in configure script yet"
exit 1
;;
esac
echo
echo "Creating config.h"
cat > config.h << EOF
/* This file is automatically generated by configure */
/* DO NOT EDIT MANUALLY */
#ifndef CONFIG_H
#define CONFIG_H
$_def_endianess
$_def_align
/* Data types */
typedef unsigned $type_1_byte byte;
typedef unsigned int uint;
typedef unsigned $type_1_byte uint8;
typedef unsigned $type_2_byte uint16;
typedef unsigned $type_4_byte uint32;
typedef signed $type_1_byte int8;
typedef signed $type_2_byte int16;
typedef signed $type_4_byte int32;
/* Libs */
$_def_vorbis
$_def_mad
$_def_alsa
#endif /* CONFIG_H */
EOF
echo "Creating config.mak"
cat > config.mak << EOF
# -------- Generated by configure -----------
CXX := $CXX
CXXFLAGS := $CXXFLAGS
LIBS := $LIBS
RANLIB := $_ranlib
BACKEND := $_backend
MODULES += $MODULES
$_make_def_HAVE_GCC3
$_mak_scumm
$_mak_simon
$_mak_sky
$_mak_bs2
INCLUDES += $INCLUDES
OBJS += $OBJS
DEFINES += $DEFINES
LDFLAGS += $LDFLAGS
EOF