#!/bin/sh
#             __________               __   ___.
#   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
#   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
#   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
#   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
#                     \/            \/     \/    \/            \/
# $Id$
#

# global CC options for all platforms
CCOPTS="-W -Wall -O -nostdlib -ffreestanding -Wstrict-prototypes"

use_logf="#undef ROCKBOX_HAS_LOGF"
use_simsound="#undef ROCKBOX_HAS_SIMSOUND"

scriptver=`echo '$Revision$' | sed -e 's:\\$::g' -e 's/Revision: //'`

#
# Begin Function Definitions
#
input() {
    read response
    echo $response
}

prefixtools () {
 prefix="$1"
 CC=${prefix}gcc
 WINDRES=${prefix}windres
 DLLTOOL=${prefix}dlltool
 DLLWRAP=${prefix}dllwrap
 RANLIB=${prefix}ranlib
 LD=${prefix}ld
 AR=${prefix}ar
 AS=${prefix}as
 OC=${prefix}objcopy
}

crosswincc () {
 # naive approach to selecting a mingw cross-compiler on linux/*nix
 echo "Enabling win32 crosscompiling"

 prefixtools i586-mingw32msvc-

 LDOPTS="-lgdi32 -luser32 -mwindows"
 # add cross-compiler option(s)
 GCCOPTS="$GCCOPTS -mno-cygwin"

 output="rockboxui.exe" # use this as output binary name
 crosscompile="yes"
 endian="little" # windows is little endian
}

checksoundcard () {
    if test -n "$codecs"; then
        if test -f "/usr/include/sys/soundcard.h"; then
         # We have a header file so we can build the sound code
            use_simsound="#define ROCKBOX_HAS_SIMSOUND 1"
            echo "Enabled PCM sound playback in simulator"
        fi # header file present
    fi # has codecs
}

# scan the $PATH for the given command
findtool(){
  file="$1"

  IFS=":"
  for path in $PATH
  do
    # echo "checks for $file in $path" >&2
    if test -f "$path/$file"; then
      echo "$path/$file"
      return
    fi
  done
}


simcc () {

 # default tool setup for native building
 prefixtools ""

 GCCOPTS='-W -Wall -g -fno-builtin'

 output="rockboxui" # use this as default output binary name

 if [ "$simver" = "sdl" ]; then
     # generic sdl-config checker
     sdl=`findtool sdl-config`

     if [ -z "$sdl" ]; then
         echo "configure didn't find sdl-config, which indicates that you"
         echo "don't have SDL (properly) installed. Please correct and"
         echo "re-run configure!"
         exit
     fi
 fi

 case $uname in
   CYGWIN*)
   echo "Cygwin host detected"

   if [ "$simver" = "win32" ]; then
       # win32 version
       GCCOPTS="$GCCOPTS -mno-cygwin -DNOCYGWIN"
       LDOPTS="-lgdi32 -luser32 -mno-cygwin"
   elif [ "$simver" = "sdl" ]; then
       # sdl version
       GCCOPTS="$GCCOPTS `sdl-config --cflags`"
       LDOPTS="`sdl-config --libs`"
       checksoundcard
   else
       # x11 version
       GCCOPTS="$GCCOPTS"
       LDOPTS='-L/usr/X11R6/lib -lSM -lICE -lXt -lX11 -lXmu -lSM -lICE -lX11 -lpthread'
       checksoundcard
   fi
   output="rockboxui.exe" # use this as output binary name
   ;;

   Linux)
   echo "Linux host detected"
   GCCOPTS="$GCCOPTS"
   if [ "$simver" = "win32" ]; then
       LDOPTS='-L/usr/X11R6/lib -lX11 -lm -lXt -lXmu -lnsl -ldl -lpthread'
       crosswincc # setup cross-compiler
   elif [ "$simver" = "sdl" ]; then
       GCCOPTS="$GCCOPTS `sdl-config --cflags`"
       LDOPTS="`sdl-config --libs`"
       checksoundcard
   else
       LDOPTS='-L/usr/X11R6/lib -lX11 -lm -lXt -lXmu -lnsl -ldl -lpthread'
       checksoundcard
   fi # not a cross-compiler
   ;;

   FreeBSD)
   echo "FreeBSD host detected"
   LDOPTS='-L/usr/X11R6/lib -lX11 -lm -lXt -lXmu -dl -lpthread'
   if [ "$simver" = "win32" ]; then
     crosswincc # setup cross-compiler
   fi
   ;;

   *)
   echo "Unsupported system: $uname, fix configure and retry"
   exit
   ;;
 esac
 
 if [ `uname -m` = "x86_64" ]; then
   GCCOPTS="$GCCOPTS -fPIC"  # needed to make shared objects link
 fi

 if test "X$crosscompile" != "Xyes"; then
   id=$$
   cat >/tmp/conftest-$id.c <<EOF
