Mozilla for PlayStation 2 Cross Compiling Mini-HOWTO 1.0

by Paul A. Pietromonaco ppietro@users.playstation2-linux.com

Created: February 16, 2003

Last edited: November 10, 2004


OVERVIEW: There are occasions when you may not want to compile Mozilla on your PlayStation 2 - especially because of the large size of the source tree (14,000+ source files!), or because your PlayStation 2 is not available (i.e. you want to finish your game!) This Mini-HOWTO will show you how to set up a cross compilation environment to allow you to build Mozilla for the PlayStation 2 in a Red Hat 8.0 Intel environment.


BEFORE YOU BEGIN: You will need to have your PlayStation 2 Linux disc 2 available, and a DVD ROM drive on your Red Hat computer. If you don't have a DVD ROM drive available, you will have to start NFSD on your PlayStation 2 and export disc 2. (Don't worry - I'll explain this when we get there.) This means that you will have to have a network connection between your PlayStation 2 and your Red Hat Linux box.


INSTRUCTIONS: The first thing to do is decide on the location of the cross compilation environment on your Red Hat Linux box. I used the directory /usr/mipsEEel-linux for this walkthrough. I strongly urge you to follow this as well - there are some scripts that depend on this structure.

Regardless if you follow my advice or not, it's important to decide the location early - it has to stay consistent during this whole process!

