Difference between revisions of "Compiling ScummVM/Nintendo 3DS"
Ccawley2011 (talk | contribs) m |
Ccawley2011 (talk | contribs) m |
||
(One intermediate revision by the same user not shown) | |||
Line 2: | Line 2: | ||
=== Prerequisites === | === Prerequisites === | ||
* Latest version of devkitPro, which comes with devkitARM and <code>libctru</code> | * Latest version of devkitPro, which comes with devkitARM and <code>libctru</code> | ||
* <code>citro3d</code> thorugh devkitPro's pacman | * <code>citro3d</code> thorugh devkitPro's pacman | ||
* Optional: You should compile third-party libraries for the 3ds (commonly referred to as portlibs in the devkitPRO community). Some games requires these to operate properly. | * Optional: You should compile third-party libraries for the 3ds (commonly referred to as portlibs in the devkitPRO community). Some games requires these to operate properly. | ||
=== Compiling third-party libraries === | |||
==== Compiling third-party libraries ==== | |||
It is strongly recommended that you use devkitPro's pacman in order to get the most recent | It is strongly recommended that you use devkitPro's pacman in order to get the most recent | ||
portlibs for your build. | portlibs for your build. Instructions for accessing these binaries can be found here: | ||
https://devkitpro.org/wiki/devkitPro_pacman | |||
The following libraries can be downloaded with pacman: | The following libraries can be downloaded with pacman: | ||
{|class="wikitable" | {|class="wikitable" | ||
! Library || Package | ! Library || Package | ||
Line 30: | Line 32: | ||
|- | |- | ||
| flac || 3ds-flac | | flac || 3ds-flac | ||
|- | |||
| curl || 3ds-curl | |||
|- | |- | ||
| libtheora || 3ds-libtheora | | libtheora || 3ds-libtheora | ||
|} | |} | ||
Line 47: | Line 49: | ||
The following pacman packages are also recommended: | The following pacman packages are also recommended: | ||
* <code>3ds-dev</code> | * <code>3ds-dev</code> | ||
* <code> | * <code>dkp-toolchain-vars</code> | ||
Once you have the <code> | Once you have the <code>dkp-toolchain-vars</code> package, you should be able to find the following | ||
the following scripts in your <code>/opt/devkitpro</code> folder: | scripts in your <code>/opt/devkitpro</code> folder: | ||
* <code>devkitarm.sh</code> | * <code>devkitarm.sh</code> | ||
* <code>3dsvars.sh</code> | * <code>3dsvars.sh</code> | ||
Run them one after the other with | Run them one after the other with <code>source</code> in order to setup your environment variables | ||
for cross-compiling: | for cross-compiling: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Line 64: | Line 66: | ||
scripts that they may have, and then they can usually be built with the following steps | scripts that they may have, and then they can usually be built with the following steps | ||
from their source directory: | from their source directory: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
mkdir -p $ | mkdir -p $PORTLIBS | ||
./configure --prefix=$ | ./configure --prefix=$PORTLIBS --host=arm-none-eabi --disable-shared --enable-static | ||
make | make | ||
make install | make install | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Most libraries used can be compiled with same commands and configuration flags. | Most libraries used can be compiled with same commands and configuration flags. | ||
=== Manually setting up the environment === | ==== Manually setting up the environment ==== | ||
In case you don't have the | In case you don't have the <code>dkp-toolchain-vars</code> package downloaded, you can use the | ||
your environment variables. | following to set-up your environment variables. | ||
It is assumed that you have these variables already set up. If not, then do so: | It is assumed that you have these variables already set up. If not, then do so: | ||
{|class="wikitable" | {|class="wikitable" | ||
| DEVKITPRO || Your root devkitPro directory | | DEVKITPRO || Your root devkitPro directory (usually /opt/devkitpro) | ||
|- | |- | ||
| DEVKITARM || Your root devkitARM directory (probably same as $DEVKITPRO/devkitARM) | | DEVKITARM || Your root devkitARM directory (probably same as $DEVKITPRO/devkitARM) | ||
|- | |- | ||
| CTRULIB || Your root libctru directory (probably same as $DEVKITPRO/libctru) | | CTRULIB || Your root libctru directory (probably same as $DEVKITPRO/libctru) | ||
|} | |} | ||
In the source directory of the library: | In the source directory of the library: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
export | export PORTLIBS=$DEVKITPRO/portlibs/3ds | ||
export PATH=$DEVKITARM/bin:$PATH | export PATH=$DEVKITPRO/tools/bin:$PORTLIBS/bin:$DEVKITARM/bin:$PATH | ||
export PKG_CONFIG_PATH=$ | export PKG_CONFIG_PATH=$PORTLIBS/lib/pkgconfig | ||
export PKG_CONFIG_LIBDIR=$ | export PKG_CONFIG_LIBDIR=$PORTLIBS/lib/pkgconfig | ||
export CFLAGS="-g -march=armv6k -mtune=mpcore -mfloat-abi=hard -O2 | export CFLAGS="-g -march=armv6k -mtune=mpcore -mfloat-abi=hard -O2 | ||
-mword-relocations -ffunction-sections -fdata-sections" | -mword-relocations -ffunction-sections -fdata-sections" | ||
export CPPFLAGS="-I$ | export CXXFLAGS="$CFLAGS" | ||
export LDFLAGS="-L$ | export CPPFLAGS="-D_3DS -D__3DS__ -I$PORTLIBS/include -I$CTRULIB/include" | ||
export LDFLAGS="-L$PORTLIBS/lib -L$CTRULIB/lib" | |||
export TOOL_PREFIX=arm-none-eabi- | |||
export CC=${TOOL_PREFIX}gcc | |||
export CXX=${TOOL_PREFIX}g++ | |||
export AR=${TOOL_PREFIX}gcc-ar | |||
export RANLIB=${TOOL_PREFIX}gcc-ranlib | |||
export LIBS="-lctru" | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 105: | Line 112: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
export PATH=$DEVKITARM/bin:$PATH | export PATH=$DEVKITARM/bin:$PATH | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Note: In more recent codebases of ScummVM, you may or may not need to set the following beforehand: | Note: In more recent codebases of ScummVM, you may or may not need to set the following beforehand: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
export PKG_CONFIG_LIBDIR=$ | export PKG_CONFIG_LIBDIR=$PORTLIBS/lib/pkgconfig | ||
</syntaxhighlight> | </syntaxhighlight> | ||
See above for | See above for $PORTLIBS. | ||
ScummVM doesn't provide the CA certificates bundle required by the cloud synchronization features. | ScummVM doesn't provide the CA certificates bundle required by the cloud synchronization features. |
Latest revision as of 21:58, 23 April 2024
Compiling ScummVM for Nintendo 3DS
Prerequisites
- Latest version of devkitPro, which comes with devkitARM and
libctru
citro3d
thorugh devkitPro's pacman- Optional: You should compile third-party libraries for the 3ds (commonly referred to as portlibs in the devkitPRO community). Some games requires these to operate properly.
Compiling third-party libraries
It is strongly recommended that you use devkitPro's pacman in order to get the most recent portlibs for your build. Instructions for accessing these binaries can be found here: https://devkitpro.org/wiki/devkitPro_pacman
The following libraries can be downloaded with pacman:
Library | Package |
---|---|
zlib | 3ds-zlib |
libpng | 3ds-libpng |
libjpeg | 3ds-libjpeg-turbo |
freetype2 | 3ds-freetype |
libmad | 3ds-libmad |
libogg | 3ds-libogg |
tremor | 3ds-libvorbisidec |
flac | 3ds-flac |
curl | 3ds-curl |
libtheora | 3ds-libtheora |
At the moment of writing, the version of freetype2
packaged by devkitPro has an issue
where it allocates too much data on the stack when ScummVM loads GUI themes.
As a workaround, an older version can be used. Version 2.6.5 is known to work well. The
instructions below can be used to compile it.
At the moment of writing, faad
is not in the devkitPro 3DS pacman repository. It
can be compiled by following the instructions in the section below, in case it cannot
be found through pacman.
The following pacman packages are also recommended:
3ds-dev
dkp-toolchain-vars
Once you have the dkp-toolchain-vars
package, you should be able to find the following
scripts in your /opt/devkitpro
folder:
devkitarm.sh
3dsvars.sh
Run them one after the other with source
in order to setup your environment variables
for cross-compiling:
source /opt/devkitpro/devkitarm.sh
source /opt/devkitpro/3dsvars.sh
After that, you can download the libraries you want to cross compile, run any autoconf scripts that they may have, and then they can usually be built with the following steps from their source directory:
mkdir -p $PORTLIBS
./configure --prefix=$PORTLIBS --host=arm-none-eabi --disable-shared --enable-static
make
make install
Most libraries used can be compiled with same commands and configuration flags.
Manually setting up the environment
In case you don't have the dkp-toolchain-vars
package downloaded, you can use the
following to set-up your environment variables.
It is assumed that you have these variables already set up. If not, then do so:
DEVKITPRO | Your root devkitPro directory (usually /opt/devkitpro) |
DEVKITARM | Your root devkitARM directory (probably same as $DEVKITPRO/devkitARM) |
CTRULIB | Your root libctru directory (probably same as $DEVKITPRO/libctru) |
In the source directory of the library:
export PORTLIBS=$DEVKITPRO/portlibs/3ds
export PATH=$DEVKITPRO/tools/bin:$PORTLIBS/bin:$DEVKITARM/bin:$PATH
export PKG_CONFIG_PATH=$PORTLIBS/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PORTLIBS/lib/pkgconfig
export CFLAGS="-g -march=armv6k -mtune=mpcore -mfloat-abi=hard -O2
-mword-relocations -ffunction-sections -fdata-sections"
export CXXFLAGS="$CFLAGS"
export CPPFLAGS="-D_3DS -D__3DS__ -I$PORTLIBS/include -I$CTRULIB/include"
export LDFLAGS="-L$PORTLIBS/lib -L$CTRULIB/lib"
export TOOL_PREFIX=arm-none-eabi-
export CC=${TOOL_PREFIX}gcc
export CXX=${TOOL_PREFIX}g++
export AR=${TOOL_PREFIX}gcc-ar
export RANLIB=${TOOL_PREFIX}gcc-ranlib
export LIBS="-lctru"
Compiling ScummVM
Do the following in a fresh terminal.
In case you get a "compiler not found" message, add the toolchain's executables to your PATH:
export PATH=$DEVKITARM/bin:$PATH
Note: In more recent codebases of ScummVM, you may or may not need to set the following beforehand:
export PKG_CONFIG_LIBDIR=$PORTLIBS/lib/pkgconfig
See above for $PORTLIBS.
ScummVM doesn't provide the CA certificates bundle required by the cloud synchronization features. You need to download it from the curl website: https://curl.haxx.se/ca/cacert.pem, and instruct the build system to package it in the binary:
export DIST_3DS_EXTRA_FILES=/path/to/cacert.pem
The name of the file must be cacert.pem
.
From the root of the scummvm repository:
./configure --host=3ds --enable-plugins --default-dynamic
make
Additionally compile to specific formats to be used on the 3DS:
make scummvm.3dsx
make scummvm.cia
Assuming everything was successful, you'll be able to find the binary files in the root of your scummvm folder.
Note: for the CIA format, you will need the makerom
and bannertool
tools which are
not supplied with devkitPro.
Note: using dynamic plugins as suggested is required when building with most or all of the game engines enabled in order to keep the memory usage low and avoid stability issues.