#include <stdio.h>
int main(int argc, char **argv)
{
  int var=0;
  char *varp = (char *)&var;
  *varp=1;

  printf("%d\n", var);
  return 0;
}
EOF

   $CC -o /tmp/conftest-$id /tmp/conftest-$id.c 2>/dev/null

   if test `/tmp/conftest-$id 2>/dev/null` -gt "1"; then
     # big endian
     endian="big"
   else
     # little endian
     endian="little"
   fi
   echo "Simulator environment deemed $endian endian"

   # use wildcard here to make it work even if it was named *.exe like
   # on cygwin
   rm -f /tmp/conftest-$id*
 fi
}

shcc () {
 prefixtools sh-elf-
 GCCOPTS="$CCOPTS -m1"
 GCCOPTIMIZE="-fomit-frame-pointer -fschedule-insns"
 endian="big"
}

calmrisccc () {
 prefixtools calmrisc16-unknown-elf-
 GCCOPTS="-Wl\,--no-check-sections $CCOPTS"
 GCCOPTIMIZE="-fomit-frame-pointer"
 endian="big"
}

coldfirecc () {
 prefixtools m68k-elf-
 GCCOPTS="$CCOPTS -g -m5200 -Wa\,-m5249 -malign-int -mstrict-align"
 GCCOPTIMIZE="-fomit-frame-pointer"
 endian="big"
}

arm7tdmicc () {
 prefixtools arm-elf-
 GCCOPTS="$CCOPTS -mcpu=arm7tdmi -ffunction-sections -mlong-calls"
 GCCOPTIMIZE="-fomit-frame-pointer"
 endian="little"
}

arm9tdmicc () {
 prefixtools arm-elf-
 GCCOPTS="$CCOPTS -mcpu=arm9tdmi -ffunction-sections -mlong-calls"
 GCCOPTIMIZE="-fomit-frame-pointer"
 endian="little"
}

whichaddr () {
    case $archos in
    gmini120|gminisp)
	echo ""
	echo "Where do you want the firmware to be flashed?"
	echo "WARNING: Do not answer this question lightly,"
	echo "unless you don't plan to flash your gmini."
	echo "In this case, reply '0x10000' (no quotes) and "
	echo "re-configure when you know better."
	loadaddress=`input`

        if [ "0$loadaddress" = "0" ]; then
            #default
            loadaddress="0x10000";
        fi
        echo "You selected $loadaddress"
	;;
    *)
	;;
    esac
}

whichdevel () {
  ##################################################################
  # Prompt for specific developer options
  #
  echo ""
  echo "Enter your developer options (press enter when done)"
  echo "(D)EBUG, (L)ogf, (S)imulator, (P)rofiling"
  cont=1

  while [ $cont = "1" ]; do

    option=`input`;

    case $option in
      [Dd])
        if [ "yes" = "$profile" ]; then
          echo "Debug is incompatible with profiling"
        else
          echo "define DEBUG"
          use_debug="yes"
        fi
        ;;
      [Ll])
        echo "logf() support enabled"
        logf="yes"
        ;;
      [Ss])
        echo "Simulator build enabled"
        simulator="yes"
        ;;
      [Pp])
        if [ "yes" = "$use_debug" ]; then
          echo "Profiling is incompatible with debug"
        else
          echo "Profiling support is enabled"
          profile="yes"
        fi
        ;;
      *)
        echo "done"
        cont=0
        ;;
    esac 
  done

  if [ "yes" = "$use_debug" ]; then
    debug="-DDEBUG"
    GCCOPTS="$GCCOPTS -g -DDEBUG"
  fi
  if [ "yes" = "$logf" ]; then
    use_logf="#define ROCKBOX_HAS_LOGF 1"
  fi
  if [ "yes" = "$simulator" ]; then
    debug="-DDEBUG"
    extradefines="$extradefines -DSIMULATOR"
    whichsim
  fi
  if [ "yes" = "$profile" ]; then
    extradefines="$extradefines -DRB_PROFILE"
    PROFILE_OPTS="-finstrument-functions"
    GCCOPTS="$GCCOPTS $GCCOPTIMIZE"
  fi
}

