The X.Org Modular Tree Developer's Guide
Contents
Introduction
This guide is intended to be a repository of useful information that builders and developers need to know when working on the modular X.Org source tree. As new guidelines are developed, they should be added to this doc.
A more summarized guide to building X.org is at CompileXserverManually.
Required Tools
This section lists the tools required for various people involved with the project.
Minimum requirements
The following tools are required for all builders and developers:
(click here for a per-distribution list)
An ISO/ANSI C89 compliant C compiler & libc
- For example, gcc 2.95 or newer, and glibc 2.2.4 or newer
- A C++ compiler with this subset of ISO/ANSI C++:
- TBD by someone who knows the C++ requirements
- Should only be required for libGLU, right?
- gperf needs C++ to compile!
- A subset of POSIX/UNIX API's common to Cygwin, MacOSX, and the various Unix/Linux platforms:
TBD by someone who knows the Cygwin & MacOSX requirements
- Basically Unix98
- A POSIX-compatible shell
Either pkg-config 0.18.1 or newer, or the fully compatible version from Ian Geiser and Zack Rusin that was recently changed to use the MIT license (their code will be available either as a tarball if it's maintained outside of X.Org tree or it will be added to the util module). NOTE: If you upgrade pkg-config on your system, be sure it replaces the original version and isn't installed elsewhere. For example, if the original pkg-config is in /usr/bin/pkg-config and you install a new pkg-config in /usr/local/bin/pkg-config you'll probably run into problems because the older pkg.m4 file may still inadvertantly be used.
Git, for obtaining the X.org files from the Git repository
[***] Please add any other tools required (along with their version numbers) that we expect to be required for the initial modular source tree release.
- app/twm requires some yacc variant to build (tested with bison 2.3 and flex 2.5.4)
- xserver (hw/xfree86/utils/xorgcfg) requires ncurses (tested with ncurses-devel 5.5-22)
Suggested packages
The following external dependencies are recommended for a fully functional build:
expat 1.95.8
gperf (if building xcb-util)
xcb from git://anongit.freedesktop.org/git/xcb
freetype 2.1.8 or 2.1.9. X may not link correctly against earlier versions, and has known stability issues with 2.1.10. FreeType 2.2.x breaks versions of libXfont before 1.2.0, and all current versions of fnttosfnt.
fontconfig 2.2 or newer (Currently 2.2.3 is recommended).
libpng 1.2.8.
zlib 1.1.4 or 1.2.3.
Mesa 6.5.2 (or git master/head, if building the Git master/head X.Org code). To build GLX support into the X server you must have a copy of the Mesa source available at server build time, and you must tell the server where to find it with --with-mesa-source=/path/to/mesa at configure time. Mesa 6.4.1 is required for xorg-server 1.0.1. Note that Mesa 6.4.1 and 6.4.2 will cause compile errors when building X11R7.1. Mesa 6.5 will work (for 7.1; make sure you have 6.5.2 for building 7.2).
Note especially that for using MESA's current GIT/master version (which becomes 7.1), you will need the GIT/master version of xorg-server (which becomes 1.5). 1.4-branch does not work. More information on building DRM kernel driver and MESA + DRI drivers at DRI wiki.
libdrm the current version from git will probably be needed if you're building with Mesa.
xmlto XML frontend for the XSL toolchain. Needed for libXcomposite and libXtst man pages.
gettext xgettext is needed for a few libraries.
If there is a compile error in libXFont, it is likely because libXfont-X11R7.1-1.1.0 is incompatible with recent versions of freetype2 libraries. Installing http://xorg.freedesktop.org/releases/individual/lib/libXfont-1.2.0.tar.bz2 will fix that.
If you're building Xorg with XCB support and want to use xcb-utils then you need GNU gperf 3.0.1 or newer.
We have collected various known-good versions together here.
Additional requirements for developers
In addition to the minimum requirements listed above, the following tools are required for developers:
- autoconf 2.57 or newer
- automake 1.9 or newer
- perl version 5.xx or newer
- m4 1.4 or newer
- libtool 1.5 or newer
You can check the autoconf version by running autoconf --version and similarly for the rest. As above, known-good versions are available from the extras collection.
Getting the modular tree
In this section and the next, we assume you are working in /tmp with the sources in /tmp/src and the installed tree in /tmp/modular.
From the Git repository
Note: X.Org has moved all currently maintained modules to the Git repository. See the GitPage for more information and UsingGit on how to use Git.
The git_xorg script can be used to get all the modular components from Git. The first time it is run 'git clone' is used to get the code. On subsequent runs 'git pull' is used to get only those files which have changed.
$ mkdir /tmp/src $ cd /tmp/src # Now, place the git_xorg script in this directory $ chmod a+x git_xorg.sh
The script does not download fonts, which are necessary for compilation from scratch. To download fonts, add the following line to the script.
do_dir xorg font "${font}" # this line added to get fontsThe git_xorg script gets the modules anonymously. Edit the 'gitbase' variable in the script to specify a developer/login name if you intend to check in code. For example: "git+ssh://johndoe@git.freedesktop.org/git/xorg". See the UsingGit page for more information.
Now run the script to get everything.
$ ./git_xorg.sh
The script will also check out the latest xcb source. If you do not want to do that, comment out or remove the last following line from the script:
do_dir . xcb "${xcb}"When done, you should see the following:
$ ls -F app/ data/ doc/ driver/ drm/ font/ git_xorg* lib/ pixman/ proto/ util/ xcb/ xserver/
Later, you can get the latest code for any module by running git pull in the module's directory.
From tarballs
If you are building from the release tarballs, we assume that you have downloaded the tarballs into /tmp/tarballs and will be installing everything into /tmp/modular. The tarballs for the release are arranged into a hierarchy similar to the CVS modules. For example, you can find the tarballs for each of the app module components in the app subdirectory. In addition, there is another directory called everything that contains all of the tarballs included in the other modules for convenience.
For each tarball, there are two versions: one compressed with gzip (e.g., util-macros-1.0.0.tar.gz) and one compressed with bzip2 (e.g., util-macros-1.0.0.tar.bz2). You will only need one, so to save yourself some download time, you can download either the .gz or the .bz2 files. The tarball will need to be unpacked first.
To unpack a gzipped tarball:
$ gzip -d < xorg-macros-1.0.0.tar.gz | tar xf -
To unpack a bzip2'd tarball:
$ bzip2 -d < xorg-macros-1.0.0.tar.bz2 | tar xf -
The modular tree should now be ready to build.
IMPORTANT NOTE: If you are building 7.1 from tarballs, make sure you have all of 7.0 available too. build-from-tarballs.sh relies on files that are not present in the 7.1 source release directory.
Mixing 7.1 and 7.0 tarballs
If you have obtained the everything directories from the 7.1 and the 7.0 distributions, and you have the build-from-tarballs.sh script, you can use http://wiki.x.org/wiki/x-merge.scm?action=raw to merge the files into a single directory. Note that you'll need to rename the x-merge.scm script if you download it with wget. (Tip: wget --user-agent="Mozilla/5.0" <url>)
To use, be in a directory holding the build-from-tarballs.sh file and two subdirectories 7.1 and 7.0 with the tarballs for each release, and then run guile -s x-merge.scm. You will finish up with a new subdirectory called build-dir which you can go into and then run the build-from-tarballs.sh script as explained below.
Alternatively you can edit the top of the x-merge.scm file for your own setup.
Building the modular tree
There are multiple ways to build the module components.
- using the build scripts,
- using jhbuild, or,
- by hand.
For each of these build methods, you may build either from the Git tree or the release tarballs. In the sections below we will explain how to build, install and package the modular tree components using each of these methods.
Understanding dependencies
It is important to note that the module components have dependencies either on other module components or external packages. These dependencies determine the build order that you must follow. For example, all the module components depend on the macros module component (util/macros in Git or util-macros from the pre-packaged tarballs), so it must be built before any of the other module components. The build script and jhbuild both take care of these dependencies for you.
If you insist on building the modules by hand, you must do the dependency ordering yourself. It is recommended that you inspect the build scripts to determine the proper order. This is a lot of work, so building by hand is not recommended.
Building all modules with the build scripts
The first build method uses a script to automate the build process for each module component in the order required by their various interdependencies. For details on what each of these steps are, see the Building individual module components by hand section below.
If you are building from Git and have a complete tree checked out as outlined above, then you can build using the build.sh script in the util/modular directory. There are several options for this script (see below) but the only one required is the prefix that will be passed to each module component through the --prefix= command-line option. Since many of the commands used to build module components are themselves components in the tree, your PATH needs to be set to include prefix/bin so that later components can find the programs installed by the earlier ones. For example,
Note: The build script does not currently build xcb/pthread-stubs. This package is a default requirement for xcb. You may have to edit build.sh or the xcb configuration to reflect this.
$ cd /tmp/src/ $ PATH=/tmp/modular/bin:$PATH ./util/modular/build.sh /tmp/modular
The options to the build.sh script are:
Usage: ./build.sh [options] prefix where options are: -d : run make distcheck in addition to others -D : run make dist in addition to others -c : run make clean in addition to others -m path-to-mesa-sources-for-xserver : full path to Mesa sources -n : do not quit after error; just print error message -s sudo-command : sudo command to use -r module/component : resume build at the specified component
Two of the more commonly used options are -D and -n. We recommend specifying the -D option to run make distcheck on each module component. By default the build.sh script will exit when it encounters a build failure, but with the -n command-line option, you can have the script print an error message and continue on with the next build step instead of immediately exiting.
If you want to include Mesa/OpenGL support in the X server, you will need unpack the Mesa source code and pass the directory of the Mesa sources to the build.sh script. For example, if you unpack MesaLib-6.4.1.tar.gz into /tmp/Mesa-6.4.1, then you can build the tree as follows:
$ cd /tmp/src $ PATH=/tmp/modular/bin:$PATH ./util/modular/build.sh -m /tmp/Mesa-6.4.1 -n -D /tmp/modular > build.log 2>&1
This will build the entire source tree in the appropriate build order and it will run make distcheck on each module component. If any errors occur, it will print an error message instead of exiting. You can search the log (e.g., grep '*****' build.log) to see if any errors occurred during the build.
If you are building from the released tarballs and have downloaded all of the tarballs, then you can build the release with the build-from-tarballs.sh script. You can find the most recent version of the script here.
Most of the options to this script are the same as the build.sh script described above. The options to the build-from-tarballs.sh script are:
Usage: ./build-from-tarballs.sh [options] prefix where options are: -d : run make distcheck in addition to others -D : run make dist in addition to others -c : run make clean in addition to others -m path-to-mesa-sources-for-xserver : full path to Mesa sources -n : do not quit after error; just print error message -s sudo-command : sudo command to use -bz2 : use tarballs with bzip2 compression (default) -gz : use tarballs with gzip compression -e : build from witin the 'everything' dir instead of module dirs
By default the build-from-tarballs.sh script will build the packages from the module subdirectories (e.g., app, data, doc, etc.); however, if you downloaded the everything dir instead of the individual module subdirs, then you can use the -e option to build from the everything dir. By default it will build the packages from the module subdirectories. Note that when you are building from the everything dir, you need to run the build-from-tarballs.sh script from within the everything dir, and when you are building from the module subdirs, you need to run the script from the directory containing the module subdirs.
The other important option is to specify whether you want to use the gzippped or the bzip2'd tarballs. By default it will use the bzip2 tarballs, but you can override this with the -gz option.
For example, If you have downloaded all of the gzipped tarballs in the module subdirs into /tmp/tarballs as well as the build-from-tarballs.sh script, then you can build the release as follows:
$ cd /tmp/tarballs $ PATH=/tmp/modular/bin:$PATH ./build-from-tarballs.sh -m /tmp/Mesa-6.4.1 -n -gz /tmp/modular > build.log 2>&1
Building all modules with jhbuild
The second build method uses jhbuild, a program by James Henstridge that can be used to automatically download module components from Git or from tarballs and then build them in the correct dependency order.
JhBuildInstructions explains how to build the modular tree from Git/CVS or from the tarballs.
Building individual module components by hand
The third build method is to do everything manually. This is especially useful when you already have a modular Xorg installed and only want to build some newer modules from source. See below for more information.
As noted above, everything depends on the Xorg m4 macros, so we will explain how to build it first.
If you are building from Git and followed the instructions above, you have a modular tree ready to use in /tmp/src, the macros module components can be built, installed and packaged as follows:
$ cd /tmp/src/util/macros $ ./autogen.sh --prefix=/tmp/modular $ make $ make install
The first step above ./autogen.sh --prefix=/tmp/modular does two things: it creates the configure script and then it runs it using the command line options given to autogen.sh. This will create all of the Makefile's used to build, install and package the files. The --prefix=/tmp/modular option is a standard configuration option to tell the autotools where to install the files. This is very similar to defining ProjectRoot in your host.def file for monolithic tree builds. By default, the prefix is /usr/local, but since we are installing everything in /tmp/modular, we must override it with the --prefix option. There are many other configure options (some of which are unique to each individual module component). You can list these configure options by running ./configure --help after running autogen.sh to create the configure script.
Normally, the make step would build everything in that module from the source files. For modules like app or lib, this step will build the application or library from the sources. However, for the macros module component, there is nothing to build, since the m4 macro files are simple text files that need to be installed. make it will say that there is nothing to be done. This is normal for components that only need to install.
The next step is to install the files we built in the previous step. make install will create the directories in /tmp/modular as needed and then install the macros.
If you are building from the tarballs, then you must first unpack the util-macros tarball using the methods listed in the previous section, and then the package can built and installed as follows:
$ cd util-macros-1.0.0 $ ./configure --prefix=/tmp/modular $ make $ make install
The first step is to change to the directory that you just unpacked the util-macros tarball to. Note that the directory you change to can easily be determined from the tarball name. For example, if the tarball is named package-1.2.3.tar.gz, then the directory to change to is package-1.2.3.
The second step is very similar to the ./autogen.sh step when building from Git. In this case, it is not necessary to run autogen.sh since the configure script was already built when the package was created. The options to the configure script are the same as the ones used if building from Git. Also, as noted above, there are many options to configure, which can be listed by running ./configure --help. The remaining two steps will build and install the package as described above when building from Git.
Before building subsequent modules, two environment variables need to be set:
$ export PKG_CONFIG_PATH=/tmp/modular/lib/pkgconfig $ export ACLOCAL="aclocal -I /tmp/modular/share/aclocal"
Subsequent module components can now be built by running:
$ cd theComponentDirectory $ ./autogen.sh --prefix=/tmp/modular ### or if using tarballs: ./configure --prefix=/tmp/module $ make $ make install
If you're missing any dependencies you'll get an error message during the configuration stage.
You'll generally want to start with the 'low-level' proto and lib modules before building the xserver. See the build.sh script for a detailed build ordering for the components.
For larger components such as libX11 and the X server you may need additional autogen/configure options. After running autogen.sh you may want to run ./configure --help to see if there's other important options. You might also look at the build.sh script for other tips.
Building only specific modules
If you already have a modular Xorg installed you don't need to rebuild everything from source. If, for example, you only want to work with a specific driver module there is no need to rebuild all the libraries, fonts, documentation etc.
Assuming that a modular Xorg comes with your distribution, make sure that you have the development packages installed. They provide SDK headers and pkgconfig files.
Driver module ABIs may have changed since the Xorg version that you have installed. For example, the video driver ABI changed between Xorg 7.0 and 7.1. In that case, in order to build and test a new video driver module, you would have to build and install a new version of the Xserver first. That, in turn, probably requires updated versions of a few proto-packages. Running autogen.sh or configure will tell you which versions of which modules you are missing.
Compiling after updates
If you update your source code with git pull to get the latest changes you can often recompile the module by just running make (and make install). If the changes are more extensive (files added/removed) you'll need to re-run autogen.sh or configure first.
Making tarballs
As part of the development process, it's important to create tarballs to be sure things work properly.
Creating the packages for the various components is very easy with the autotools — simply run make dist or make distcheck. We always recommend using distcheck since it will both create the package as well as test it to make sure that it works properly. It can also run a testsuite, if one is available for it. Since the configure.ac file has been set up to build both gzip and bzip2 tarballs, the packages created are util-macros-1.0.0.tar.gz and util-macros-1.0.0.tar.bz2 in the example above.
Note that if you are only interested in using the component and not actually developing it, then you can skip this step, but for all developers, this step is required.
Standard configuration options
The standard configure script options (passed to ./configure or ./autogen.sh) are:
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print `checking...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or `..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--datadir=DIR read-only architecture-independent data [PREFIX/share]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--infodir=DIR info documentation [PREFIX/info]
--mandir=DIR man documentation [PREFIX/man]
Program names:
--program-prefix=PREFIX prepend PREFIX to installed program names
--program-suffix=SUFFIX append SUFFIX to installed program names
--program-transform-name=PROGRAM run sed PROGRAM on installed program namesMore information about the configure script can be found from the autoconf info pages.
Using the modular tree
This section describes how to use the newly compiled X libraries, programs and X server.
X libraries
The X libraries which are built will be in /tmp/modular/lib/.
To use them you have to configure the linker to find them. On GNU/Linux systems you do:
export LD_LIBRARY_PATH=/tmp/modular/lib
Alternately, you might edit the /etc/ld.so.conf file and run ldconfig. There may be other ways to configure the linker on other systems.
Once this is done X applications should use the newly compiled libraries.
X applications
The X client programs which are built will be found in /tmp/modular/bin/. Generally, these programs can be run directly in the normal way.
Running the X server
The X server needs to be SUID root. This should happen automatically if you tell the build script to use sudo, but if make install runs as a normal user then this won't happen automatically. To do this:
$ su Password: <enter your root password here> # chown root /tmp/modular/bin/Xorg # chmod 4711 /tmp/modular/bin/Xorg # exit
To run the new X server you can use the startx program:
XXX Verify this is correct
startx -- /tmp/modular/bin/Xorg
Crosscompiling
There is a separate page dedicated to issues around CrossCompilingXorg.
New Modules
When adding modules to the tree, you may want to read the NewModuleGuidelines.


