Difference between revisions of "Compiling ScummVM/Wii"
(wii build instructions) |
m |
||
Line 11: | Line 11: | ||
= Mandatory tools and libraries = | = Mandatory tools and libraries = | ||
* [http://devkitpro.org/ devkitPPC] as a build environment, please refer to its documentation to set it up | * [http://devkitpro.org/ devkitPPC] as a build environment, please refer to its documentation how to set it up | ||
* libogc and libfat | * libogc and libfat | ||
Line 20: | Line 20: | ||
* libogc's <tt>malloc()</tt> has been [http://git.hackmii.com/git.php?tag=ce9b85c1fa659d39ac26b72b82e31844c50bfdf6&p=libogc.git&a=commitdiff&h=ce9b85c1fa659d39ac26b72b82e31844c50bfdf6&hb=28e632dab2820a98ea3399e3090761581f034df7&tm=1366734 modfied] to utilize [http://wiibrew.org/wiki/Memory_Map MEM2]. Without this patch, a single binary with all game engines won't be able to run all games (like COMI) due to memory limits | * libogc's <tt>malloc()</tt> has been [http://git.hackmii.com/git.php?tag=ce9b85c1fa659d39ac26b72b82e31844c50bfdf6&p=libogc.git&a=commitdiff&h=ce9b85c1fa659d39ac26b72b82e31844c50bfdf6&hb=28e632dab2820a98ea3399e3090761581f034df7&tm=1366734 modfied] to utilize [http://wiibrew.org/wiki/Memory_Map MEM2]. Without this patch, a single binary with all game engines won't be able to run all games (like COMI) due to memory limits | ||
* libfat gained a read-ahead cache, without it video sequences will stutter | * libfat gained a read-ahead cache, without it video sequences will stutter | ||
If you're going to use the git repository, use my branches (''origin/dhewg'') for now, that's what i'm using. | |||
Nevertheless, ScummVM should build just fine with either versions. | Nevertheless, ScummVM should build just fine with either versions. | ||
Line 37: | Line 39: | ||
== Precompiled binaries == | == Precompiled binaries == | ||
Get [http://static.hackmii.com/dhewg/devkitPPC_r16_3rd_libs.tar.bz2 this archive] and extract it in <tt>$DEVKITPRO/3rd/</tt> you just created. The directory structure should look like <tt>$DEVKITPRO/3rd/wii/include</tt> | Get [http://static.hackmii.com/dhewg/devkitPPC_r16_3rd_libs.tar.bz2 this archive] and extract it in <tt>$DEVKITPRO/3rd/</tt> you just created. The directory structure should look like | ||
<tt>$DEVKITPRO/3rd/wii/include</tt> | |||
<tt>$DEVKITPRO/3rd/wii/lib</tt> | |||
and so on. The binaries will work on Wii and Gamecube. | |||
== Build the libraries yourself == | == Build the libraries yourself == | ||
Line 63: | Line 68: | ||
echo "./configure --host=ppc --disable-shared --prefix=${DEVKITPRO}/3rd/wii" | echo "./configure --host=ppc --disable-shared --prefix=${DEVKITPRO}/3rd/wii" | ||
Save it to a file (like <tt>gekkoenv.sh</tt> and run | Save it to a file (like <tt>gekkoenv.sh</tt>) and run | ||
. ./gekkoenv.sh | . ./gekkoenv.sh | ||
Line 157: | Line 162: | ||
Change your working directory to the latter and open the <tt>Makefile</tt> in a editor. You'll find some variables on top of that file, adjust those to your liking. Everything should be self-explanatory, some are even documented. Here are some random hints: | Change your working directory to the latter and open the <tt>Makefile</tt> in a editor. You'll find some variables on top of that file, adjust those to your liking. Everything should be self-explanatory, some are even documented. Here are some random hints: | ||
* There is no support for dynamic libraries on the Wii, keep an engine toggle at <tt>STATIC_PLUGIN</tt> or disable it by just commenting that line | * There is no support for dynamic libraries on the Wii or Gamecube, keep an engine toggle at <tt>STATIC_PLUGIN</tt> or disable it by just commenting that line | ||
* Vanilla scalers do not work, the code is i386 only | * Vanilla scalers do not work, the code is i386 only | ||
* [http://www.zlib.net/ zlib] and [http://www.underbit.com/products/mad/ MAD] are part of libogc | * [http://www.zlib.net/ zlib] and [http://www.underbit.com/products/mad/ MAD] are part of libogc | ||
* MPEG2 support has been dropped from the Wii port, if you want | * MPEG2 support has been dropped from the Wii port, if you want support for it, you have to cross compile [http://libmpeg2.sourceforge.net/ libmpeg2] | ||
When you're done with the <tt>Makefile</tt>, save it and run <tt> | When you're done with the <tt>Makefile</tt>, save it and run <tt>make</tt> (GNU version). That's it, the build system is now building an ''.elf'' and a ''.dol''. | ||
Test the ''.dol'' by uploading it using ''wiiload'' via: | Test the ''.dol'' by uploading it using ''wiiload'' via: |
Revision as of 23:50, 23 December 2008
Compiling ScummVM for Wii or Gamecube
This page describes how you build a Wii or Gamecube binary from the ScummVM source tree.
First, you have to choose how to obtain the sources:
- a downloaded sources archive
- a SVN checkout (latest is trunk)
Required tools and/or libraries might change at times, and differences for various ScummVM versions are pointed out when necessary.
Mandatory tools and libraries
- devkitPPC as a build environment, please refer to its documentation how to set it up
- libogc and libfat
The latter two libraries are part of devkitPPC and are already installed with it. However, official ScummVM Wii and Gamecube binaries use unofficial versions, available via git here.
Reasons:
- libogc's malloc() has been modfied to utilize MEM2. Without this patch, a single binary with all game engines won't be able to run all games (like COMI) due to memory limits
- libfat gained a read-ahead cache, without it video sequences will stutter
If you're going to use the git repository, use my branches (origin/dhewg) for now, that's what i'm using.
Nevertheless, ScummVM should build just fine with either versions.
Versions differences
- v0.12.0 (first official version) is built with devkitPPC r15
- trunk (and eventually v0.13.0) changed to devkitPPC r16
Optional libraries
Again, you have two options:
Precompiled binaries
Get this archive and extract it in $DEVKITPRO/3rd/ you just created. The directory structure should look like
$DEVKITPRO/3rd/wii/include $DEVKITPRO/3rd/wii/lib
and so on. The binaries will work on Wii and Gamecube.
Build the libraries yourself
These steps require some patching and fiddling with the required autotools and problems may arise (depending on your OS). Works for me (tm), good luck :P
Here's a a simple script to set up a shell for crosscompiling:
#!/bin/sh PREFIX=${DEVKITPPC}/bin/powerpc-gekko- export CC=${PREFIX}gcc export CXX=${PREFIX}g++ export AS=${PREFIX}gcc export LD=${PREFIX}gcc export AR=${PREFIX}ar cru export RANLIB=${PREFIX}ranlib export STRIP=${PREFIX}strip export OBJCOPY=${PREFIX}objcopy export MACHDEP="-g -Os -Wall -DGEKKO -mcpu=750 -meabi -mhard-float -ffunction-sections -fdata-sections -fmodulo-sched" export CFLAGS="${MACHDEP}" export CXXFLAGS="${CFLAGS}" export LDFLAGS="${MACHDEP}" echo "./configure --host=ppc --disable-shared --prefix=${DEVKITPRO}/3rd/wii"
Save it to a file (like gekkoenv.sh) and run
. ./gekkoenv.sh
in your shell. Build systems should now use the correct tools.
Tremor
Get a SVN checkout (rev 15592 as of this writing):
svn co http://svn.xiph.org/branches/lowmem-branch/Tremor
patch it:
--- Tremor-vanilla/misc.h 2008-12-20 17:09:56.000000000 +0100 +++ Tremor/misc.h 2008-12-23 22:44:58.000000000 +0100 @@ -48,7 +48,7 @@ #include <sys/types.h> -#if 0 +#if BYTE_ORDER==LITTLE_ENDIAN union magic { struct { ogg_int32_t lo; @@ -58,7 +58,7 @@ }; #endif -#if 1 +#if BYTE_ORDER==BIG_ENDIAN union magic { struct { ogg_int32_t hi;
configure it:
./autogen.sh --host=ppc --disable-shared --prefix=${DEVKITPRO}/3rd/wii --enable-low-accuracy
and finally build & install it:
make make install
FLAC
Get a tarball of the latest stable version here (v1.2.1 as of this writing), extract it, patch it:
diff -ur flac-1.2.1-vanilla/src/libFLAC/bitreader.c flac-1.2.1/src/libFLAC/bitreader.c --- flac-1.2.1-vanilla/src/libFLAC/bitreader.c 2007-09-11 06:48:55.000000000 +0200 +++ flac-1.2.1/src/libFLAC/bitreader.c 2008-12-23 23:14:00.000000000 +0100 @@ -42,7 +42,7 @@ #elif defined __MINGW32__ #include <winsock.h> /* for ntohl() */ #else -#include <netinet/in.h> /* for ntohl() */ +//#include <netinet/in.h> /* for ntohl() */ #endif #include "private/bitmath.h" #include "private/bitreader.h" diff -ur flac-1.2.1-vanilla/src/libFLAC/bitwriter.c flac-1.2.1/src/libFLAC/bitwriter.c --- flac-1.2.1-vanilla/src/libFLAC/bitwriter.c 2007-09-11 01:08:38.000000000 +0200 +++ flac-1.2.1/src/libFLAC/bitwriter.c 2008-12-23 23:13:59.000000000 +0100 @@ -42,7 +42,7 @@ #elif defined __MINGW32__ #include <winsock.h> /* for ntohl() */ #else -#include <netinet/in.h> /* for ntohl() */ +//#include <netinet/in.h> /* for ntohl() */ #endif #if 0 /* UNUSED */ #include "private/bitmath.h"
configure it:
./configure --host=ppc --disable-shared --prefix=${DEVKITPRO}/3rd/wii --disable-doxygen-docs --disable-xmms-plugin --disable-ogg --disable-oggtest --disable-rpath
and build & install the required parts:
make -C src/libFLAC make -C src/libFLAC install make -C include install
Compiling
This port doesn't utilize ScummVM's configure system, instead it comes with a simple Makefile. The port code can be found in two directories:
./backends/fs/wii/ ./backends/platform/wii/
The former is a unified filesystem interface for ScummVM, the more interesting code is in the latter.
Change your working directory to the latter and open the Makefile in a editor. You'll find some variables on top of that file, adjust those to your liking. Everything should be self-explanatory, some are even documented. Here are some random hints:
- There is no support for dynamic libraries on the Wii or Gamecube, keep an engine toggle at STATIC_PLUGIN or disable it by just commenting that line
- Vanilla scalers do not work, the code is i386 only
- zlib and MAD are part of libogc
- MPEG2 support has been dropped from the Wii port, if you want support for it, you have to cross compile libmpeg2
When you're done with the Makefile, save it and run make (GNU version). That's it, the build system is now building an .elf and a .dol.
Test the .dol by uploading it using wiiload via:
make upload
If you want to copy your compiled binary to SD, use the command
make dist
which generates the folder dist with all the required files to run it.