whichsim () {

if [ -z "$simver" ]; then

  ##################################################################
  # Figure out what simulator version
  #
  # x11 is deprecated so hide it from the question
  # win32 is also deprecated
  #
  echo ""
  echo "Build (S)DL version? (S)"

  option=`input`;

  case $option in
   [Ww])
     simver="win32"

     WINDRES=windres
     DLLTOOL=dlltool
     DLLWRAP=dllwrap

     # make sure the code knows this is for win32
     extradefines="$extradefines -DWIN32"
     ;;
   [Xx])
     simver="x11"
     extradefines="$extradefines -DX11"
     ;;
   [Ss]|*)
     simver="sdl"
     extradefines="$extradefines -DSDL"
     ;;
   esac
   echo "Selected $simver simulator"
fi
}

if test "$1" = "--help"; then
  echo "Rockbox configure script."
  echo "Invoke this in a directory to generate a Makefile to build Rockbox"
  echo "Do *NOT* run this within the tools directory!"
  echo ""
  echo "Usage: configure [--ccache]"
  exit
fi

if test "$1" = "--ccache"; then
  echo "Enable ccache for building"
  ccache="yes"
fi

if test -r "configure"; then
 # this is a check for a configure script in the current directory, it there
 # is one, try to figure out if it is this one!

 if { grep "^#   Jukebox" configure >/dev/null 2>&1 ; } then
   echo "WEEEEEEEEP. Don't run this configure script within the tools directory."
   echo "It will only cause you pain and grief. Instead do this:"
   echo ""
   echo " cd .."
   echo " mkdir build-dir"
   echo " cd build-dir"
   echo " ../tools/configure"
   echo ""
   echo "Much happiness will arise from this. Enjoy"
   exit
 fi
fi

if [ "$target" = "--help" -o \
     "$target" = "-h" ]; then
  echo "Just invoke the script and answer the questions."
  echo "This script will write a Makefile for you"
  exit
fi

# get our current directory
pwd=`pwd`;

if [ "$target" = "update" ]; then
  echo "configure update is unfortunately no longer supported"
  exit
else

echo "This script will setup your Rockbox build environment."
echo "Further docs here: http://www.rockbox.org/"
echo ""

fi

if [ -z "$rootdir" ]; then
  ##################################################################
  # Figure out where the source code root is!
  #

  firmfile="crt0.S" # a file to check for in the firmware root dir

  for dir in  . .. ../.. ../rockbox*; do
    if [ -f $dir/firmware/$firmfile ]; then
     rootdir=$dir
     break
    fi
  done

  if [ -z "$rootdir" ]; then
    echo "This script couldn't find your source code root directory. Please enter the"
    echo "full path to the source code directory here:"

    firmdir=`input`
  fi

  #####################################################################
  # Convert the possibly relative directory name to an absolute version
  #
  now=`pwd`
  cd $rootdir
  rootdir=`pwd`

  echo "Using this source code root directory:"
  echo $rootdir
  echo ""

  # cd back to the build dir
  cd $now
fi

apps="apps"
appsdir='\$(ROOTDIR)/apps'
firmdir='\$(ROOTDIR)/firmware'
toolsdir='\$(ROOTDIR)/tools'


