Cross Compiling

From OpenTTD

Jump to: navigation, search

Out of Date
This article or section is outdated. Some of its content may no longer be accurate due to changes in the latest release. Please update this article.
This is for revisions of OpenTTD before r7759

This guide will show you how to cross compile OpenTTD on Linux to be run under Windows, using the freely available GNU and MinGW tools. It is based upon the Building a cross compiler (compile on Linux, run on Windows) guide on the Gentoo Forums.

Note
At the moment I cannot get libpng and zlib to work correctly with OpenTTD so if you want you can just ignore the "Zlib and libpng" section.

Contents

[edit] What you will need

The first things you need to get are the sources for GCC and Binutils. You will also need the binaries for the Win32 API and MinGW runtime. The Win32 API and the MinGW Runtime is important because you need a compiler to build those in the first place; but you need those to build the compiler; and so on....

You can get the latest version of these packages from the MinGW website.

  • GNU Binutils - A collection of binary tools.

Download (~30mb)

  • Windows API - Headers and import libs to support the Win32 API

Download

  • MinGW runtime - Run time headers to build a compiler system to build code to be run on Windows

Download

  • GCC - The GNU Compiler Collection

Download

    • You can choose a different mirror.Make sure you download releases/gcc-3.4.3/gcc-3.4.3.tar.gz.

Optional:

  • zlib (compressed save games)

Download

  • libpng (for png screenshots)

Download

[edit] Setting up the directories

First you need to decide where everything will go, you need a temporary directory to build stuff in, and a permanent one to store all the tools in. You do not need system wide access, so they will both fit nicely into your home dir, for example:

~/build - temporary directory for building (build dir)
~/cross-tools - permanent directory for all the tools (dest dir)

So make those directories, cd into them, download the files, and decompress them. GCC and Binutils need to be decompressed in the build dir while MinGW and the Win32 API need to be decompressed into the dest dir:

cd ~
mkdir -p cross-tools/i386-mingw32msvc
mkdir -p build/source
cd ~/build/source
echo "downloading ottd, please correct the VERSION NUMBER"
wget http://nightly.openttd.org/latest/OTTD-source-nightly-r3535.tar.gz
cd ~/cross-tools/i386-mingw32msvc
tar xvfz mingw-runtime-3.7.tar.g
tar xvfz w32api-3.2.tar.gz
cd ~/build
tar xvfz source/binutils-2.15.91-20040904-1-src.tar.gz
tar xvfz source/gcc-3.4.3.tar.gz

Configuring and building GCC and Binutils takes fooorrreeeevver so it is a good idea to keep your source directories clean in case something goes wrong.

mkdir ~/build/binutils-i386-mingw32msvc
mkdir ~/build/gcc-i386-mingw32msvc

[edit] Building Binutils and GCC

Configure, build and install Binutils. This will take a rather long time, so you may want to go and play your favourite game.

cd /home/luca/build/binutils-i386-mingw32msvc
/home/luca/build/binutils-2.15.91-20040904-1/configure --prefix=/home/luca/cross-tools --target=i386-mingw32msvc
make
make install

Next you need to add the path of your newly compiled tools to your PATH variable:

export PATH=/home/luca/cross-tools/bin:$PATH

Make sure you add your current PATH after the new stuff, otherwise you will have problems later on. Now more compiling, GCC this time.

cd /home/luca/build/gcc-i386-mingw32msvc
/home/luca/build/gcc-3.4.3/configure -v --prefix=/home/luca/cross-tools --target=i386-mingw32msvc --with-headers=/home/luca/cross-tools/i386-mingw32msvc/include --with-gnu-as --with-gnu-ld --without-newlib --disable-multilib
make
make install

If all went well, you should have got no errors and should now have a compiler that can compile on Linux for Windows. If you want to free up some space you should clean out the sys-includes directory, it is needed during the gcc compile, but not by anything else.

rm -rf /home/luca/cross-tools/i386-mingw32msvc/sys-include

[edit] Testing

Here is a little test to make sure your compiler is working - it is no use trying anything else unless it is.


Create the file hello.c:

#include <stdio.h>
int main(void)
{
  printf("Hello World!\n");
  exit(0);
}

And to compile:

i386-mingw32msvc-gcc hello.c -o hello.exe

To test it either run it (in a DOS prompt) under Windows:

hello.exe
Hello World!

Or under WINE on Linux:

wine hello.exe
Hello World!

[edit] Zlib and libpng

Next you need to compile zlib...

cd /home/luca/build
tar xvfz zlib-1.2.2.tar.gz
cd zlib-1.2.2/
./configure --prefix=/home/luca/cross-tools/
make CC=i386-mingw32msvc-gcc AR="i386-mingw32msvc-ar rc" RANLIB=i386-mingw32msvc-ranlib
make install prefix=/home/luca/cross-tools/

...and libpng...

cd /home/luca/build
tar xvfz libpng-1.2.8-config.tar.gz
cd libpng-1.2.8-config
cp scripts/makefile.linux Makefile
make target=i386-mingw32msvc host=i386-mingw32msvc build=i386-linux prefix=/home/luca/cross-tools/
make install prefix=/home/luca/cross-tools/

...and voila! You should now be able to compile OpenTTD.

[edit] Compiling OpenTTD

Nothing out of the ordinary needs to be done for OpenTTD, just a few options need to be set in Makefile.config. Everthing else should be left unset / set as the default:

WITH_ZLIB:=0
WITH_PNG:=0
WITH_SDL:=0

WIN32:=1
UNIX:=
MINGW:=1

CC_TARGET:=i386-mingw32msvc-gcc
CC_HOST:=cc
WINDRES:=i386-mingw32msvc-windres
Personal tools