# Guide to X11/Building
## Building

X11, from the reference implementation to Xorg 6.9, uses its own "imake" build system. The clients, server, and libraries are in one build tree. (It is very difficult to build only one part of the tree; the entire tree must be built.) Some things, like Mesa and Freetype, are hacked to optionally be part of the tree.
Xorg 7.0 replaces this with a set of modules based around GNU autoconf build system. This creates a complex system of packages and dependencies. Problems with implementing two systems for the simultaneous Xorg 6.9rc1 and Xorg 7.0rc1 delayed release candidate 1.

### Imake system

In order to build Xorg with imake, you first need to download and extract the source tarball. The tarball for Xorg 6.9rc1 was called xorg-x11-6.8.99.901.tar.bz2 and is available from here. Now that the final versions of Xorg 6.9 and 7.0 are available, you can find them using the list of mirrors here.
A rough outline of the build system:
* Create a "host.def" file (which is optional).
* Do "make World" to configure and build the tree.
* Do "make install" and "make install.man" to install everything.
You can use the "host.def" file to customize your build. If you do not create one, then you use the default settings, which should already be tuned to your operating system.
The file xc/BUILD describes the build in more detail.
Yes, you must build the entire tree to build one part. The exception is that sometimes you can do a server-only or server-less build. See our section on #Building a static server and xc/config/cf/xorgsite.def.

### Example build

In the following example, root has given us the write access to /usr/local/src. We downloaded Xorg 6.9 release candidate 1 (/usr/local/src/xorg-x11-6.8.99.901.tar.bz2).
We already have Xorg 6.8.2 installed. We are running it during the build, so we have multiple xterms to type shell commands in.
Using an "xterm", extract the source to /usr/local/src, creating /usr/local/src/xc:
As xc/BUILD explains, we can use lndir to create a shadow tree of symbolic links to the source. (This prevents objects from appearing in the source tree.) Because "lndir" is part of X, and we have Xorg 6.8.2 already, we can run "lndir":
Note that the current directory is /usr/local/src/xcbuild now. We will skip creating the config/cf/host.def and use the default configuration. It is now time to call the Makefile. We must run make World because there is no other correct way to configure and start the build. If we run Bourne shell:
The "xterm" running "make" is now busy. To watch the log, we run "tail" in a second xterm:
Eventually, the log announces that the build of Xorg is complete.
We install (to the default /usr/X11R6, thus overwriting most of Xorg 6.8.2):
Note:
* If we do not have "sudo" working on our system, then we would use "su".
* One can exit from X11 before doing the install. The other option is to overwrite most of X11 while it is running. This can work, but is slightly less safe.
If necessary, exit from X and run xorgcfg to make a config file.

### Building a static server

One can hack the tree to build only a static X server. This is useful if you need better hardware support from an X server in the newer version of a tree. Also, this skips over building the libraries, clients, and separate server modules. (X11 protocol is very stable, so newer servers work with older libraries and clients.)
OpenBSD provides an example host.def for that. Their example host.def is the basis of the next scenario. If you have some reason to static-build an X server, you would do something similar to the next scenario.
Scenario: We have installed Xorg 6.8.2. We need the better "ati" driver in Xorg 6.9rc0 (release candidate 0), but we need to skip most of the 6.9rc0 tree to avoid errors.
Solution: We will static-build a 6.9rc0 server.
Create this file at config/cf/host.def in the tree. If you have a shadow tree, put it in the shadow tree. The file is:
The "XF86CardDrivers" line is changed to specify only "wsfb" and "ati". Our driver is "ati". We have a second driver which avoids advanced hardware features, in case "ati" fails us. The "wsfb" driver on OpenBSD uses the kernel framebuffer instead of reconfiguring the hardware. At Linux, the framebuffer driver is "fbdev". On i386 hardware, "vga" and "vesa" might be good choices. Use one of the following lines:
Now start the build:
The build eventually stops with an error because some "XlibConf.h" is missing; our host.def is skipping that step. (This is a bug; Xorg 6.8.2 did not need an "XlibConf.h" file.) That file probably would have been generated by building libX11, which we skipped. For the server, we actually do not need it. Create an empty file at xc/lib/X11/XlibConf.h:
Now resume the build:
Eventually the build finishes. The server appears at xc/programs/Xserver/Xorg. Because this file is statically linked, it is the only file to install. We install at /usr/X11R6/bin/Xorg69 to complement our Xorg 6.8.2 installation at /usr/X11R6:
Now we need to test the server. First, if we are running X now, exit from X to the console. Then make our new server setuid root so it can use video hardware:
Generate the new config file with Xorg69 -configure, then test it with xinit -- /usr/X11R6/bin/Xorg69. If it works, make Xorg69 the default server by changing the /usr/X11R6/bin/X symbolic link:
We might want to chmod a-x /usr/X11R6/bin/Xorg to prevent anyone from using the old "Xorg" with the new config file that relies on a "Xorg69" driver.