##################################################################
# Figure out target platform
#

  echo "Enter target platform:"

  echo "1 - Archos Player/Studio"
  echo "2 - Archos Recorder"
  echo "3 - Archos FM Recorder"
  echo "4 - Archos Recorder v2"
  echo "5 - Archos Gmini 120"
  echo "6 - Archos Gmini SP"
  echo "7 - Archos Ondio SP"
  echo "8 - Archos Ondio FM"
  echo "9 - iriver H120/H140"
  echo "10 - iriver H320/H340"
  echo "11 - iriver iHP-100/iHP-110/iHP-115"
  echo "12 - iAudio X5"
  echo "13 - iPod Color/Photo"
  echo "14 - iPod Nano"
  echo "15 - iPod Video"
  echo "16 - iPod 3G"
  echo "17 - iPod 4G (Grayscale)"
  echo "18 - iPod Mini (1G)"
  echo "19 - iriver iFP-790"
  echo "20 - Toshiba Gigabeat F"
  echo "21 - iPod Mini 2G"

  target_id=`input`;

  # Set of tools built for all target platforms:
  toolset="rdf2binary convbdf"

  # Toolsets for some target families:
  archosbitmaptools="$toolset scramble descramble sh2d uclpack bmp2rb codepages"
  iriverbitmaptools="$toolset scramble descramble mkboot bmp2rb codepages"
  iaudiobitmaptools="$toolset scramble descramble mkboot bmp2rb codepages"
  gigabeatbitmaptools="$toolset bmp2rb codepages"
  ipodbitmaptools="$toolset scramble ipod_fw bmp2rb codepages"
  ifpbitmaptools="$toolset bmp2rb codepages"

  case $target_id in

   1)
    archos="player"
    target="-DARCHOS_PLAYER"
    shcc
    tool="$rootdir/tools/scramble"
    output="archos.mod"
    appextra="player:gui"
    archosrom="$pwd/rombox.ucl"
    flash="$pwd/rockbox.ucl"
    plugins="yes"
    codecs=""

    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset="$toolset scramble descramble sh2d generate_rocklatin uclpack"

    # Note: the convbdf is present in the toolset just because: 1) the
    # firmware/Makefile assumes it is present always, and 2) we will need it when we
    # build the player simulator

    ;;

   2)
    archos="recorder"
    target="-DARCHOS_RECORDER"
    shcc
    tool="$rootdir/tools/scramble"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="ajbrec.ajz"
    appextra="recorder:gui"
    archosrom="$pwd/rombox.ucl"
    flash="$pwd/rockbox.ucl"
    plugins="yes"
    codecs=""
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$archosbitmaptools
    ;;

   3)
    archos="fmrecorder"
    target="-DARCHOS_FMRECORDER"
    shcc
    tool="$rootdir/tools/scramble -fm"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="ajbrec.ajz"
    appextra="recorder:gui"
    archosrom="$pwd/rombox.ucl"
    flash="$pwd/rockbox.ucl"
    plugins="yes"
    codecs=""
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$archosbitmaptools
    ;;

   4)
    archos="recorderv2"
    target="-DARCHOS_RECORDERV2"
    shcc
    tool="$rootdir/tools/scramble -v2"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="ajbrec.ajz"
    appextra="recorder:gui"
    archosrom="$pwd/rombox.ucl"
    flash="$pwd/rockbox.ucl"
    plugins="yes"
    codecs=""
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$archosbitmaptools
    ;;

   5)
    archos="gmini120"
    target="-DARCHOS_GMINI120"
    memory=16 # fixed size (16 is a guess, remove comment when checked)
    calmrisccc
    tool="cp" # might work for now!
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.gmini"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="" # disabled for now, enable later on
    codecs="libmad"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset="$toolset bmp2rb codepages"
    ;;

   6)
    archos="gminisp"
    target="-DARCHOS_GMINISP"
    memory=16 # fixed size (16 is a guess, remove comment when checked)
    calmrisccc
    tool="cp" # might work for now!
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.gmini"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="" # disabled for now, enable later on
    codecs="libmad"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset="$toolset bmp2rb codepages"
    ;;

   7)
    archos="ondiosp"
    target="-DARCHOS_ONDIOSP"
    shcc
    tool="$rootdir/tools/scramble -osp"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="ajbrec.ajz"
    appextra="recorder:gui"
    archosrom="$pwd/rombox.ucl"
    flash="$pwd/rockbox.ucl"
    plugins="yes"
    codecs=""
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$archosbitmaptools
    ;;

   8)
    archos="ondiofm"
    target="-DARCHOS_ONDIOFM"
    shcc
    tool="$rootdir/tools/scramble -ofm"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="ajbrec.ajz"
    appextra="recorder:gui"
    archosrom="$pwd/rombox.ucl"
    flash="$pwd/rockbox.ucl"
    plugins="yes"
    codecs=""
    toolset=$archosbitmaptools
    ;;

   9)
    archos="h120"
    target="-DIRIVER_H120"
    memory=32 # always
    coldfirecc
    tool="$rootdir/tools/scramble -add=h120"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 2"
    bmp2rb_remotemono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_remotenative="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.iriver"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$iriverbitmaptools
    ;;

   10)
    archos="h300"
    target="-DIRIVER_H300"
    memory=32 # always
    coldfirecc
    tool="$rootdir/tools/scramble -add=h300"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
    bmp2rb_remotemono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_remotenative="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.iriver"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$iriverbitmaptools
    ;;

   11)
    archos="h100"
    target="-DIRIVER_H100"
    memory=16 # always
    coldfirecc
    tool="$rootdir/tools/scramble -add=h100"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 2"
    bmp2rb_remotemono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_remotenative="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.iriver"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$iriverbitmaptools
    ;;

   12)
    archos="x5"
    target="-DIAUDIO_X5"
    memory=16 # always
    coldfirecc
    tool="$rootdir/tools/scramble -add=iax5"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
    bmp2rb_remotemono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_remotenative="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.iaudio"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset="$iaudiobitmaptools"
    # architecture, manufacturer and model for the target-tree build
    t_cpu="coldfire"
    t_manufactorer="iaudio"
    t_model="x5"
    ;;

   13)
    archos="ipodcolor"
    target="-DIPOD_COLOR"
    memory=32 # always
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=ipco"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 5"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;

   14)
    archos="ipodnano"
    target="-DIPOD_NANO"
    memory=32 # always
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=nano"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 5"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;

   15)
    archos="ipodvideo"
    target="-DIPOD_VIDEO"
    memory=32 # 30GB models have 32MB, 60GB have 64MB
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=ipvd"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;

   16)
    archos="ipod3g"
    target="-DIPOD_3G"
    memory=32 # always
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=ip3g"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 6"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;
    
   17)
    archos="ipod4g"
    target="-DIPOD_4G"
    memory=32 # always
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=ip4g"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 6"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;
    
   18)
    archos="ipodmini"
    target="-DIPOD_MINI"
    memory=32 # always
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=mini"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 6"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;
    
   19)
    archos="ifp7xx"
    target="-DIRIVER_IFP7XX"
    memory=1
    arm7tdmicc
    tool="cp"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 0"
    output="rockbox.wma"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ifpbitmaptools
    ;;

   20)
    archos="gigabeatf"
    target="-DGIGABEAT_F"
    memory=32 # always
    arm9tdmicc
    tool="cp"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
    output="rockbox.gigabeat"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    toolset=$gigabeatbitmaptools
    ;;

   21)
    archos="ipodmini2g"
    target="-DIPOD_MINI2G"
    memory=32 # always
    arm7tdmicc
    tool="$rootdir/tools/scramble -add=mn2g"
    bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
    bmp2rb_native="$rootdir/tools/bmp2rb -f 6"
    output="rockbox.ipod"
    appextra="recorder:gui"
    archosrom=""
    flash=""
    plugins="yes"
    codecs="libmad liba52 libffmpegFLAC libTremor libwavpack dumb libmusepack libalac libfaad libm4a"
    # toolset is the tools within the tools directory that we build for
    # this particular target.
    toolset=$ipodbitmaptools
    ;;

   *)
    echo "Please select an actual target platform!"
    exit
    ;;

  esac

  echo "Platform set to $archos"


