# Xbox 360/Xbox Development on the Mac

This article describes the process to configure an iBook to compile C code written with OpenXDK, and make Xbox native executables. At the time of writing, the author had successfully compiled a Windows executable but had not been able to convert it to an Xbox executable.

## Overview

All of these steps are fairly straight forward, although there are some tricks that the novice needs to know to bypass hours of "googling". The process taken is similar to installing OpenXDK on Linux, but differs because in this example we're using a PowerPC processor. This means that we first have to build a cross compiler. The assumption is that you know how to access the shell.

## DarwinPorts

DarwinPorts is a way to track and install open source programs to your system easily. It is designed specifically for Darwin (as the name suggests), and using this you can download MingGW. The current version of DarwinPorts is 1.2, and it comes in a handy installer package. Once it's installed, run the following command to update the internal list of available ports:
    $ sudo port -d selfupdate

### MinGW

The MingGW compilers and Windows API libraries let you write and compile programs for execution on the i386 system. Although you can download a copy of everything you need from the website, using DarwinPorts to download the right files for you is a better option. To download the tools needed, run the command:
    $ sudo port install i386-mingw32-gcc
This will download, configure and install the gcc cross-compiler and tools to your system. Note: this step will take a while.

### Compile Errors

As of this writing, there is a compile error when the installer executes make for the binutils package. The exact error is listed below:
    $.../work/binutils-2.15.91-20040904-1/gas/config/tc-i386.h:457: error: array type has incomplete element type
To get around this problem, change the compiler to gcc-3.3 when preparing the build.
    $ sudo gcc_select 3.3
Then, once the binutils package has compiled successfully, halt the install (Ctrl+C) (the install will fail anyway) and change the compiler back to gcc-4.0. Then the install should complete successfully.

### Testing

This is an option step. I just tested that the setup worked, by writing a Hello World! program, and running it on my Windows box. The contents of hello.c are shown below:
Then to compile, it's just like normal gcc/++:
$ i386-mingw32-gcc -o hello.exe hello.c
This produces a windows executable hello.exe that can be run natively in Windows. Note that this only tests the cross compiler setup, and not OpenXDK.

## OpenXDK

OpenXDK is a free kit for developing applications that will run on the Xbox. It contains a complete libc replacement, uses SDL for multimedia (sound and networking are not currently supported) and compiles with gcc.
You can download the latest version from SourceForge. Make sure to download the binary file OpenXDK_#_bin.zip (where # is the version). Note: although it says it's for the i386 platform, that's our target system, and OpenXDK will NOT compile (even with i386-mingw32-gcc) on the Mac.

### Cxbe

Cxbe comes with OpenXDK, and is located in the bin directory. It is responsible for converting the Windows executable into an Xbox executable. You won't be able to use the one provided, as it is for Windows.
Unfortunately, at the time of writing the Cxbe source in the OpenXDK_src package is from an older version than the compiled version in the OpenXDK_bin package. Until a workaround surfaces, we will have to send the half completed executable to a Windows box and run Cxbe there.

## Compiling

To compile C code written for the xBox, you need a lengthy flag list for the compiler. The following was adapted from the OpenXDK Website. This assumes that you have a working version of cxbe on your system.
    # installed OpenXDK path
    XDK = /usr/local/openXDK
    # cross-compiler
    CC = i386-mingw32-gcc
    # cxbe path (for post-processing)
    CXBE = $(XDK)/bin/cxbe
    SDLFLAGS = -DENABLE_XBOX -DDISABLE_CDROM
    CC_FLAGSA = -g -std=gnu99 -ffreestanding -nostdlib -fno-builtin
    CC_FLAGSB = -fno-exceptions -mno-cygwin -march=i386 $(SDLFLAGS)
    INCLUDE = -I$(XDK)/i386-pc-xbox/include -I$(XDK)/include -I$(XDK)/include/SDL
    CLINK = -nostdlib
    ALIGN = -Wl,--file-alignment,0x20 -Wl,--section-alignment,0x20
    SHARED = -shared
    ENTRYPOINT = -Wl,--entry,_WinMainCRTStartup
    STRIP = -Wl,--strip-all
    LD_FLAGS = $(CLINK) $(ALIGN) $(SHARED) $(ENTRYPOINT) $(STRIP)
    LD_DIRS = -L$(XDK)/i386-pc-xbox/lib -L$(XDK)/lib
    LD_LIBS = $(LD_DIRS) -lSDL -lopenXDK -lhal -lc -lhal -lc -lusb -lxboxkrnl
    all: default.exe
    *.o: *.c
    $(CC) $(CC_FLAGSA) $(CC_FLAGSB) $(INCLUDE) $<
    default.exe: *.o
    $(CC) -c $< -o $@ $(LD_LIBS) $(LD_FLAGS)
    $(CXBE) -TITLE:"$@" -DUMPINFO:"default.cxbe" -OUT:"default.xbe" $@ >/dev/null
    clean:
    rm -f *.o *.xbe *.cxbe *.exe

## Conclusion

While there is limited support for Xbox development on the Mac, because of the use of Linux to develop legal Xbox executables and the fact that Mac OS X is built on a flavor of Unix, it is possible to piggy-back Linux's support sources and (with slight manipulation) produce a viable solution to Mac Xbox Development.

## References

* OpenXDK: Developing

## External Links

* DarwinPorts Website
* MinGW Website
* OpenXDK Website
* Simple DirectMedia Layer (SDL) Website