Difference between revisions of "Compiling ScummVM/RPI"

Jump to navigation Jump to search
3,918 bytes added ,  22:11, 8 April 2020
(23 intermediate revisions by the same user not shown)
Line 3: Line 3:
== Installing the official Raspberry Pi cross-compiler on PC ==
== Installing the official Raspberry Pi cross-compiler on PC ==


We will clone the Raspberry Pi tools repository which includes the cross-compiler we need:
We will clone the [https://github.com/raspberrypi/tools Raspberry Pi tools repository] which includes the cross-compiler we need:


git clone https://github.com/raspberrypi/tools.git
<nowiki>git clone https://github.com/raspberrypi/tools.git</nowiki>
It will get cloned to a directory called tools at your current location.


Add it to the path so we have the crosscompiler binaries available from our scummvm building directory. If my raspberrry pi tools repository ended cloned in tools at my home directory, I would do:
It will get cloned to a directory called ''tools'' at your current location.


PATH=$PATH:$HOME/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin
Add it to the ''PATH'' environment variable so that we have the cross-compiler binaries available from our scummvm building directory. For example, if my Raspberry Pi ''tools'' repository ended cloned in ''tools'' under my ''home'' directory, I would do:


After adding the crosscompiler executables directory to the path, we should be able to run arm-linux-gnueabihf-gcc, arm-linux-gnueabihf-g++, etc... just try. They should yield an error because you pass them no input files, but that's expected. It's just a test so we know we've the crosscompiler installed and accesible.
<nowiki>export PATH=$PATH:$HOME/tools/arm-bcm2708/arm-linux-gnueabihf/bin</nowiki>
 
After adding the cross-compiler executables directory to ''PATH'', we should be able to run ''arm-linux-gnueabihf-gcc'', ''arm-linux-gnueabihf-g++'', etc... just try. They should yield an error because you pass them no input files, but that's expected. It's just a test so we know we have the cross-compiler installed and accessible.


== Installing the needed Raspberry Pi headers and libraries on PC ==
== Installing the needed Raspberry Pi headers and libraries on PC ==


We need to copy over the /usr, /lib and /opt directories from your Raspbian SD to your PC (the computer were you will do the cross-compilation), for the needed headers and libs to be available.  
We need to copy over the '''/usr''', '''/lib''' and '''/opt''' directories from your Raspbian SD Card to your '''host PC''' (the computer were you will do the cross-compilation) for the needed headers and libraries to be available.
Of course, you'll have to install any additonal libs from Raspbian running of the Pi before expecting them to be available, so if you compile scummvm with FLAC support, you should have installed the libflac development libs on the Pi first.
 
Of course, first you'll have to install any additional libraries from Raspbian running on the Pi before expecting them to be available so, if you want compile ScummVM with FLAC support, you should have installed the libflac development libraries on the Pi beforehand.
 
As an example, on the Raspberry Pi running Raspbian (Buster) OS 3.2 (January 2020) we can execute the following to install third party libraries that ScummVM needs for its features and various game engines:


First we export the path where we will copy these into, and then we will manually copy them. I choose /opt/rpi_root, but any other path with the right permissions for your user and common sense is going to be ok:
<nowiki>
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y --no-install-recommends \
            libsdl2-dev \
            liba52-0.7.4-dev \
            libjpeg62-turbo-dev \
            libmpeg2-4-dev \
            libogg-dev \
            libvorbis-dev \
            libflac-dev \
            libmad0-dev \
            libpng-dev \
            libtheora-dev \
            libfaad-dev \
            libfluidsynth-dev \
            libfreetype6-dev \
            libcurl4-openssl-dev  \
            libsdl2-net-dev \
            libspeechd-dev \
            zlib1g-dev</nowiki>


On the '''host PC''' we first export the path where we will copy these into, and then we manually copy them. I choose to copy the Raspberry Pi headers and libraries to ''/opt/rpi_root'', but any other path with the right permissions for your user (within common sense) should be ok:
<nowiki>
mkdir -p /opt/rpi_root
mkdir -p /opt/rpi_root
export RPI_ROOT=/opt/rpi_root
cd <Raspbian_SD_card_mountpoint_directory>
cp -R usr lib opt $RPI_ROOT</nowiki>


export RPI_ROOT=/opt/rpi_root
The above copying of files has the unfortunate side-effect that many symbolic links that were copied over are now invalid, particularly those linking to absolute paths. Fortunately, we can remedy this situation by downloading and running a python script that will fix those links:


cd <SD_mountpoint_directory>
<nowiki>wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py $RPI_ROOT</nowiki>


cp -R usr lib opt $RPI_ROOT
Finally, update the ''PATH'' variable to be preceded by the ''RPI_ROOT'' path, since this is required for proper detection of ''libcurl'' related files by ScummVM's ''configure'' script.
<nowiki>export PATH=$RPI_ROOT:$PATH</nowiki>


== Configuring ScummVM ==
== Configuring ScummVM ==


Now we configure scummvm buildsystem so it knows what backend we want and where is our raspberry pi local sysroot living, containing the Raspberry Pi headers and libs the cross-compiler and linker will need. In this example configuration, we disable additional libs, and debug symbols since it's intended for final users.
First, you should make sure have the latest version of the ScummVM code locally (using ''git clone'' or ''git pull'' appropriately).  


./configure --host=raspberrypi --with-sdl-prefix=$RPI_ROOT/usr  --disable-debug --enable-release --enable-optimizations --disable-mt32emu --disable-flac --disable-mad --disable-vorbis --disable-tremor --disable-fluidsynth --disable-taskbar --disable-timidity --disable-alsa
Then, navigate inside your local ''scummvm'' source code folder.


Remember you should have exported the RPI_ROOT enviroment variable previously.
Now we can configure ScummVM buildsystem so it knows what backend we target and where our Raspberry Pi ''local sysroot'' is located, containing the Raspberry Pi headers and libraries the cross-compiler and linker will need. In this example configuration, we disable debug symbols since it's intended for final users.
On the raspberrypi host, SDL2 will be always used since it provides graphics acceleration.


''Note:'' If you are building ScummVM on your RPi itself, you might run out of memory during linking. If you use GNU ld for compiling you can try exporting LDFLAGS="-Wl,--no-keep-memory" before running configure. This tells GNU ld to optimize for memory usage.
<nowiki>
PKG_CONFIG_SYSROOT_DIR=$RPI_ROOT PKG_CONFIG_LIBDIR=$RPI_ROOT/usr/lib/arm-linux-gnueabihf/pkgconfig ./configure --host=raspberrypi --with-sdl-prefix=$RPI_ROOT/usr --with-png-prefix=$RPI_ROOT/usr --disable-debug --enable-release</nowiki>
 
Remember you should have exported the ''RPI_ROOT'' environment variable previously and updated the ''PATH'' environment variable to be preceded by the ''RPI_ROOT'' path and succeeded by the path to the Raspberry Pi toolchain bin folder (as shown in the previous steps).
 
On the Raspberry Pi, ''SDL2'' will always be used, since it provides graphics acceleration.
 
Unfortunately, the official toolchain for cross-compiling for Pi is, as of yet, using an old ''gcc'' version (4.3.9) and hence, the configure script may fail to detect the ''FluidSynth'' library specifically. FluidSynth and MT-32 emulation are features that are very demanding on CPU processing power so it should be ok to skip them entirely. Alternatively, you could seek out a more up-to-date ''armhf'' toolchain for the cross-compilation, such as this [https://github.com/Pro/raspi-toolchain/releases Raspberry Pi toolchain by Stefan Profanter (Pro)] which, in its 1.0.1 version, uses ''gcc'' version 8.3.0 and reportedly "supports all new Raspberry PIs (ARMv7), and the older ones, including Zero, A, B, B+ (ARMv6) with newer GCCs."
 
'''Note 1:''' If you use the Raspberry Pi toolchain by Stefan Profanter (Pro), then make sure you read the instructions from the README file ([https://github.com/Pro/raspi-toolchain also available from the main page of the repository]). Specifically, this toolchain needs to be installed in ''/opt/cross-pi-gcc'' since it's not location independent.
 
'''Note 2:''' If you are building ScummVM directly on your Raspberry Pi itself, you might run out of memory during the final linking process of the build. If you use GNU ''ld'' for compiling, you could execute the following before running ''configure'':
<nowiki>export LDFLAGS="-Wl,--no-keep-memory"</nowiki>
This tells GNU ''ld'' to optimize for memory usage.


== Compiling ScummVM ==
== Compiling ScummVM ==


run "make clean" and then "make -j<n>", where n is the number of cores available on your compilation machine x2.
Run the following commands:
<nowiki>
make clean
make -j$(nproc)</nowiki>
 
== Installing ScummVM on the Raspberry Pi ==
 
Simply copy over the resulting ''scummvm'' executable to your Raspberry Pi (Raspbian OS) SD Card. A good idea is to create a ''scummvm'' folder in your ''/home/pi'' directory on the Raspian OS SD Card, and put the executable there along with any games you want to use with it.


== Installing ScummVM ==
In order to have the text-to-speech feature available for ScummVM you should also install the speech-dispatcher package and a text-to-speech engine (as per the instructions in this pertinent [https://github.com/scummvm/scummvm/pull/1808 Pull Request])


Simply copy over the resulting scummvm executable to your Raspberry Pi sd. A good idea is to create an scummvm folder in your /home/pi directory, and put the executable there along with the games you want to use with it.
For example you'd need to execute the following on your Raspbian OS on the Pi in order to use the espeak-ng text-to-speech engine:
<nowiki>sudo apt-get install --no-install-recommends speech-dispatcher speech-dispatcher-espeak-ng</nowiki>
1,310

edits

Navigation menu