Then, follow these steps on your Red Hat Intel Linux system:

  1. Log into your Red Hat Linux box as root. This will make life a lot easier! For the purposes of this Mini-HOWTO, I'll assume your login stays in the default /root directory.

  2. Open a terminal window, insert Disc 2 of the PlayStation 2 Linux distribution into your DVD-ROM drive, and mount the filesystem with this command: mount -t udf /dev/cdrom /mnt/cdrom


  3. In your currently open terminal window, type the following command:
    mkdir /usr/mipsEEel-linux
    This is the location of your cross compilation directory.

  4. In your currently open terminal window, type the following command:
    mkdir /usr/mipsEEel-linux/mipsEEel-linux
    This directory is the target architecture. (aka the PlayStation 2!)

    NOTE: It has to be called mipsEEel-linux, regardless of where you locate the cross compilation directory created in the previous step.

  5. Now you need to copy over the PlayStation 2 libraries and associated files so that you can cross compile. The easiest way to do this is to create a file called setup-xrpms.sh with the following:
    #!/bin/sh
    PATH2RPMS=/mnt/cdrom/SCEI/RPMS
    xtarget_arch=mipsEEel-linux
    
    cd /usr/${xtarget_arch}/${xtarget_arch}
    for r in ${PATH2RPMS}/*.rpm; do
            rpm2cpio $r | cpio -ivd
    done
    chmod -R 755 /usr/${xtarget_arch}/${xtarget_arch}
    ln -s usr/include sys-include
    (cd usr/src && ln -sf linux-2.2.1_ps2 linux)
    (cd lib && ln -s ../usr/lib/*.o .)
    
    # modify various build -config scripts
    perl -i.bak -pe "s/\/usr/\/usr\/${xtarget_arch}\/${xtarget_arch}\/usr/g" usr/bin/{glib,gtk,libIDL,orbit}-config usr/lib/libc.so
    perl -i.bak -pe "s/\/lib\/libc.so.6/\/usr\/${xtarget_arch}\/${xtarget_arch}\/lib\/libc.so.6/g" usr/lib/libc.so
    rm -f usr/bin/{glib,gtk,libIDL,orbit}-config.bak usr/lib/libc.so.bak
    
    NOTE: This script assumes that you created the /usr/mipsEEel-linux/mipsEEel-linux directory as outlined above. If you've put the directory somewhere else, you'll have to change the script (which is beyond the scope of this mini-HOWTO!)

  6. In your currently open terminal window, make setup-xrpms.sh executable by typing: chmod 755 setup-xrpms.sh and execute the script: ./setup-xrpms.sh

  7. Download this file from Mozilla.org before starting the next step: binutils-cross-libpatch. This will help the cross compiler find library files. For this example, I'll place it in my /root directory.

  8. Next, you will need to compile and install binutils and apply the cross-libpath patch from the previous step. Luckily, the source is already present on your PlayStation 2. Here's an easy way to make it from your currently open terminal window:


  9. The next step will require you to have the new binutils in your path:
    export PATH=$PATH:/usr/mipsEEel-linux/bin
    in your currently open terminal window will do the trick. After it's compiled, gcc will also be in this directory. Therefore, any time you want to use the cross complier, you will have to include this directory in your path.

  10. Now, you'll need to compile and install gcc. Luckily, the source is already present on your PlayStation 2 as well! Here's an easy way to do it from your currently open terminal window:

    (Don't forget - your current PATH must include /usr/mipsEEel-linux/bin - see the previous step!)


At this point, your cross compiler should be working. You can try building Mozilla if you'd like. If you've never built Mozilla before, there are instructions at their web page: http://www.mozilla.org/build/

Don't forget! You will need to make sure /usr/mipsEEel-linux/bin is in your path before you do any cross compiling!!! (export PATH=$PATH:/usr/mipsEEel-linux/bin)

You will also have to pass some extra compiler directives to cross compile. Generally, you pass --target=mipsEEel-linux and --prefix=/usr/mipsEEel-linux to your ./configure script, but you'll have to check with the documentation for the application you're cross compiling.

For cross-compiling Mozilla, the easiest way is by using .mozconfig. .mozconfig is a simple script file that is placed in your home directory. (i.e. ~/.mozconfig)

Here's an example .mozconfig that I've used:

# sh
# Build configuration script
#
# See http://www.mozilla.org/build/unix.html for build instructions.
#
CROSS_COMPILE=1
GLIB_CONFIG=/usr/mipsEEel-linux/mipsEEel-linux/usr/bin/glib-config
GTK_CONFIG=/usr/mipsEEel-linux/mipsEEel-linux/usr/bin/gtk-config
LIBIDL_CONFIG=/usr/mipsEEel-linux/mipsEEel-linux/usr/bin/libIDL-config
HOST_LIBIDL_CONFIG=/usr/bin/libIDL-config
LIBS=-lc

ac_add_options --prefix=/usr/mipsEEel-linux
ac_add_options --target=mipsEEel-linux
ac_add_options --x-includes=/usr/mipsEEel-linux/mipsEEel-linux/usr/X11R6/include
ac_add_options --x-libraries=/usr/mipsEEel-linux/mipsEEel-linux/usr/X11R6/lib

# Options for 'configure' (same as command-line options).
# all are listed so that one can manually tweak this config file.
#ac_add_options --enable-mathml
#ac_add_options --enable-svg
#ac_add_options --enable-extensions
#ac_add_options --enable-crypto
#ac_add_options --enable-logrefcnt

#ac_add_options --without-system-nspr
#ac_add_options --without-system-zlib
#ac_add_options --without-system-jpeg
#ac_add_options --without-system-png
#ac_add_options --without-system-mng

# Paul's options
ac_add_options --disable-tests
ac_add_options --disable-debug
ac_add_options --enable-optimize
ac_add_options --without-system-nspr
ac_add_options --without-system-zlib
ac_add_options --without-system-jpeg
ac_add_options --without-system-png
ac_add_options --without-system-mng
#ac_add_options --enable-crypto #comment to disable PSM/SSL support
ac_add_options --disable-freetype2

THANKS: Much of this material was adapted from Christopher Seawood's Cross Compiling Mozilla page. Also, Tyler Daniel's ps2stuff page was invaluable in getting this to work. I'm deeply indebted to both of these authors.


APPENDIX: Using NFS on your PlayStation 2 to allow your PC to access Disc 2 of PlayStation 2 Linux

You will need to network the two boxes together. Each box should have a unique IP address. For the purpose of this example, we will use 10.0.0.1 for the PlayStation 2 and 10.0.0.2 for the Red Hat box.

    Sharing the disc from your PlayStation 2:

    1. Log onto your PlayStation 2 as root

    2. Mount Disc 2 of the PlayStation 2 Linux distribution on your DVD-ROM drive with this command: mount -t udf /dev/cdrom /mnt/cdrom

    3. Edit your /etc/exports file, (creating it if necessary) and add the following:
      /mnt/cdrom     (ro,insecure)
    4. Start NFSD by typing: service nfs start

    5. Type the following command: exportfs -a

    6. You're now sharing your DVD-ROM

    Connecting your RedHat box to the PlayStation 2:

    1. Log onto your RedHat box as root

    2. Create a mount point in the /mnt directory: mkdir /mnt/ps2

    3. Mount the PlayStation drive: mount 10.0.0.1:/mnt/cdrom /mnt/ps2
    4. (where 10.0.0.1 is the IP address of your PlayStation 2.)

Now, you should be able to follow the steps above, substituting /mnt/ps2 for /mnt/cdrom.

    Example

    rpm2cpio /mnt/cdrom/SRPMS/binutils-2.9EE-3a.src.rpm | cpio -ivd

    becomes

    rpm2cpio /mnt/ps2/SRPMS/binutils-2.9EE-3a.src.rpm | cpio -ivd

When you're done, you'll need to basically perform the reverse of the steps outlined above:

    Disconnect the share on the PC:

    1. Log into the PC as root

    2. Type: umount /mnt/ps2

    Stop NFS on the PlayStation 2:

    1. Log onto the PlayStation 2 as root

    2. remove the line you added to exports in the step above

    3. Type exportfs -a

    4. Type service nfs stop