############################################################################
# Amount of memory, for those that can differ.
#

if [ -z "$memory" ]; then
  size="2"
  if [ -z "$update" ]; then
    echo "Enter size of your RAM (in MB): (defaults to 2)"
    size=`input`;
  fi

  case $size in
   8)
    memory="8"
    ;;
   *)
    memory="2"
    ;;

  esac
  echo "Memory size selected: $memory MB"
fi

##################################################################
# Figure out build "type"
#

  # the ifp7x0 is the only platform that supports building a gdb stub like
  # this
  case $archos in
    ifp7xx)
       gdbstub="(G)DB stub, "
       ;;
    *)
       ;;
  esac

  echo ""
  echo "Build (N)ormal, (D)evel, (S)imulator, (B)ootloader, $gdbstub(M)anual? (N)"

  option=`input`;

  case $option in
    [Bb])
      case $archos in
          h100|h120|h300|x5|ipodcolor|ipodnano|ipodvideo|ipod3g|ipod4g|ipodmini|ipodmini2g)
              extradefines="-DBOOTLOADER" # for target makefile symbol EXTRA_DEFINES
              appsdir='\$(ROOTDIR)/bootloader'
              apps="bootloader"
              ;;
          *)
              extradefines="-DBOOTLOADER -ffunction-sections -fdata-sections"
              appsdir='\$(ROOTDIR)/flash/bootbox'
              apps="bootbox"
              ;;
      esac
      bootloader="1"
      echo "Bootloader build selected"
      ;;
    [Ss])
      debug="-DDEBUG"
      simulator="yes"
      extradefines="-DSIMULATOR"
      echo "Simulator build selected"
      whichsim
      ;;
    [Dd])
      echo "Devel build selected"
      whichdevel
      ;;
    [Gg])
      extradefines="-DSTUB" # for target makefile symbol EXTRA_DEFINES
      appsdir='\$(ROOTDIR)/gdb'
      apps="stub"
      case $archos in
          ifp7xx)
              output="stub.wma"
              ;;
          *)
              ;;
      esac
      echo "GDB stub build selected"
      ;;
    [Mm])
      appsdir='\$(ROOTDIR)/manual'
      firmdir='\$(ROOTDIR)/manual/platform' # No Makefile here.  Effectively ignores target
      toolsdir=$firmdir;
      toolset='';
      apps="manual"
      case $archos in
          fmrecorder)
              archos="recorderv2fm"
              ;;
          recorderv2)
              archos="recorderv2fm"
              ;;
          ondio??)
              archos="ondio"
              ;;
          h1??)
              archos="h1xx"
              ;;
          ipodmini2g)
              archos="ipodmini"
              ;;        
          *)
              ;;
      esac
      echo "Manual build selected"
      ;; 
    *)
      debug=""
      echo "Normal build selected"
      GCCOPTS="$GCCOPTS $GCCOPTIMIZE"
      ;;

  esac


