This page is an attempt to describe the process require to build the modular X.org tree using a crosscompiler. The majority of this document will assume that the reader already has a fully functioning crosscompiler on the build system that can create binaries for the host system. Build and host are the standard terms used by autoconfig to describe the system where the programs will be built (build) and the system where the programs will run (host). It would seem that the system where the programs will run should be called target, but that term carries a different meaning in autoconfig. Target is the system for which a compiler (e.g., your crosscompiler) will generate code. Correct use of this terminology will help the process, trust me!
For crosscompilers targeting Linux systems, crosstool is a good choice.
In addition to a crosscompiler, some libraries and headers for the host system must also be available. These can either be crosscompiled or copied from the host system. At a minimum, the following are required:
The below instructions assume CROSS_COMPILE is set to your toolchain (e.g. export CROSS_COMPILE=arm-none-linux-gnueabi- ) and DISCIMAGE is set to where you want to install. They also assume a Debian/Ubuntu based system - update as appropriate.
Install zlib
mkdir ~/sources; cd ~/sources
apt-get source zlib
cd zlib*
AR=${CROSS_COMPILE}ar CC=${CROSS_COMPILE}gcc RANLIB=${CROSS_COMPILE}ranlib ./configure --prefix=$DISCIMAGE/usr/local/
make
make install
Install libpng
cd ~/sources
apt-get source libpng
cd libpng*
LDFLAGS="-L$DISCIMAGE/usr/local/lib" CPPFLAGS="-I$DISCIMAGE/usr/local/include" ./configure --prefix=$DISCIMAGE/usr --host=${CROSS_COMPILE%-}
make
make install
Install expat
cd ~/sources
apt-get source expat
cd expat*
AR=${CROSS_COMPILE}ar CC=${CROSS_COMPILE}gcc ./configure --prefix=$DISCIMAGE/usr/local/ --host=${CROSS_COMPILE%-}
make
make install
Install openssl(For SHA-1)
cd ~/sources
wget http://www.openssl.org/source/openssl-0.9.8h.tar.gz
tar -zxvf openssl-0.9.8h.tar.gz
cd openssl*
./Configure dist --prefix=$DISCIMAGE/usr/local
make CC="${CROSS_COMPILE}gcc" AR="${CROSS_COMPILE}ar r" RANLIB="${CROSS_COMPILE}ranlib"
make CC="${CROSS_COMPILE}gcc" AR="${CROSS_COMPILE}ar r" RANLIB="${CROSS_COMPILE}ranlib" install
Install jhbuild, on build machine (This isn't needed, but makes life easier)
svn co http://svn.gnome.org/svn/jhbuild/trunk jhbuild
cd jhbuild
./autogen.sh
make -f Makefile.plain install
TODO: Other dependencies are needed depending on what you are doing. Please update these instructions if you need to install them.
Copy and modify the example ~/.jhbuildrc file at CrossCompilingXorgJhbuild and then run
jhbuild xserver
X should now cross compile. General Jhbuild instructions are given at JhBuildInstructions. Feel free to mention any problems that you've come across here, along with solutions if you have them.
This is not necessary if you use JHBuild to build. However if you do not want to, you will have to configure and build manually. Below are some general instructions to help you.
To enable crosscompiling the --host and --build flags must be passed to configure. If the build.sh script is being used, this can be done by setting CONFFLAGS. Both of these flags take a standard autoconfig system description. For example, to build on an x86-64 system running Linux for a PowerPC system running also running Linux, CONFFLAGS should be set to "--build x86_64-unknown-linux-gnu --host powerpc-unknown-linux-gnu". Based on these settings, the configure scripts will assume that the crosscompiler is named powerpc-unknown-linux-gnu-gcc and is in the path. If the compiler named something different, the name must be providied via the CC environment variable. The C++ compiler (CXX), linker (LD), ranlib (RANLIB), and ar (AR) must also be provided in this manner.
Some components need to build and run programs on the build system that generate output used in the build process. For this compnents, CC_FOR_BUILD must be set to the name of the compiler that targets the build system. The majority of these components do not correctly use CC_FOR_BUILD, but there is a patch (see below) available.
A number of steps in the autoconfig process implicitly assume that the build system and the host system are the same. For example, library components want to build and run test programs to determine the behavior of certain host system elements. This is clearly impossible when crosscompiling. To work around these issues, the --enable-malloc0returnsnull (or --disable-malloc0returnsnull, depending on the host system) must be passed to configure.
In addition, the configure scripts for the video drivers use methods for detecting the availability of DRI that are incompatible with crosscompiling. Until a fix is provided, drivers must either be built on the host system or --disable-dri must be provided to their configure scripts. The issue in the drivers' configure scripts does not effect the core X server.
The -h and -b options to build.sh supply the --host and --build options to the configure scripts automatically. In addition, the value passed to -h is used in operation system and processor architecture based determinations of which drivers to build. The modifications to build.sh are based on the build.sh script that I use, but they have not been completely tested. If you encounter problems, please post to the xorg mailing list.