GnuPoc and Series 60

This is how I got GnuPoc working with version 1.0 of the Series 60 SDK on Linux/x86.

1. Download the SDK and install it

Download the 1.0 SDK from Forum Nokia and then install it. It might be possible to install it through wine somehow but I installed it in Windows.

2. Download the GnuPoc patch

It’s available from As of this writing “gnupoc-s60cpp-patch-0.0.5.tar.gz 24. Jan 2003 (patched against version 0.9 of the SDK)” is the latest version. And because it’s for version 0.9 there will be a need for some tweaking as described later.

Extract the patch somewhere and read the instructions.

3. Download my patch

Find it at

4. Download the common scripts and tools

It’s on the gnupoc site. The latest version is called “gnupoc-scripts-2003.01.25.tar.gz”.

Extract it somewhere, e.g. in /home/foo/epoc/scripts

5. Download the cross compiler

It’s also available from the gnupoc site. I was lazy and got the binary package.

Extract the package somewhere or build and install the source package if you chose that. I used the default location /usr/local/er6

6. Copy the files

Copy the files from the installed SDK in windows to some location in your Linux filesystem. Let’s say /home/foo/epoc/epoc32. You need to copy the data, include, localisation, release, tools and wins

You have to lowercase the names. One can for this manually but that’s less than one. Doing it with a shell script might work. As I transfered the directories in .zip archives I used the -L flag for unzip when extracting and got everything in lowercase. You might be able to do something similar.

7. Set environment variables

Set EPOCROOT to the directory containing the epoc32 directory. In this case /home/foo/epoc/ Note it requires a trailing slash. Include the $EPOCROOT/epoc32/tools and the cross compilers bin directory in the PATH.

    $ cat "export EPOCROOT=/home/foo/epoc/" >> $HOME/.zshrc
    $ cat "export PATH=$PATH:$EPOCROOT/epoc32/tools:/usr/local/er6/bin" >> $HOME/.zshrc
    $ . $HOME/.zshrc

Make necessary changes if you use another shell than zsh.

8. Fix the source code

Go to /home/foo/epoc/ and run the script, like this.

    $ scripts/ epoc32 epoc32_clean

Then clean up:

    $ rm -rf epoc32
    $ mv epoc32_clean epoc32

9. Apply the patches

Now it’s time to apply the patches. Go to the /home/foo/epoc/epoc32/tools directory and then patch.

    $ cd /home/foo/epoc/epoc32/tools
    $ patch -p1 < /path/to/the/gnupoc/patch

You’re going to get a reject for the file. So now patch with my patch.

    $ cd /home/foo/epoc/epoc32/tools
    $ patch -p1 < /path/to/my/patch

10. Fix permissions

    $ cd $EPOCROOT/epoc32/tools
    $ chmod a+x *.pl bldmake abld

11. Build your project

You should now be able to build a Symbian executable. Change to the directory containing your project’s Bld.inf file and do the following:

    $ mv Bld.inf bld.inf
    $ bldmake bldfiles
    $ abld makefile thumb
    $ abld target thumb urel

Update: The last two steps can actually be combined to one by use doing ‘abld build thumb urel’.

If you’re project is including the e32std.h header file you will most likely have to comment out the DECLARE_ROM_ARRAY define on line 3012. I couldn’t find AName, AData nor AType anywhere in the EPOC include files I have. Commenting out the define solved the compile error and it doesn’t seem to affect anything.


I took most of this from my memory so it’s very possible that I missed a step or some part of a step. If you do try this out and it doesn’t work please inform me of any changes you had to do. Thanks!