whichaddr

# this was once possible to change at build-time, but no more:
language="english"

uname=`uname`

if [ "yes" = "$simulator" ]; then
  # setup compiler and things for simulator
  simcc

  if [ -d "archos" ]; then
    echo "sub directory archos already present"
  else
    mkdir archos
    echo "created an archos subdirectory for simulating the hard disk"
  fi
fi

# Now, figure out version number of the (gcc) compiler we are about to use
gccver=`$CC -dumpversion`;

if [ -z "$gccver" ]; then
  echo "WARNING: The compiler you must use ($CC) is not in your path!"
  echo "WARNING: this may cause your build to fail since we cannot do the"
  echo "WARNING: checks we want now."
else

  # gccver should now be "3.3.5", "3.4.3", "2.95.3-6" and similar, but don't
  # DEPEND on it

 num1=`echo $gccver | cut -d . -f1`
 num2=`echo $gccver | cut -d . -f2`
 gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`

 # This makes:
 # 3.3.X  => 303
 # 3.4.X  => 304
 # 2.95.3 => 295

 echo "Using $CC $gccver ($gccnum)"

 if test "$gccnum" -ge "400"; then 
   # gcc 4.0 is just *so* much pickier on arguments that differ in signedness
   # so we ignore that warnings for now
   # -Wno-pointer-sign
   GCCOPTS="$GCCOPTS -Wno-pointer-sign"
 fi

fi

if test "X$ccache" = "Xyes"; then
  CC="ccache $CC"
fi

if test "X$endian" = "Xbig"; then
  defendian="ROCKBOX_BIG_ENDIAN"
else
  defendian="ROCKBOX_LITTLE_ENDIAN"
fi

sed > autoconf.h \
 -e "s,@ENDIAN@,${defendian},g" \
 -e "s,^#undef ROCKBOX_HAS_LOGF,$use_logf,g" \
 -e "s,@SIMSOUND@,$use_simsound,g" \
<<EOF
/* This header was made by configure */
#ifndef __BUILD_AUTOCONF_H
#define __BUILD_AUTOCONF_H

/* Define endianess for the target or simulator platform */
#define @ENDIAN@ 1

/* Define this if you build rockbox to support the logf logging and display */
#undef ROCKBOX_HAS_LOGF

/* Define this if you have the linux/soundcard.h header and thus can compile
   the sound-playing code in the X11 sim */
@SIMSOUND@

#endif /* __BUILD_AUTOCONF_H */
EOF

if test -n "$t_cpu"; then
  TARGET_INC="-I\$(FIRMDIR)/target/$t_cpu/$t_manufactorer/$t_model"
  TARGET_INC="$TARGET_INC -I\$(FIRMDIR)/target/$t_cpu/$t_manufactorer"
  TARGET_INC="$TARGET_INC -I\$(FIRMDIR)/target/$t_cpu"
  GCCOPTS="$GCCOPTS -DTARGET_TREE"
fi

if test "$simulator" = "yes"; then
  # add simul make stuff on the #SIMUL# line
  simmagic1="s,@SIMUL1@,@\$(MAKE) -C \$(SIMDIR) OBJDIR=\$(BUILDDIR)/sim,"
  simmagic2="s,@SIMUL2@,@\$(MAKE) -C \$(ROOTDIR)/uisimulator/common OBJDIR=\$(BUILDDIR)/comsim,"
else
  # delete the lines that match
  simmagic1='/@SIMUL1@/D'
  simmagic2='/@SIMUL2@/D'
fi

sed > Makefile \
 -e "s,@ROOTDIR@,${rootdir},g" \
 -e "s,@DEBUG@,${debug},g" \
 -e "s,@MEMORY@,${memory},g" \
 -e "s,@TARGET_ID@,${target_id},g" \
 -e "s,@TARGET@,${target},g" \
 -e "s,@ARCHOS@,${archos},g" \
 -e "s,@LANGUAGE@,${language},g" \
 -e "s,@PWD@,${pwd},g" \
 -e "s,@CC@,${CC},g" \
 -e "s,@LD@,${LD},g" \
 -e "s,@AR@,${AR},g" \
 -e "s,@AS@,${AS},g" \
 -e "s,@OC@,${OC},g" \
 -e "s,@WINDRES@,${WINDRES},g" \
 -e "s,@DLLTOOL@,${DLLTOOL},g" \
 -e "s,@DLLWRAP@,${DLLWRAP},g" \
 -e "s,@RANLIB@,${RANLIB},g" \
 -e "s,@TOOL@,${tool},g" \
 -e "s,@BMP2RB_NATIVE@,${bmp2rb_native},g" \
 -e "s,@BMP2RB_MONO@,${bmp2rb_mono},g" \
 -e "s,@BMP2RB_REMOTENATIVE@,${bmp2rb_remotenative},g" \
 -e "s,@BMP2RB_REMOTEMONO@,${bmp2rb_remotemono},g" \
 -e "s,@OUTPUT@,${output},g" \
 -e "s,@APPEXTRA@,${appextra},g" \
 -e "s,@ARCHOSROM@,${archosrom},g" \
 -e "s,@FLASHFILE@,${flash},g" \
 -e "s,@PLUGINS@,${plugins},g" \
 -e "s,@CODECS@,${codecs},g" \
 -e "s,@PROFILE_OPTS@,${PROFILE_OPTS},g" \
 -e "s,@GCCOPTS@,${GCCOPTS},g" \
 -e "s,@TARGET_INC@,${TARGET_INC},g" \
 -e "s!@LDOPTS@!${LDOPTS}!g" \
 -e "s,@LOADADDRESS@,${loadaddress},g" \
 -e "s,@EXTRADEF@,${extradefines},g" \
 -e "s,@APPSDIR@,${appsdir},g" \
 -e "s,@FIRMDIR@,${firmdir},g" \
 -e "s,@TOOLSDIR@,${toolsdir},g" \
 -e "s,@APPS@,${apps},g" \
 -e "s,@SIMVER@,${simver},g" \
 -e "s,@GCCVER@,${gccver},g" \
 -e "s,@GCCNUM@,${gccnum},g" \
 -e "s,@UNAME@,${uname},g" \
 -e "s,@ENDIAN@,${defendian},g" \
 -e "s,@TOOLSET@,${toolset},g" \
 -e "${simmagic1}" \
 -e "${simmagic2}" \
<<EOF
## Automaticly generated. http://www.rockbox.org/

ifndef V
SILENT=@
endif

export ROOTDIR=@ROOTDIR@
export FIRMDIR=@FIRMDIR@
export APPSDIR=@APPSDIR@
export TOOLSDIR=@TOOLSDIR@
export DOCSDIR=\$(ROOTDIR)/docs
export MANUALDIR=\${ROOTDIR}/manual
export DEBUG=@DEBUG@
export ARCHOS=@ARCHOS@
export ARCHOSROM=@ARCHOSROM@
export FLASHFILE=@FLASHFILE@
export TARGET_ID=@TARGET_ID@
export TARGET=@TARGET@
export OBJDIR=@PWD@
export BUILDDIR=@PWD@
export LANGUAGE=@LANGUAGE@
export MEMORYSIZE=@MEMORY@
export VERSION=\$(shell date +%y%m%d-%H%M)
export BUILDDATE=\$(shell date +'-DYEAR=%Y -DMONTH=%m -DDAY=%d')
export MKFIRMWARE=@TOOL@
export BMP2RB_MONO=@BMP2RB_MONO@
export BMP2RB_NATIVE=@BMP2RB_NATIVE@
export BMP2RB_REMOTEMONO=@BMP2RB_REMOTEMONO@
export BMP2RB_REMOTENATIVE=@BMP2RB_REMOTENATIVE@
export BINARY=@OUTPUT@
export APPEXTRA=@APPEXTRA@
export ENABLEDPLUGINS=@PLUGINS@
export SOFTWARECODECS=@CODECS@
export EXTRA_DEFINES=@EXTRADEF@
export HOSTCC=gcc
export CC=@CC@
export LD=@LD@
export AR=@AR@
export AS=@AS@
export OC=@OC@
export WINDRES=@WINDRES@
export DLLTOOL=@DLLTOOL@
export DLLWRAP=@DLLWRAP@
export RANLIB=@RANLIB@
export PROFILE_OPTS=@PROFILE_OPTS@
export GCCOPTS=@GCCOPTS@
export TARGET_INC=@TARGET_INC@
export LOADADDRESS=@LOADADDRESS@
export SIMVER=@SIMVER@
export SIMDIR=\$(ROOTDIR)/uisimulator/\$(SIMVER)
export LDOPTS=@LDOPTS@
export GCCVER=@GCCVER@
export GCCNUM=@GCCNUM@
export UNAME=@UNAME@

# Do not print "Entering directory ..."
MAKEFLAGS += --no-print-directory

.PHONY: all clean tags zip tools manual

all: tools
	@SIMUL1@
	@SIMUL2@
	\$(SILENT)\$(MAKE) -C \$(FIRMDIR) OBJDIR=\$(BUILDDIR)/firmware
	\$(SILENT)\$(MAKE) -C \$(APPSDIR) OBJDIR=\$(BUILDDIR)/@APPS@

veryclean: clean toolsclean

toolsclean:
	\$(SILENT)\$(MAKE) -C \$(TOOLSDIR) clean

clean:
	\$(SILENT)echo Cleaning build directory
	\$(SILENT)rm -rf rockbox.zip TAGS @APPS@ firmware comsim sim lang.[ch]\
                  manual *.pdf *.a credits.raw @OUTPUT@ bitmaps pluginbitmaps \
                  @ARCHOSROM@ @FLASHFILE@ UI256.bmp

tools:
	\$(SILENT)\$(MAKE) -C \$(TOOLSDIR) CC=\$(HOSTCC) @TOOLSET@

tags:
	\$(SILENT)rm -f TAGS
	\$(SILENT)\$(MAKE) -C \$(FIRMDIR) tags
	\$(SILENT)\$(MAKE) -C \$(APPSDIR) tags
	\$(SILENT)\$(MAKE) -C \$(APPSDIR)/plugins tags
	\$(SILENT)\$(MAKE) -C \$(APPSDIR)/plugins/lib tags

zip:
	\$(SILENT)\$(TOOLSDIR)/buildzip.pl -r "\$(ROOTDIR)" \$(TARGET) \$(BINARY)

7zip:
	\$(SILENT)\$(TOOLSDIR)/buildzip.pl -o "rockbox.7z" -z "7za a" -r "\$(ROOTDIR)" \$(TARGET) \$(BINARY)

tar:
	\$(SILENT)rm -f rockbox.tar
	\$(SILENT)\$(TOOLSDIR)/buildzip.pl -o "rockbox.tar" -z "tar --no-recursion -uf" -r "\$(ROOTDIR)" \$(TARGET) \$(BINARY)

bzip2: tar
	\$(SILENT)bzip2 -f9 rockbox.tar

gzip: tar
	\$(SILENT)gzip -f9 rockbox.tar

manual:
	\$(SILENT)\$(MAKE) -C \$(MANUALDIR) OBJDIR=\$(BUILDDIR)/manual buildmanual

help:
	@echo "A few helpful make targets"
	@echo ""
	@echo "all       - builds a full Rockbox (default), including tools"
	@echo "clean     - cleans a build directory (not tools)"
	@echo "veryclean - cleans the build and tools directories"
	@echo "manual    - builds a manual"
	@echo "zip       - creates a rockbox.zip of your build"
	@echo "gzip      - creates a rockbox.tar.gz of your build"
	@echo "bzip2     - creates a rockbox.tar.bz2 of your build"
	@echo "7zip      - creates a rockbox.7z of your build"
	@echo "tools     - builds the tools only"
	@echo "install   - installs your build (for simulator builds only)" 

EOF

if [ "yes" = "$simulator" ]; then

 cat >> Makefile <<EOF

install:
	@echo "installing a full setup in your archos dir"
	@(\$(MAKE) zip && cd archos && unzip -oq ../rockbox.zip)
EOF

fi

echo "Created Makefile"
